<?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.5.24 -->
<?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-nottingham-http-structure-retrofit-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" obsoletes="" updates="" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.0 -->
  <front>
    <title>Retrofit Structured Fields for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-nottingham-http-structure-retrofit-01"/>
    <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
      <organization/>
      <address>
        <postal>
          <postalLine>Prahran</postalLine>
          <postalLine>VIC</postalLine>
          <postalLine>Australia</postalLine>
        </postal>
        <email>mnot@mnot.net</email>
        <uri>https://www.mnot.net/</uri>
      </address>
    </author>
    <date/>
    <keyword>Internet-Draft</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-nottingham-http-structure-retrofit/"/>.
      </t>
      <t>
         information can be found at <eref target="https://mnot.github.io/I-D/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mnot/I-D/labels/http-structure-retrofit"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>Structured Field Values for HTTP <xref target="STRUCTURED-FIELDS" format="default"/> 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" format="default"/> 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" format="default"/> 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" format="default"/> 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" format="default"/>, a sender cannot generate mapped fields from <xref target="mapped" format="default"/> 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" numbered="true" toc="default">
        <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" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they appear in all capitals, as
shown here.</t>
      </section>
    </section>
    <section anchor="compatible" numbered="true" toc="default">
      <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" format="default"/>, 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" format="default"/>). 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" format="default"/>), 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" format="default"/> 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" numbered="true" toc="default">
      <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" format="default"/>, 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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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="7.1.1.1" sectionFormat="of" target="RFC7231" format="default"/> 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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <name>Links</name>
        <t>The field value of the Link header field <xref target="RFC8288" format="default"/> 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" numbered="true" toc="default">
        <name>Cookies</name>
        <t>The field values of the Cookie and Set-Cookie fields <xref target="RFC6265" format="default"/> 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" numbered="true" toc="default">
      <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" format="default"/> 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" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t><xref target="compatible" format="default"/> identifies existing HTTP fields that can be parsed and serialised with the algorithms defined in <xref target="STRUCTURED-FIELDS" format="default"/>. 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" format="default"/> 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="RFC7231">
        <front>
          <title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
          <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
            <organization/>
          </author>
          <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
            <organization/>
          </author>
          <date month="June" year="2014"/>
          <abstract>
            <t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7231"/>
        <seriesInfo name="DOI" value="10.17487/RFC7231"/>
      </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" numbered="true" toc="default">
      <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" format="default"/>, with the indicated number of successful header instances, failures, and the resulting failure rate:</t>
      <artwork name="" type="" align="left" alt=""><![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" format="default"/>):</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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
cSbutPffYsBtEPNCAAA=

-->

</rfc>
