<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.6.1 (Ruby 3.0.3) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-retrofit-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.2 -->
  <front>
    <title abbrev="Retrofit Structured Fields">Retrofit Structured Fields for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-retrofit-00"/>
    <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
      <organization/>
      <address>
        <postal>
          <postalLine>Prahran</postalLine>
          <postalLine>Australia</postalLine>
        </postal>
        <email>mnot@mnot.net</email>
        <uri>https://www.mnot.net/</uri>
      </address>
    </author>
    <date/>
    <keyword>structured fields</keyword>
    <keyword>http</keyword>
    <abstract>
      <t>This specification defines how a selection of existing HTTP fields can be handled as Structured Fields.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-retrofit/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/retrofit"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Structured Field Values for HTTP <xref target="STRUCTURED-FIELDS"/> introduced a data model with associated parsing and serialisation algorithms for use by new HTTP field values. Header fields that are defined as Structured Fields can realise a number of benefits, including:</t>
      <ul spacing="normal">
        <li>Improved interoperability and security: precisely defined parsing and serialisation algorithms are typically not available for fields defined with just ABNF and/or prose.</li>
        <li>Reuse of common implementations: many parsers for other fields are specific to a single field or a small family of fields</li>
        <li>Canonical form: because a deterministic serialisation algorithm is defined for each type, Structure Fields have a canonical representation</li>
        <li>Enhanced API support: a regular data model makes it easier to expose field values as a native data structure in implementations</li>
        <li>Alternative serialisations: While <xref target="STRUCTURED-FIELDS"/> defines a textual serialisation of that data model, other, more efficient serialisations of the underlying data model are also possible.</li>
      </ul>
      <t>However, a field needs to be defined as a Structured Field for these benefits to be realised. Many existing fields are not, making up the bulk of header and trailer fields seen in HTTP traffic on the Internet.</t>
      <t>This specification defines how a selection of existing HTTP fields can be handled as Structured Fields, so that these benefits can be realised -- thereby making them Retrofit Structured Fields.</t>
      <t>It does so using two techniques. <xref target="compatible"/> lists compatible fields -- those that can be handled as if they were Structured Fields due to the similarity of their defined syntax to that in Structured Fields. <xref target="mapped"/> lists mapped fields -- those whose syntax needs to be transformed into an underlying data model which is then mapped into that defined by Structured Fields.</t>
      <t>While implementations can parse and serialise Compatible Fields as Structured Fields subject to the caveats in <xref target="compatible"/>, a sender cannot generate mapped fields from <xref target="mapped"/> and expect them to be understood and acted upon by the recipient without prior negotiation. This specification does not define such a mechanism.</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT",
"RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as
shown here.</t>
      </section>
    </section>
    <section anchor="compatible">
      <name>Compatible Fields</name>
      <t>HTTP fields with the following names can usually have their values handled as Structured Fields according to the listed parsing and serialisation algorithms in <xref target="STRUCTURED-FIELDS"/>, subject to the listed caveats.</t>
      <t>The listed types are chosen for compatibility with the defined syntax of the field as well as with actual Internet traffic (see <xref target="numbers"/>). However, not all instances of these fields will successfully parse. This might be because the field value is clearly invalid, or it might be because it is valid but not parseable as a Structured Field.</t>
      <t>An application using this specification will need to consider how to handle such field values. Depending on its requirements, it might be advisable to reject such values, treat them as opaque strings, or attempt to recover a structured value from them in an ad hoc fashion.</t>
      <ul spacing="normal">
        <li>Accept - List</li>
        <li>Accept-Encoding - List</li>
        <li>Accept-Language - List</li>
        <li>Accept-Patch - List</li>
        <li>Accept-Ranges - List</li>
        <li>Access-Control-Allow-Credentials - Item</li>
        <li>Access-Control-Allow-Headers - List</li>
        <li>Access-Control-Allow-Methods - List</li>
        <li>Access-Control-Allow-Origin - Item</li>
        <li>Access-Control-Expose-Headers - List</li>
        <li>Access-Control-Max-Age - Item</li>
        <li>Access-Control-Request-Headers - List</li>
        <li>Access-Control-Request-Method - Item</li>
        <li>Age - Item</li>
        <li>Allow - List</li>
        <li>ALPN - List</li>
        <li>Alt-Svc - Dictionary</li>
        <li>Alt-Used - Item</li>
        <li>Cache-Control - Dictionary</li>
        <li>Connection - List</li>
        <li>Content-Encoding - List</li>
        <li>Content-Language - List</li>
        <li>Content-Length - List</li>
        <li>Content-Type - Item</li>
        <li>Cross-Origin-Resource-Policy - Item</li>
        <li>Expect - Item</li>
        <li>Expect-CT - Dictionary</li>
        <li>Host - Item</li>
        <li>Keep-Alive - Dictionary</li>
        <li>Origin - Item</li>
        <li>Pragma - Dictionary</li>
        <li>Prefer - Dictionary</li>
        <li>Preference-Applied - Dictionary</li>
        <li>Retry-After - Item</li>
        <li>Surrogate-Control - Dictionary</li>
        <li>TE - List</li>
        <li>Timing-Allow-Origin: List</li>
        <li>Trailer - List</li>
        <li>Transfer-Encoding - List</li>
        <li>Vary - List</li>
        <li>X-Content-Type-Options - Item</li>
        <li>X-Frame-Options - Item</li>
        <li>X-XSS-Protection - List</li>
      </ul>
      <t>Note the following caveats:</t>
      <dl>
        <dt>
