Skip to content

Commit

Permalink
SignedExchangeEnvelope::Parse() supports b3 format parsing
Browse files Browse the repository at this point in the history
Bug: 919420
Change-Id: I96b8079359ed0b069c54bb20dbe54c603ffca426
Reviewed-on: https://chromium-review.googlesource.com/c/1401932
Commit-Queue: Kouhei Ueno <kouhei@chromium.org>
Reviewed-by: Kunihiko Sakamoto <ksakamoto@chromium.org>
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#621480}
  • Loading branch information
nyaxt authored and Commit Bot committed Jan 10, 2019
1 parent 1b0dc7a commit 698ccc0
Show file tree
Hide file tree
Showing 5 changed files with 221 additions and 166 deletions.
69 changes: 41 additions & 28 deletions content/browser/web_package/signed_exchange_envelope.cc
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ bool ParseResponseMap(const cbor::Value& value,

// static
base::Optional<SignedExchangeEnvelope> SignedExchangeEnvelope::Parse(
SignedExchangeVersion version,
const signed_exchange_utils::URLWithRawString& fallback_url,
base::StringPiece signature_header_field,
base::span<const uint8_t> cbor_header,
Expand All @@ -367,39 +368,51 @@ base::Optional<SignedExchangeEnvelope> SignedExchangeEnvelope::Parse(
cbor::Reader::ErrorCodeToString(error)));
return base::nullopt;
}
if (!value->is_array()) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy,
base::StringPrintf(
"Expected top-level Value to be an array. Actual type : %d",
static_cast<int>(value->type())));
return base::nullopt;
}

const cbor::Value::ArrayValue& top_level_array = value->GetArray();
constexpr size_t kTopLevelArraySize = 2;
if (top_level_array.size() != kTopLevelArraySize) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy,
base::StringPrintf("Expected top-level array to have 2 elements. "
"Actual element count: %" PRIuS,
top_level_array.size()));
return base::nullopt;
}

SignedExchangeEnvelope ret;
ret.set_cbor_header(cbor_header);
ret.set_request_url(request_url);

if (!ParseRequestMap(top_level_array[0], &ret, devtools_proxy)) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy, "Failed to parse request map.");
return base::nullopt;
}
if (!ParseResponseMap(top_level_array[1], &ret, devtools_proxy)) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy, "Failed to parse response map.");
return base::nullopt;
// TODO(crbug.com/919424) Remove support for kB2.
if (version == SignedExchangeVersion::kB2) {
if (!value->is_array()) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy,
base::StringPrintf(
"Expected top-level Value to be an array. Actual type : %d",
static_cast<int>(value->type())));
return base::nullopt;
}

const cbor::Value::ArrayValue& top_level_array = value->GetArray();
constexpr size_t kTopLevelArraySize = 2;
if (top_level_array.size() != kTopLevelArraySize) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy,
base::StringPrintf("Expected top-level array to have 2 elements. "
"Actual element count: %" PRIuS,
top_level_array.size()));
return base::nullopt;
}

if (!ParseRequestMap(top_level_array[0], &ret, devtools_proxy)) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy, "Failed to parse request map.");
return base::nullopt;
}
if (!ParseResponseMap(top_level_array[1], &ret, devtools_proxy)) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy, "Failed to parse response map.");
return base::nullopt;
}
} else {
ret.set_request_method("GET");

if (!ParseResponseMap(*value, &ret, devtools_proxy)) {
signed_exchange_utils::ReportErrorAndTraceEvent(
devtools_proxy, "Failed to parse response map.");
return base::nullopt;
}
}

base::Optional<std::vector<SignedExchangeSignatureHeaderField::Signature>>
Expand Down
1 change: 1 addition & 0 deletions content/browser/web_package/signed_exchange_envelope.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class CONTENT_EXPORT SignedExchangeEnvelope {
// This also performs the steps 1, 3 and 4 of "Cross-origin trust" validation.
// https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cross-origin-trust
static base::Optional<SignedExchangeEnvelope> Parse(
SignedExchangeVersion version,
const signed_exchange_utils::URLWithRawString& fallback_url,
base::StringPiece signature_header_field,
base::span<const uint8_t> cbor_header,
Expand Down
Loading

0 comments on commit 698ccc0

Please sign in to comment.