| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ALTERNATE_SIGNED_EXCHANGE_RESOURCE_INFO_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ALTERNATE_SIGNED_EXCHANGE_RESOURCE_INFO_H_ |
| |
| #include "base/macros.h" |
| #include "base/optional.h" |
| #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h" |
| #include "third_party/blink/renderer/core/core_export.h" |
| #include "third_party/blink/renderer/platform/weborigin/kurl.h" |
| #include "third_party/blink/renderer/platform/weborigin/kurl_hash.h" |
| #include "third_party/blink/renderer/platform/wtf/hash_map.h" |
| #include "third_party/blink/renderer/platform/wtf/hash_set.h" |
| #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" |
| #include "third_party/blink/renderer/platform/wtf/vector.h" |
| |
| namespace blink { |
| |
| enum class ResourceType : uint8_t; |
| |
| // AlternateSignedExchangeResourceInfo keeps the alternate signed exchange |
| // resource information which is extracted from "alternate" link headers in the |
| // outer response and "allowed-alt-sxg" link headers in the inner response while |
| // handling a signed exchange. |
| // Example: |
| // - In outer response: |
| // link: <https://distributor.example/publisher.example/image_jpeg.sxg>; |
| // rel="alternate"; |
| // type="application/signed-exchange;v=b3"; |
| // variants-04="accept;image/jpeg;image/webp"; |
| // variant-key-04="image/jpeg"; |
| // anchor="https://publisher.example/image"; |
| // - In inner response: |
| // link: <https://publisher.example/image>; |
| // rel="allowed-alt-sxg"; |
| // variants-04="accept;image/jpeg;image/webp"; |
| // variant-key-04="image/jpeg"; |
| // header-integrity="sha256-MEUCID..." |
| // - The |alternative_resources_| will be like this: |
| // { |
| // "https://publisher.example/image": [{ |
| // anchor_url: "https://publisher.example/image", |
| // alternative_url: |
| // "https://distributor.example/publisher.example/image_jpeg.sxg", |
| // header_integrity: "sha256-MEUCID...", |
| // variants: "accept;image/jpeg;image/webp", |
| // variant_key: "image/jpeg" |
| // }] |
| // } |
| // Note: When a valid "allowed-alt-sxg" link header exists in the inner response |
| // but there is no matching "alternate" link header in the outer response, this |
| // class keep the information with an invalid |alternative_url|. |
| // |
| // AlternateSignedExchangeResourceInfo is used only when |
| // SignedExchangeSubresourcePrefetch is enabled. |
| class CORE_EXPORT AlternateSignedExchangeResourceInfo { |
| public: |
| class CORE_EXPORT Entry { |
| public: |
| Entry(const KURL& anchor_url, |
| const KURL& alternative_url, |
| const String& header_integrity, |
| const String& variants, |
| const String& variant_key) |
| : anchor_url_(anchor_url), |
| alternative_url_(alternative_url), |
| header_integrity_(header_integrity), |
| variants_(variants), |
| variant_key_(variant_key) {} |
| const KURL& anchor_url() const { return anchor_url_; } |
| const KURL& alternative_url() const { return alternative_url_; } |
| const String& header_integrity() const { return header_integrity_; } |
| const String& variants() const { return variants_; } |
| const String& variant_key() const { return variant_key_; } |
| |
| private: |
| const KURL anchor_url_; |
| const KURL alternative_url_; |
| const String header_integrity_; |
| const String variants_; |
| const String variant_key_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Entry); |
| }; |
| |
| using EntryMap = |
| HashMap<KURL /* anchor_url */, Vector<std::unique_ptr<Entry>>>; |
| |
| static std::unique_ptr<AlternateSignedExchangeResourceInfo> CreateIfValid( |
| const String& outer_link_header, |
| const String& inner_link_header); |
| |
| AlternateSignedExchangeResourceInfo(EntryMap alternative_resources); |
| ~AlternateSignedExchangeResourceInfo() = default; |
| |
| // Returns the best matching alternate resource. If the first entry which |
| // |anchor_url| is |url| has non-null |variants| value, this method use the |
| // preference order of the result of "Cache Behaviour" [1] to find the best |
| // matching entry. Otherwise returns the first entry which |anchor_url| is |
| // |url|. |
| // [1] |
| // https://httpwg.org/http-extensions/draft-ietf-httpbis-variants.html#cache |
| Entry* FindMatchingEntry(const KURL& url, |
| base::Optional<ResourceType> resource_type, |
| const Vector<String>& languages) const; |
| Entry* FindMatchingEntry(const KURL& url, |
| mojom::RequestContextType request_context, |
| const Vector<String>& languages) const; |
| |
| private: |
| friend class AlternateSignedExchangeResourceInfoTest; |
| |
| Entry* FindMatchingEntry(const KURL& url, |
| const char* accept_header, |
| const Vector<String>& languages) const; |
| |
| const EntryMap alternative_resources_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AlternateSignedExchangeResourceInfo); |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ALTERNATE_SIGNED_EXCHANGE_RESOURCE_INFO_H_ |