diff options
Diffstat (limited to 'chromium/content/browser/web_package/signed_exchange_header.h')
-rw-r--r-- | chromium/content/browser/web_package/signed_exchange_header.h | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/chromium/content/browser/web_package/signed_exchange_header.h b/chromium/content/browser/web_package/signed_exchange_header.h index c83df578810..7c31a43806f 100644 --- a/chromium/content/browser/web_package/signed_exchange_header.h +++ b/chromium/content/browser/web_package/signed_exchange_header.h @@ -8,8 +8,15 @@ #include <map> #include <string> +#include "base/callback_forward.h" +#include "base/containers/span.h" +#include "base/optional.h" #include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "content/browser/web_package/signed_exchange_header_parser.h" +#include "content/browser/web_package/signed_exchange_utils.h" #include "content/common/content_export.h" +#include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" #include "url/gurl.h" @@ -17,13 +24,36 @@ namespace content { // SignedExchangeHeader contains all information captured in signed exchange // envelope but the payload. -// https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html +// https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html class CONTENT_EXPORT SignedExchangeHeader { public: + static constexpr size_t kEncodedHeaderLengthInBytes = 3; + // Parse big-endian encoded length of the following CBOR-encoded + // signed exchange header. + // Note: |input| must be pointing to a valid memory address that has at least + // |kEncodedHeaderLengthInBytes|. + static size_t ParseHeadersLength(base::span<const uint8_t> input); + + using HeaderMap = std::map<std::string, std::string>; + + // Parse headers from the application/signed-exchange;v=b0 format. + // https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#application-signed-exchange + // + // This also performs the step 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<SignedExchangeHeader> Parse( + base::span<const uint8_t> input, + const signed_exchange_utils::LogCallback& error_message_callback); SignedExchangeHeader(); + SignedExchangeHeader(const SignedExchangeHeader&); + SignedExchangeHeader(SignedExchangeHeader&&); + SignedExchangeHeader& operator=(SignedExchangeHeader&&); ~SignedExchangeHeader(); - void AddResponseHeader(base::StringPiece name, base::StringPiece value); + // AddResponseHeader returns false on duplicated keys. |name| must be + // lower-cased. + bool AddResponseHeader(base::StringPiece name, base::StringPiece value); + scoped_refptr<net::HttpResponseHeaders> BuildHttpResponseHeaders() const; const GURL& request_url() const { return request_url_; }; void set_request_url(GURL url) { request_url_ = std::move(url); } @@ -36,8 +66,14 @@ class CONTENT_EXPORT SignedExchangeHeader { net::HttpStatusCode response_code() const { return response_code_; } void set_response_code(net::HttpStatusCode c) { response_code_ = c; } - const std::map<std::string, std::string>& response_headers() const { - return response_headers_; + const HeaderMap& response_headers() const { return response_headers_; } + + const SignedExchangeHeaderParser::Signature& signature() const { + return signature_; + } + void SetSignatureForTesting( + const SignedExchangeHeaderParser::Signature& sig) { + signature_ = sig; } private: @@ -45,7 +81,8 @@ class CONTENT_EXPORT SignedExchangeHeader { std::string request_method_; net::HttpStatusCode response_code_; - std::map<std::string, std::string> response_headers_; + HeaderMap response_headers_; + SignedExchangeHeaderParser::Signature signature_; }; } // namespace content |