Parameter names:  </dt>
        <dd>
          <t>HTTP parameter names are case-insensitive (as per <xref section="5.6.6" sectionFormat="of" target="HTTP"/>), but Structured Fields require them to be all-lowercase. Although the vast majority of parameters seen in typical traffic are all-lowercase, compatibility can be improved by force-lowercasing parameters when encountered.</t>
        </dd>
        <dt>
Empty Field Values:  </dt>
        <dd>
          <t>Empty and whitespace-only field values are considered errors in Structured Fields. For compatible fields, an empty field indicates that the field should be silently ignored.</t>
        </dd>
        <dt>
Alt-Svc:  </dt>
        <dd>
          <t>Some ALPN tokens (e.g., <tt>h3-Q43</tt>) do not conform to key's syntax. Since the final version of HTTP/3 uses the <tt>h3</tt> token, this shouldn't be a long-term issue, although future tokens may again violate this assumption.</t>
        </dd>
        <dt>
Cache-Control, Expect-CT, Pragma, Prefer, Preference-Applied, Surrogate-Control:  </dt>
        <dd>
          <t>These Dictionary-based fields consider the key to be case-insensitive, but Structured Fields requires keys to be all-lowercase. Although the vast majority of values seen in typical traffic are all-lowercase, compatibility can be improved by force-lowercasing these Dictionary keys when encountered.</t>
        </dd>
        <dt>
Content-Length:  </dt>
        <dd>
          <t>Content-Length is defined as a List because it is not uncommon for implementations to mistakenly send multiple values. See <xref section="8.6" sectionFormat="of" target="HTTP"/> for handling requirements.</t>
        </dd>
        <dt>
