summaryrefslogtreecommitdiff
path: root/chromium/content/browser/web_package/signed_exchange_header.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/web_package/signed_exchange_header.h')
-rw-r--r--chromium/content/browser/web_package/signed_exchange_header.h47
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