Retry-After:  </dt>
        <dd>
          <t>Only the delta-seconds form of Retry-After is supported; a Retry-After value containing a http-date will need to be either converted into delta-seconds or represented as a raw value.</t>
        </dd>
      </dl>
    </section>
    <section anchor="mapped">
      <name>Mapped Fields</name>
      <t>Some HTTP fields can have their values represented in Structured Fields by mapping them into its data types and then serialising the result using an alternative field name.</t>
      <t>For example, the Date HTTP header field carries a string representing a date:</t>
      <sourcecode type="http-message"><![CDATA[
Date: Sun, 06 Nov 1994 08:49:37 GMT
]]></sourcecode>
      <t>Its value is more efficiently represented as an integer number of delta seconds from the Unix epoch (00:00:00 UTC on 1 January 1970, minus leap seconds). Thus, the example above would be mapped as:</t>
      <sourcecode type="http-message"><![CDATA[
SF-Date: 784072177
]]></sourcecode>
      <t>As in <xref target="compatible"/>, these fields are unable to represent values that are not parseable, and so an application using this specification will need to how to support such values. Typically, handling them using the original field name is sufficient.</t>
      <t>Each field name listed below indicates a replacement field name and a means of mapping its original value into a Structured Field.</t>
      <section anchor="urls">
        <name>URLs</name>
        <t>The following field names (paired with their replacement field names) have values that can be represented as Structured Fields by considering the original field's value as a string.</t>
        <ul spacing="normal">
          <li>Content-Location - SF-Content-Location</li>
          <li>Location - SF-Location</li>
          <li>Referer - SF-Referer</li>
        </ul>
        <t>For example, a Location field could be represented as:</t>
        <sourcecode type="http-message"><![CDATA[
SF-Location: "https://example.com/foo"
]]></sourcecode>
      </section>
      <section anchor="dates">
        <name>Dates</name>
        <t>The following field names (paired with their replacement field names) have values that can be represented as Structured Fields by parsing their payload according to <xref section="5.6.7" sectionFormat="of" target="HTTP"/> and representing the result as an integer number of seconds delta from the Unix Epoch (00:00:00 UTC on 1 January 1970, minus leap seconds).</t>
        <ul spacing="normal">
          <li>Date - SF-Date</li>
          <li>Expires - SF-Expires</li>
          <li>If-Modified-Since - SF-IMS</li>
          <li>If-Unmodified-Since - SF-IUS</li>
          <li>Last-Modified - SF-LM</li>
        </ul>
        <t>For example, an Expires field could be represented as:</t>
        <sourcecode type="http-message"><![CDATA[
SF-Expires: 1571965240
]]></sourcecode>
      </section>
      <section anchor="etags">
        <name>ETags</name>
        <t>The field value of the ETag header field can be represented as a String Structured Field by representing the entity-tag as a string, and the weakness flag as a boolean "w" parameter on it, where true indicates that the entity-tag is weak; if 0 or unset, the entity-tag is strong.</t>
        <t>For example:</t>
        <sourcecode type="http-message"><![CDATA[
SF-ETag: "abcdef"; w=?1
]]></sourcecode>
        <t>If-None-Match's field value can be represented as SF-INM, which is a List of the structure described above.</t>
        <t>For example:</t>
        <sourcecode type="http-message"><![CDATA[
SF-INM: "abcdef"; w=?1, "ghijkl"
]]></sourcecode>
      </section>
      <section anchor="links">
        <name>Links</name>
        <t>The field value of the Link header field <xref target="RFC8288"/> can be represented in the SF-Link List Structured Field by representing the URI-Reference as a string, and link-param as parameters.</t>
        <t>For example:</t>
        <sourcecode type="http-message"><![CDATA[
SF-Link: "/terms"; rel="copyright"; anchor="#foo"
]]></sourcecode>
      </section>
      <section anchor="cookies">
        <name>Cookies</name>
        <t>The field values of the Cookie and Set-Cookie fields <xref target="RFC6265"/> can be represented in the SF-Cookie Structured Field (a List) and SF-Set-Cookie Structured Field (a Dictionary), respectively.</t>
        <t>In each case, cookie names are serialized as tokens, whereas their values are serialised as Strings, unless they can be represented accurately and unambiguously using the textual representation of another structured types (e.g., an Integer or Decimal).</t>
        <t>Set-Cookie parameters map to parameters on the appropriate SF-Set-Cookie member, with the parameter name being forced to lowercase. Set-Cookie parameter values are Strings unless a specific type is defined. This specification defines the following parameter types:</t>
        <ul spacing="normal">
          <li>Max-Age: Integer</li>
          <li>Secure: Boolean</li>
          <li>HttpOnly: Boolean</li>
          <li>SameSite: Token</li>
        </ul>
        <t>Note that cookies in both fields are separated by commas, not semicolons, and multiple cookies can appear in each field.</t>
        <t>For example:</t>
        <sourcecode type="http-message"><![CDATA[
SF-Set-Cookie: lang=en-US; expires="Wed, 09 Jun 2021 10:18:14 GMT";
               samesite=Strict
SF-Cookie: SID=31d4d96e407aad42, lang=en-US
]]></sourcecode>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Please add the following note to the HTTP Field Name Registry:</t>
      <ul empty="true">
        <li>
          <t>The "Structured Type" column indicates the type of the field as per RFC8941, if any, and may be "Dictionary", "List" or "Item". A prefix of "*" indicates that it is a retrofit type (i.e., not natively Structured); see [this specification].</t>
        </li>
      </ul>
      <t>Then, add a new column, "Structured Type", with the values from <xref target="compatible"/> assigned to the nominated registrations, prefixing each with "*" to indicate that it is a retrofit type.</t>
      <t>Then, add the following field names into the HTTP Field Name Registry, with the corresponding Structured Type as indicated, a status of "permanent" and referring to this document:</t>
      <ul spacing="normal">
        <li>SF-Content-Location - String</li>
        <li>SF-Location - String</li>
        <li>SF-Referer - String</li>
        <li>SF-Date - Integer</li>
        <li>SF-Expires - Integer</li>
        <li>SF-IMS - Integer</li>
        <li>SF-IUS - Integer</li>
        <li>SF-LM - Integer</li>
        <li>SF-ETag - Item</li>
        <li>SF-INM - List</li>
        <li>SF-Link - List</li>
        <li>SF-Set-Cookie - Dictionary</li>
        <li>SF-Cookie - List</li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t><xref target="compatible"/> identifies existing HTTP fields that can be parsed and serialised with the algorithms defined in <xref target="STRUCTURED-FIELDS"/>. Variances from other implementations might be exploitable, particularly if they allow an attacker to target one implementation in a chain (e.g., an intermediary). However, given the considerable variance in parsers already deployed, convergence towards a single parsing algorithm is likely to have a net security benefit in the longer term.</t>
      <t><xref target="mapped"/> defines alternative representations of existing fields. Because downstream consumers might interpret the message differently based upon whether they recognise the alternative representation, implementations are prohibited from generating such fields unless they have negotiated support for them with their peer. This specification does not define such a mechanism, but any such definition needs to consider the implications of doing so carefully.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="HTTP">
        <front>
          <title>HTTP Semantics</title>
          <author fullname="Roy T. Fielding">
            <organization>Adobe</organization>
          </author>
          <author fullname="Mark Nottingham">
            <organization>Fastly</organization>
          </author>
          <author fullname="Julian Reschke">
            <organization>greenbytes GmbH</organization>
          </author>
          <date day="12" month="September" year="2021"/>
          <abstract>
            <t>   The Hypertext Transfer Protocol (HTTP) is a stateless application-
   level protocol for distributed, collaborative, hypertext information
   systems.  This document describes the overall architecture of HTTP,
   establishes common terminology, and defines aspects of the protocol
   that are shared by all versions.  In this definition are core
   protocol elements, extensibility mechanisms, and the "http" and
   "https" Uniform Resource Identifier (URI) schemes.

   This document updates RFC 3864 and obsoletes RFC 2818, RFC 7231, RFC
   7232, RFC 7233, RFC 7235, RFC 7538, RFC 7615, RFC 7694, and portions
   of RFC 7230.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-semantics-19"/>
      </reference>
      <reference anchor="STRUCTURED-FIELDS">
        <front>
          <title>Structured Field Values for HTTP</title>
          <author fullname="M. Nottingham" initials="M." surname="Nottingham">
            <organization/>
          </author>
          <author fullname="P-H. Kamp" initials="P-H." surname="Kamp">
            <organization/>
          </author>
          <date month="February" year="2021"/>
          <abstract>
            <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8941"/>
        <seriesInfo name="DOI" value="10.17487/RFC8941"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba">
            <organization/>
          </author>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8288">
        <front>
          <title>Web Linking</title>
          <author fullname="M. Nottingham" initials="M." surname="Nottingham">
            <organization/>
          </author>
          <date month="October" year="2017"/>
          <abstract>
            <t>This specification defines a model for the relationships between resources on the Web ("links") and the type of those relationships ("link relation types").</t>
            <t>It also defines the serialisation of such links in HTTP headers with the Link header field.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8288"/>
        <seriesInfo name="DOI" value="10.17487/RFC8288"/>
      </reference>
      <reference anchor="RFC6265">
        <front>
          <title>HTTP State Management Mechanism</title>
          <author fullname="A. Barth" initials="A." surname="Barth">
            <organization/>
          </author>
          <date month="April" year="2011"/>
          <abstract>
            <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="6265"/>
        <seriesInfo name="DOI" value="10.17487/RFC6265"/>
      </reference>
    </references>
    <section anchor="numbers">
      <name>Data Supporting Field Compatibility</name>
      <t>To help guide decisions about compatible fields, the HTTP response headers captured by the HTTP Archive <eref target="https://httparchive.org">https://httparchive.org</eref> in September 2021 (representing more than 528,000,000 HTTP exchanges) were parsed as Structured Fields using the types listed in <xref target="compatible"/>, with the indicated number of successful header instances, failures, and the resulting failure rate:</t>
      <artwork><![CDATA[
accept                                 9,099 /        34 =   0.372%*
accept-encoding                      116,708 /        58 =   0.050%*
accept-language                      127,710 /        95 =   0.074%*
accept-patch                             281 /         0 =   0.000%
accept-ranges                    289,341,375 /     7,776 =   0.003%
access-control-allow-credentials  36,159,371 /     2,671 =   0.007%
access-control-allow-headers      25,980,519 /    23,181 =   0.089%
access-control-allow-methods      32,071,437 /    17,424 =   0.054%
access-control-allow-origin      165,719,859 /   130,247 =   0.079%
access-control-expose-headers     20,787,683 /     1,973 =   0.009%
access-control-max-age             9,549,494 /     9,846 =   0.103%
access-control-request-headers       165,882 /       503 =   0.302%*
access-control-request-method        346,135 /    30,680 =   8.142%*
age                              107,395,872 /    36,649 =   0.034%
allow                                579,822 /       281 =   0.048%
alt-svc                           56,773,977 / 4,914,119 =   7.966%
cache-control                    395,402,834 / 1,146,080 =   0.289%
connection                       112,017,641 /     3,491 =   0.003%
content-encoding                 225,568,224 /       237 =   0.000%
content-language                   3,339,291 /     1,744 =   0.052%
content-length                   422,415,406 /       126 =   0.000%
content-type                     503,950,894 /   507,133 =   0.101%
cross-origin-resource-policy     102,483,430 /       799 =   0.001%
expect                                     0 /        53 = 100.000%*
expect-ct                         54,129,244 /    80,333 =   0.148%
host                                  57,134 /     1,486 =   2.535%*
keep-alive                        50,606,877 /     1,509 =   0.003%
origin                                32,438 /     1,396 =   4.126%*
pragma                            66,321,848 /    97,328 =   0.147%
preference-applied                       189 /         0 =   0.000%
referrer-policy                   14,274,787 /     8,091 =   0.057%
retry-after                          523,533 /     7,585 =   1.428%
surrogate-control                    282,846 /       976 =   0.344%
te                                         1 /         0 =   0.000%
timing-allow-origin               91,979,983 /         8 =   0.000%
trailer                                1,171 /         0 =   0.000%
transfer-encoding                 15,098,518 /         0 =   0.000%
vary                             246,483,644 /    69,607 =   0.028%
x-content-type-options           166,063,072 /   237,255 =   0.143%
x-frame-options                   56,863,322 / 1,014,464 =   1.753%
x-xss-protection                 132,739,109 /   347,133 =   0.261%
]]></artwork>
      <t>Note that this data set only includes response headers, although some request headers are present, indicated with an asterisk (because, the Web). Also, Dictionary and Parameter keys have not been force-lowercased, with the result that any values containing uppercase keys are considered to fail.</t>
      <t>The top thirty header fields in that data set that were not considered compatible are (* indicates that the field is mapped in <xref target="mapped"/>):</t>
      <ul spacing="normal">
        <li>*date: 524,810,577</li>
        <li>server: 470,777,294</li>
        <li>*last-modified: 383,437,099</li>
        <li>*expires: 292,109,781</li>
        <li>*etag: 255,788,799</li>
        <li>strict-transport-security: 111,993,787</li>
        <li>x-cache: 70,713,258</li>
        <li>via: 55,983,914</li>
        <li>cf-ray: 54,556,881</li>
        <li>p3p: 54,479,183</li>
        <li>report-to: 54,056,804</li>
        <li>cf-cache-status: 53,536,789</li>
        <li>nel: 44,815,769</li>
        <li>x-powered-by: 37,281,354</li>
        <li>content-security-policy-report-only: 33,104,387</li>
        <li>*location: 30,533,957</li>
        <li>x-amz-cf-pop: 28,549,182</li>
        <li>x-amz-cf-id: 28,444,359</li>
        <li>content-security-policy: 25,404,401</li>
        <li>x-served-by: 23,277,252</li>
        <li>x-cache-hits: 21,842,899</li>
        <li>*link: 20,761,372</li>
        <li>x-timer: 18,780,130</li>
        <li>content-disposition: 18,516,671</li>
        <li>x-request-id: 16,048,668</li>
        <li>referrer-policy: 15,596,734</li>
        <li>x-cdn: 10,153,756</li>
        <li>x-amz-version-id: 9,786,024</li>
        <li>x-amz-request-id: 9,680,689</li>
        <li>x-dc: 9,557,728</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
/waJsIm4Q0MAAA==

-->

</rfc>
