<?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-rfc version 1.6.26 (Ruby 3.1.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-sfbis-02" category="std" consensus="true" obsoletes="8941" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.0 -->
  <front>
    <title>Structured Field Values for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-sfbis-02"/>
    <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
      <organization>Cloudflare</organization>
      <address>
        <postal>
          <city>Prahran</city>
          <region>VIC</region>
          <country>Australia</country>
        </postal>
        <email>mnot@mnot.net</email>
        <uri>https://www.mnot.net/</uri>
      </address>
    </author>
    <author initials="P.-H." surname="Kamp" fullname="Poul-Henning Kamp">
      <organization>The Varnish Cache Project</organization>
      <address>
        <email>phk@varnish-cache.org</email>
      </address>
    </author>
    <date/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>
    <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>
      <t>This document obsoletes RFC 8941.</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-sfbis/"/>.
      </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/header-structure"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Specifying the syntax of new HTTP header (and trailer) fields is an onerous task; even with the guidance in <xref section="16.3.2" sectionFormat="of" target="HTTP"/>, there are many decisions -- and pitfalls -- for a prospective HTTP field author.</t>
      <t>Once a field is defined, bespoke parsers and serializers often need to be written, because each field value has a slightly different handling of what looks like common syntax.</t>
      <t>This document introduces a set of common data structures for use in definitions of new HTTP field values to address these problems. In particular, it defines a generic, abstract model for them, along with a concrete serialization for expressing that model in HTTP <xref target="HTTP"/> header and trailer fields.</t>
      <t>An HTTP field that is defined as a "Structured Header" or "Structured Trailer" (if the field can be either, it is a "Structured Field") uses the types defined in this specification to define its syntax and basic handling rules, thereby simplifying both its definition by specification writers and handling by implementations.</t>
      <t>Additionally, future versions of HTTP can define alternative serializations of the abstract model of these structures, allowing fields that use that model to be transmitted more efficiently without being redefined.</t>
      <t>Note that it is not a goal of this document to redefine the syntax of existing HTTP fields; the mechanisms described herein are only intended to be used with fields that explicitly opt into them.</t>
      <t><xref target="specify"/> describes how to specify a Structured Field.</t>
      <t><xref target="types"/> defines a number of abstract data types that can be used in Structured Fields.</t>
      <t>Those abstract types can be serialized into and parsed from HTTP field values using the algorithms described in <xref target="text"/>.</t>
      <section anchor="strict">
        <name>Intentionally Strict Processing</name>
        <t>This specification intentionally defines strict parsing and serialization behaviors using step-by-step algorithms; the only error handling defined is to fail the entire operation altogether.</t>
        <t>It is designed to encourage faithful implementation and good interoperability. Therefore, an implementation that tried to be helpful by being more tolerant of input would make interoperability worse, since that would create pressure on other implementations to implement similar (but likely subtly different) workarounds.</t>
        <t>In other words, strict processing is an intentional feature of this specification; it allows non-conformant input to be discovered and corrected by the producer early and avoids both interoperability and security issues that might otherwise result.</t>
        <t>Note that as a result of this strictness, if a field is appended to by multiple parties (e.g., intermediaries or different components in the sender), an error in one party's value is likely to cause the entire field value to fail parsing.</t>
      </section>
      <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>
        <t>This document uses algorithms to specify parsing and serialization behaviors. When parsing from HTTP fields, implementations MUST have behavior that is indistinguishable from following the algorithms.</t>
        <t>For serialization to HTTP fields, the algorithms define the recommended way to produce them. Implementations MAY vary from the specified behavior so long as the output is still correctly handled by the parsing algorithm described in <xref target="text-parse"/>.</t>
      </section>
    </section>
    <section anchor="specify">
      <name>Defining New Structured Fields</name>
      <t>To specify an HTTP field as a Structured Field, its authors need to:</t>
      <ul spacing="normal">
        <li>Normatively reference this specification. Recipients and generators of the field need to know that the requirements of this document are in effect.</li>
        <li>Identify whether the field is a Structured Header (i.e., it can only be used in the header section -- the common case), a Structured Trailer (only in the trailer section), or a Structured Field (both).</li>
        <li>Specify the type of the field value; either List (<xref target="list"/>), Dictionary (<xref target="dictionary"/>), or Item (<xref target="item"/>).</li>
        <li>Define the semantics of the field value.</li>
        <li>Specify any additional constraints upon the field value, as well as the consequences when those constraints are violated.</li>
      </ul>
      <t>Typically, this means that a field definition will specify the top-level type -- List, Dictionary, or Item -- and then define its allowable types and constraints upon them. For example, a header defined as a List might have all Integer members, or a mix of types; a header defined as an Item might allow only Strings, and additionally only strings beginning with the letter "Q", or strings in lowercase. Likewise, Inner Lists (<xref target="inner-list"/>) are only valid when a field definition explicitly allows them.</t>
      <t>When parsing fails, the entire field is ignored (see <xref target="text-parse"/>); in most situations, violating field-specific constraints should have the same effect. Thus, if a header is defined as an Item and required to be an Integer, but a String is received, the field will by default be ignored. If the field requires different handling for type mismatches it should be explicitly specified, but note that field definitions cannot override how parsing failures are handled.</t>
      <t>Both Items and Inner Lists allow parameters as an extensibility mechanism; this means that values can later be extended to accommodate more information, if need be. To preserve forward compatibility, field specifications are discouraged from defining the presence of an unrecognized parameter as an error condition.</t>
      <t>To further assure that this extensibility is available in the future, and to encourage consumers to use a complete parser implementation, a field definition can specify that "grease" parameters be added by senders. A specification could stipulate that all parameters that fit a defined pattern are reserved for this use and then encourage them to be sent on some portion of requests. This helps to discourage recipients from writing a parser that does not account for Parameters.</t>
      <t>Specifications that use Dictionaries can also allow for forward compatibility by requiring that the presence of -- as well as value and type associated with -- unknown members be ignored. Subsequent specifications can then add additional members, specifying constraints on them as appropriate.</t>
      <t>An extension to a Structured Field can then require that an entire field value be ignored by a recipient that understands the extension if constraints on the value it defines are not met.</t>
      <t>A field definition cannot relax the requirements of this specification because doing so would preclude handling by generic software; they can only add additional constraints (for example, on the numeric range of Integers and Decimals, the format of Strings and Tokens, the types allowed in a Dictionary's values, or the number of Items in a List). Likewise, field definitions can only use this specification for the entire field value, not a portion thereof.</t>
      <t>This specification defines minimums for the length or number of various structures supported by implementations. It does not specify maximum sizes in most cases, but authors should be aware that HTTP implementations do impose various limits on the size of individual fields, the total number of fields, and/or the size of the entire header or trailer section.</t>
      <t>Specifications can refer to a field name as a "structured header name", "structured trailer name", or "structured field name" as appropriate. Likewise, they can refer its field value as a "structured header value", "structured trailer value", or "structured field value" as necessary.</t>
      <t>For example, a fictitious Foo-Example header field might be specified as:</t>
      <blockquote>
        <t>42. Foo-Example Header</t>
        <t>The Foo-Example HTTP header field conveys information about how
much Foo the message has.</t>
        <t>Foo-Example is an Item Structured Header [RFC8941]. Its value MUST be
an Integer (Section 3.3.1 of [RFC8941]).</t>
        <t>Its value indicates the amount of Foo in the message, and it MUST
be between 0 and 10, inclusive; other values MUST cause
the entire header field to be ignored.</t>
        <t>The following parameter is defined:</t>
        <ul>
          <li>A parameter whose key is "foourl", and whose value is a String
  (Section 3.3.3 of [RFC8941]), conveying the Foo URL
  for the message. See below for processing requirements.</li>
        </ul>
        <t>"foourl" contains a URI-reference (Section 4.1 of [RFC3986]). If
its value is not a valid URI-reference, the entire header field
MUST be ignored. If its value is a relative reference (Section 4.2
of [RFC3986]), it MUST be resolved (Section 5 of [RFC3986]) before
being used.</t>
        <t>For example:</t>
        <artwork><![CDATA[
  Foo-Example: 2; foourl="https://foo.example.com/"
]]></artwork>
      </blockquote>
      <t>Note that because the definition of a Structured Field references a specific RFC for Structured Fields, the types available for use in its value are limited to those defined in that RFC. For example, a field whose definition references this document can have a value that uses the Date type (<xref target="date"/>), whereas a field whose definition references RFC 8941 cannot, because it will be treated as invalid (and therefore discarded) by implementations of that specification.</t>
      <t>Also note that this limitation also applies to future extensions to a field; for example, a field that is defined with reference to RFC 8941 cannot use the Date type, because some recipients might still be using an RFC 8941 parser to process it.</t>
      <t>However, this document is designed to be backwards-compatible with RFC 8941; a parser that implements the requirements here can also parse valid Structured Fields whose definitions reference RFC 8941.</t>
      <t>The effect of upgrading a Structured Fields implementation is that some field values that were invalid according to RFC 8941 might become valid when processed.  For instance, though it would not be valid for a field defined against RFC 8941, a field might include include a Date value. An RFC 8941 implementation would reject the entire field, whereas an updated Structured Field implementation might permit the value. In some cases, the resulting Date value will be rejected by field-specific logic, but values in fields that are otherwise ignored (such as extension parameters) might not be detected and the field might subsequently be accepted and processed.</t>
    </section>
    <section anchor="types">
      <name>Structured Data Types</name>
      <t>This section defines the abstract types for Structured Fields, and summarises how those types are serialised into textual HTTP fields.</t>
      <t>In summary:</t>
      <ul spacing="normal">
        <li>There are three top-level types that an HTTP field can be defined as: Lists, Dictionaries, and Items.</li>
        <li>Lists and Dictionaries are containers; their members can be Items or Inner Lists (which are themselves arrays of Items).</li>
        <li>Both Items and Inner Lists can be Parameterized with key/value pairs.</li>
      </ul>
      <section anchor="list">
        <name>Lists</name>
        <t>Lists are arrays of zero or more members, each of which can be an Item (<xref target="item"/>) or an Inner List (<xref target="inner-list"/>), both of which can be Parameterized (<xref target="param"/>).</t>
        <t>An empty List is denoted by not serializing the field at all. This implies that fields defined as Lists have a default empty value.</t>
        <t>When serialised as a textual HTTP field, each member is separated by a comma and optional whitespace. For example, a field whose value is defined as a List of Tokens could look like:</t>
        <sourcecode type="http-message"><![CDATA[
Example-List: sugar, tea, rum
]]></sourcecode>
        <t>Note that Lists can have their members split across multiple lines of the same header or trailer section, as per <xref section="5.3" sectionFormat="of" target="HTTP"/>; for example, the following are equivalent:</t>
        <sourcecode type="http-message"><![CDATA[
Example-List: sugar, tea, rum
]]></sourcecode>
        <t>and</t>
        <sourcecode type="http-message"><![CDATA[
Example-List: sugar, tea
Example-List: rum
]]></sourcecode>
        <t>However, individual members of a List cannot be safely split between lines; see <xref target="text-parse"/> for details.</t>
        <t>Parsers MUST support Lists containing at least 1024 members. Field specifications can constrain the types and cardinality of individual List values as they require.</t>
        <section anchor="inner-list">
          <name>Inner Lists</name>
          <t>An Inner List is an array of zero or more Items (<xref target="item"/>). Both the individual Items and the Inner List itself can be Parameterized (<xref target="param"/>).</t>
          <t>When serialised in a textual HTTP field, Inner Lists are denoted by surrounding parenthesis, and their values are delimited by one or more spaces. A field whose value is defined as a List of Inner Lists of Strings could look like:</t>
          <sourcecode type="http-message"><![CDATA[
Example-List: ("foo" "bar"), ("baz"), ("bat" "one"), ()
]]></sourcecode>
          <t>Note that the last member in this example is an empty Inner List.</t>
          <t>A header field whose value is defined as a List of Inner Lists with Parameters at both levels could look like:</t>
          <sourcecode type="http-message"><![CDATA[
Example-List: ("foo"; a=1;b=2);lvl=5, ("bar" "baz");lvl=1
]]></sourcecode>
          <t>Parsers MUST support Inner Lists containing at least 256 members. Field specifications can constrain the types and cardinality of individual Inner List members as they require.</t>
        </section>
        <section anchor="param">
          <name>Parameters</name>
          <t>Parameters are an ordered map of key-value pairs that are associated with an Item (<xref target="item"/>) or Inner List (<xref target="inner-list"/>). The keys are unique within the scope of the Parameters they occur within, and the values are bare items (i.e., they themselves cannot be parameterized; see <xref target="item"/>).</t>
          <t>Implementations MUST provide access to Parameters both by index and by key. Specifications MAY use either means of accessing them.</t>
          <t>Note that parameters are ordered, and parameter keys cannot contain uppercase letters.</t>
          <t>When serialised in a textual HTTP field, a Parameter is separated from its Item or Inner List and other Parameters by a semicolon. For example:</t>
          <sourcecode type="http-message"><![CDATA[
Example-List: abc;a=1;b=2; cde_456, (ghi;jk=4 l);q="9";r=w
]]></sourcecode>
          <t>Parameters whose value is Boolean (see <xref target="boolean"/>) true MUST omit that value when serialized. For example, the "a" parameter here is true, while the "b" parameter is false:</t>
          <sourcecode type="http-message"><![CDATA[
Example-Integer: 1; a; b=?0
]]></sourcecode>
          <t>Note that this requirement is only on serialization; parsers are still required to correctly handle the true value when it appears in a parameter.</t>
          <t>Parsers MUST support at least 256 parameters on an Item or Inner List, and support parameter keys with at least 64 characters. Field specifications can constrain the order of individual parameters, as well as their values' types as required.</t>
        </section>
      </section>
      <section anchor="dictionary">
        <name>Dictionaries</name>
        <t>Dictionaries are ordered maps of key-value pairs, where the keys are short textual strings and the values are Items (<xref target="item"/>) or arrays of Items, both of which can be Parameterized (<xref target="param"/>). There can be zero or more members, and their keys are unique in the scope of the Dictionary they occur within.</t>
        <t>Implementations MUST provide access to Dictionaries both by index and by key. Specifications MAY use either means of accessing the members.</t>
        <t>As with Lists, an empty Dictionary is represented by omitting the entire field. This implies that fields defined as Dictionaries have a default empty value.</t>
        <t>Typically, a field specification will define the semantics of Dictionaries by specifying the allowed type(s) for individual members by their keys, as well as whether their presence is required or optional. Recipients MUST ignore members whose keys that are undefined or unknown, unless the field's specification specifically disallows them.</t>
        <t>When serialised as a textual HTTP field, Members are ordered as serialized and separated by a comma with optional whitespace. Member keys cannot contain uppercase characters. Keys and values are separated by "=" (without whitespace). For example:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Dict: en="Applepie", da=:w4ZibGV0w6ZydGU=:
]]></sourcecode>
        <t>Note that in this example, the final "=" is due to the inclusion of a Byte Sequence; see <xref target="binary"/>.</t>
        <t>Members whose value is Boolean (see <xref target="boolean"/>) true MUST omit that value when serialized. For example, here both "b" and "c" are true:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Dict: a=?0, b, c; foo=bar
]]></sourcecode>
        <t>Note that this requirement is only on serialization; parsers are still required to correctly handle the true Boolean value when it appears in Dictionary values.</t>
        <t>A Dictionary with a member whose value is an Inner List of Tokens:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Dict: rating=1.5, feelings=(joy sadness)
]]></sourcecode>
        <t>A Dictionary with a mix of Items and Inner Lists, some with parameters:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Dict: a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid
]]></sourcecode>
        <t>Note that Dictionaries can have their members split across multiple lines of the same header or trailer section; for example, the following are equivalent:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Dict: foo=1, bar=2
]]></sourcecode>
        <t>and</t>
        <sourcecode type="http-message"><![CDATA[
Example-Dict: foo=1
Example-Dict: bar=2
]]></sourcecode>
        <t>However, individual members of a Dictionary cannot be safely split between lines; see <xref target="text-parse"/> for details.</t>
        <t>Parsers MUST support Dictionaries containing at least 1024 key/value pairs and keys with at least 64 characters. Field specifications can constrain the order of individual Dictionary members, as well as their values' types as required.</t>
      </section>
      <section anchor="item">
        <name>Items</name>
        <t>An Item can be an Integer (<xref target="integer"/>), a Decimal (<xref target="decimal"/>), a String (<xref target="string"/>), a Token (<xref target="token"/>), a Byte Sequence (<xref target="binary"/>), a Boolean (<xref target="boolean"/>), or a Date (<xref target="date"/>). It can have associated parameters (<xref target="param"/>).</t>
        <t>For example, a header field that is defined to be an Item that is an Integer might look like:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Integer: 5
]]></sourcecode>
        <t>or with parameters:</t>
        <sourcecode type="http-message"><![CDATA[
Example-Integer: 5; foo=bar
]]></sourcecode>
        <section anchor="integer">
          <name>Integers</name>
          <t>Integers have a range of -999,999,999,999,999 to 999,999,999,999,999 inclusive (i.e., up to fifteen digits, signed), for IEEE 754 compatibility <xref target="IEEE754"/>.</t>
          <t>For example:</t>
          <sourcecode type="http-message"><![CDATA[
Example-Integer: 42
]]></sourcecode>
          <t>Integers larger than 15 digits can be supported in a variety of ways; for example, by using a String (<xref target="string"/>), a Byte Sequence (<xref target="binary"/>), or a parameter on an Integer that acts as a scaling factor.</t>
          <t>While it is possible to serialize Integers with leading zeros (e.g., "0002", "-01") and signed zero ("-0"), these distinctions may not be preserved by implementations.</t>
          <t>Note that commas in Integers are used in this section's prose only for readability; they are not valid in the wire format.</t>
        </section>
        <section anchor="decimal">
          <name>Decimals</name>
          <t>Decimals are numbers with an integer and a fractional component. The integer component has at most 12 digits; the fractional component has at most three digits.</t>
          <t>For example, a header whose value is defined as a Decimal could look like:</t>
          <sourcecode type="http-message"><![CDATA[
Example-Decimal: 4.5
]]></sourcecode>
          <t>While it is possible to serialize Decimals with leading zeros (e.g., "0002.5", "-01.334"), trailing zeros (e.g., "5.230", "-0.40"), and signed zero (e.g., "-0.0"), these distinctions may not be preserved by implementations.</t>
          <t>Note that the serialization algorithm (<xref target="ser-decimal"/>) rounds input with more than three digits of precision in the fractional component. If an alternative rounding strategy is desired, this should be specified by the header definition to occur before serialization.</t>
        </section>
        <section anchor="string">
          <name>Strings</name>
          <t>Strings are zero or more printable ASCII <xref target="RFC0020"/> characters (i.e., the range %x20 to %x7E). Note that this excludes tabs, newlines, carriage returns, etc.</t>
          <t>Unicode is not directly supported in Strings, because it causes a number of interoperability issues, and -- with few exceptions -- field values do not require it.</t>
          <t>When it is necessary for a field value to convey non-ASCII content, a Byte Sequence (<xref target="binary"/>) can be specified, along with a character encoding (preferably UTF-8 <xref target="STD63"/>).</t>
          <t>When serialised in a textual HTTP field, Strings are delimited with double quotes, using a backslash ("\") to escape double quotes and backslashes. For example:</t>
          <sourcecode type="http-message"><![CDATA[
Example-String: "hello world"
]]></sourcecode>
          <t>Note that Strings only use DQUOTE as a delimiter; single quotes do not delimit Strings. Furthermore, only DQUOTE and "\" can be escaped; other characters after "\" MUST cause parsing to fail.</t>
          <t>Parsers MUST support Strings (after any decoding) with at least 1024 characters.</t>
        </section>
        <section anchor="token">
          <name>Tokens</name>
          <t>Tokens are short textual words that begin with an alphabetic character or "*", followed by zero to many token characters, which are the same as those allowed by the "token" ABNF rule defined in <xref target="HTTP"/>, plus the ":" and "/" characters.</t>
          <t>For example:</t>
          <sourcecode type="http-message"><![CDATA[
Example-Token: foo123/456
]]></sourcecode>
          <t>Parsers MUST support Tokens with at least 512 characters.</t>
        </section>
        <section anchor="binary">
          <name>Byte Sequences</name>
          <t>Byte Sequences can be conveyed in Structured Fields.</t>
          <t>When serialised in a textual HTTP field, a Byte Sequence is delimited with colons and encoded using base64 (<xref section="4" sectionFormat="comma" target="RFC4648"/>). For example:</t>
          <sourcecode type="http-message"><![CDATA[
Example-ByteSequence: :cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==:
]]></sourcecode>
          <t>Parsers MUST support Byte Sequences with at least 16384 octets after decoding.</t>
        </section>
        <section anchor="boolean">
          <name>Booleans</name>
          <t>Boolean values can be conveyed in Structured Fields.</t>
          <t>When serialised in a textual HTTP field, a Boolean is indicated with a leading "?" character followed by a "1" for a true value or "0" for false. For example:</t>
          <sourcecode type="http-message"><![CDATA[
Example-Boolean: ?1
]]></sourcecode>
          <t>Note that in Dictionary (<xref target="dictionary"/>) and Parameter (<xref target="param"/>) values, Boolean true is indicated by omitting the value.</t>
        </section>
        <section anchor="date">
          <name>Dates</name>
          <t>Date values can be conveyed in Structured Fields.</t>
          <t>Dates have a data model that is similar to Integers, representing a (possibly negative) delta in seconds from January 1, 1970 00:00:00 UTC, excluding leap seconds.</t>
          <t>For example:</t>
          <sourcecode type="http-message-new"><![CDATA[
Example-Date: @1659578233
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="text">
      <name>Working with Structured Fields in HTTP</name>
      <t>This section defines how to serialize and parse Structured Fields in textual HTTP field values and other encodings compatible with them (e.g., in HTTP/2 <xref target="RFC9113"/> before compression with HPACK <xref target="HPACK"/>).</t>
      <section anchor="text-serialize">
        <name>Serializing Structured Fields</name>
        <t>Given a structure defined in this specification, return an ASCII string suitable for use in an HTTP field value.</t>
        <ol spacing="normal" type="1"><li>If the structure is a Dictionary or List and its value is empty (i.e., it has no members), do not serialize the field at all (i.e., omit both the field-name and field-value).</li>
          <li>If the structure is a List, let output_string be the result of running Serializing a List (<xref target="ser-list"/>) with the structure.</li>
          <li>Else, if the structure is a Dictionary, let output_string be the result of running Serializing a Dictionary (<xref target="ser-dictionary"/>) with the structure.</li>
          <li>Else, if the structure is an Item, let output_string be the result of running Serializing an Item (<xref target="ser-item"/>) with the structure.</li>
          <li>Else, fail serialization.</li>
          <li>Return output_string converted into an array of bytes, using ASCII encoding <xref target="RFC0020"/>.</li>
        </ol>
        <section anchor="ser-list">
          <name>Serializing a List</name>
          <t>Given an array of (member_value, parameters) tuples as input_list, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>Let output be an empty string.</li>
            <li>
              <t>For each (member_value, parameters) of input_list:
              </t>
              <ol spacing="normal" type="1"><li>If member_value is an array, append the result of running Serializing an Inner List (<xref target="ser-innerlist"/>) with (member_value, parameters) to output.</li>
                <li>Otherwise, append the result of running Serializing an Item (<xref target="ser-item"/>) with (member_value, parameters) to output.</li>
                <li>
                  <t>If more member_values remain in input_list:
                  </t>
                  <ol spacing="normal" type="1"><li>Append "," to output.</li>
                    <li>Append a single SP to output.</li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>Return output.</li>
          </ol>
          <section anchor="ser-innerlist">
            <name>Serializing an Inner List</name>
            <t>Given an array of (member_value, parameters) tuples as inner_list, and parameters as list_parameters, return an ASCII string suitable for use in an HTTP field value.</t>
            <ol spacing="normal" type="1"><li>Let output be the string "(".</li>
              <li>
                <t>For each (member_value, parameters) of inner_list:
                </t>
                <ol spacing="normal" type="1"><li>Append the result of running Serializing an Item (<xref target="ser-item"/>) with (member_value, parameters) to output.</li>
                  <li>If more values remain in inner_list, append a single SP to output.</li>
                </ol>
              </li>
              <li>Append ")" to output.</li>
              <li>Append the result of running Serializing Parameters (<xref target="ser-params"/>) with list_parameters to output.</li>
              <li>Return output.</li>
            </ol>
          </section>
          <section anchor="ser-params">
            <name>Serializing Parameters</name>
            <t>Given an ordered Dictionary as input_parameters (each member having a param_key and a param_value), return an ASCII string suitable for use in an HTTP field value.</t>
            <ol spacing="normal" type="1"><li>Let output be an empty string.</li>
              <li>
                <t>For each param_key with a value of param_value in input_parameters:
                </t>
                <ol spacing="normal" type="1"><li>Append ";" to output.</li>
                  <li>Append the result of running Serializing a Key (<xref target="ser-key"/>) with param_key to output.</li>
                  <li>
                    <t>If param_value is not Boolean true:
                    </t>
                    <ol spacing="normal" type="1"><li>Append "=" to output.</li>
                      <li>Append the result of running Serializing a bare Item (<xref target="ser-bare-item"/>) with param_value to output.</li>
                    </ol>
                  </li>
                </ol>
              </li>
              <li>Return output.</li>
            </ol>
          </section>
          <section anchor="ser-key">
            <name>Serializing a Key</name>
            <t>Given a key as input_key, return an ASCII string suitable for use in an HTTP field value.</t>
            <ol spacing="normal" type="1"><li>Convert input_key into a sequence of ASCII characters; if conversion fails, fail serialization.</li>
              <li>If input_key contains characters not in lcalpha, DIGIT, "_", "-", ".", or "*", fail serialization.</li>
              <li>If the first character of input_key is not lcalpha or "*", fail serialization.</li>
              <li>Let output be an empty string.</li>
              <li>Append input_key to output.</li>
              <li>Return output.</li>
            </ol>
          </section>
        </section>
        <section anchor="ser-dictionary">
          <name>Serializing a Dictionary</name>
          <t>Given an ordered Dictionary as input_dictionary (each member having a member_key and a tuple value of (member_value, parameters)), return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>Let output be an empty string.</li>
            <li>
              <t>For each member_key with a value of (member_value, parameters) in input_dictionary:
              </t>
              <ol spacing="normal" type="1"><li>Append the result of running Serializing a Key (<xref target="ser-key"/>) with member's member_key to output.</li>
                <li>
                  <t>If member_value is Boolean true:
                  </t>
                  <ol spacing="normal" type="1"><li>Append the result of running Serializing Parameters (<xref target="ser-params"/>) with parameters to output.</li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise:
                  </t>
                  <ol spacing="normal" type="1"><li>Append "=" to output.</li>
                    <li>If member_value is an array, append the result of running Serializing an Inner List (<xref target="ser-innerlist"/>) with (member_value, parameters) to output.</li>
                    <li>Otherwise, append the result of running Serializing an Item (<xref target="ser-item"/>) with (member_value, parameters) to output.</li>
                  </ol>
                </li>
                <li>
                  <t>If more members remain in input_dictionary:
                  </t>
                  <ol spacing="normal" type="1"><li>Append "," to output.</li>
                    <li>Append a single SP to output.</li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>Return output.</li>
          </ol>
        </section>
        <section anchor="ser-item">
          <name>Serializing an Item</name>
          <t>Given an Item as bare_item and Parameters as item_parameters, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>Let output be an empty string.</li>
            <li>Append the result of running Serializing a Bare Item (<xref target="ser-bare-item"/>) with bare_item to output.</li>
            <li>Append the result of running Serializing Parameters (<xref target="ser-params"/>) with item_parameters to output.</li>
            <li>Return output.</li>
          </ol>
          <section anchor="ser-bare-item">
            <name>Serializing a Bare Item</name>
            <t>Given an Item as input_item, return an ASCII string suitable for use in an HTTP field value.</t>
            <ol spacing="normal" type="1"><li>If input_item is an Integer, return the result of running Serializing an Integer (<xref target="ser-integer"/>) with input_item.</li>
              <li>If input_item is a Decimal, return the result of running Serializing a Decimal (<xref target="ser-decimal"/>) with input_item.</li>
              <li>If input_item is a String, return the result of running Serializing a String (<xref target="ser-string"/>) with input_item.</li>
              <li>If input_item is a Token, return the result of running Serializing a Token (<xref target="ser-token"/>) with input_item.</li>
              <li>If input_item is a Byte Sequence, return the result of running Serializing a Byte Sequence (<xref target="ser-binary"/>) with input_item.</li>
              <li>If input_item is a Boolean, return the result of running Serializing a Boolean (<xref target="ser-boolean"/>) with input_item.</li>
              <li>If input_item is a Date, return the result of running Serializing a Date (<xref target="ser-date"/>) with input_item.</li>
              <li>Otherwise, fail serialization.</li>
            </ol>
          </section>
        </section>
        <section anchor="ser-integer">
          <name>Serializing an Integer</name>
          <t>Given an Integer as input_integer, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>If input_integer is not an integer in the range of -999,999,999,999,999 to 999,999,999,999,999 inclusive, fail serialization.</li>
            <li>Let output be an empty string.</li>
            <li>If input_integer is less than (but not equal to) 0, append "-" to output.</li>
            <li>Append input_integer's numeric value represented in base 10 using only decimal digits to output.</li>
            <li>Return output.</li>
          </ol>
        </section>
        <section anchor="ser-decimal">
          <name>Serializing a Decimal</name>
          <t>Given a decimal number as input_decimal, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>If input_decimal is not a decimal number, fail serialization.</li>
            <li>If input_decimal has more than three significant digits to the right of the decimal point, round it to three decimal places, rounding the final digit to the nearest value, or to the even value if it is equidistant.</li>
            <li>If input_decimal has more than 12 significant digits to the left of the decimal point after rounding, fail serialization.</li>
            <li>Let output be an empty string.</li>
            <li>If input_decimal is less than (but not equal to) 0, append "-" to output.</li>
            <li>Append input_decimal's integer component represented in base 10 (using only decimal digits) to output; if it is zero, append "0".</li>
            <li>Append "." to output.</li>
            <li>If input_decimal's fractional component is zero, append "0" to output.</li>
            <li>Otherwise, append the significant digits of input_decimal's fractional component represented in base 10 (using only decimal digits) to output.</li>
            <li>Return output.</li>
          </ol>
        </section>
        <section anchor="ser-string">
          <name>Serializing a String</name>
          <t>Given a String as input_string, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>Convert input_string into a sequence of ASCII characters; if conversion fails, fail serialization.</li>
            <li>If input_string contains characters in the range %x00-1f or %x7f-ff (i.e., not in VCHAR or SP), fail serialization.</li>
            <li>Let output be the string DQUOTE.</li>
            <li>
              <t>For each character char in input_string:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>If char is "\" or DQUOTE:
                  </t>
                  <ol spacing="normal" type="1"><li>Append "\" to output.</li>
                  </ol>
                </li>
                <li>Append char to output.</li>
              </ol>
            </li>
            <li>Append DQUOTE to output.</li>
            <li>Return output.</li>
          </ol>
        </section>
        <section anchor="ser-token">
          <name>Serializing a Token</name>
          <t>Given a Token as input_token, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>Convert input_token into a sequence of ASCII characters; if conversion fails, fail serialization.</li>
            <li>If the first character of input_token is not ALPHA or "*", or the remaining portion contains a character not in tchar, ":", or "/", fail serialization.</li>
            <li>Let output be an empty string.</li>
            <li>Append input_token to output.</li>
            <li>Return output.</li>
          </ol>
        </section>
        <section anchor="ser-binary">
          <name>Serializing a Byte Sequence</name>
          <t>Given a Byte Sequence as input_bytes, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>If input_bytes is not a sequence of bytes, fail serialization.</li>
            <li>Let output be an empty string.</li>
            <li>Append ":" to output.</li>
            <li>Append the result of base64-encoding input_bytes as per <xref section="4" sectionFormat="comma" target="RFC4648"/>, taking account of the requirements below.</li>
            <li>Append ":" to output.</li>
            <li>Return output.</li>
          </ol>
          <t>The encoded data is required to be padded with "=", as per <xref section="3.2" sectionFormat="comma" target="RFC4648"/>.</t>
          <t>Likewise, encoded data SHOULD have pad bits set to zero, as per <xref section="3.5" sectionFormat="comma" target="RFC4648"/>, unless it is not possible to do so due to implementation constraints.</t>
        </section>
        <section anchor="ser-boolean">
          <name>Serializing a Boolean</name>
          <t>Given a Boolean as input_boolean, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>If input_boolean is not a boolean, fail serialization.</li>
            <li>Let output be an empty string.</li>
            <li>Append "?" to output.</li>
            <li>If input_boolean is true, append "1" to output.</li>
            <li>If input_boolean is false, append "0" to output.</li>
            <li>Return output.</li>
          </ol>
        </section>
        <section anchor="ser-date">
          <name>Serialising a Date</name>
          <t>Given a Date as input_integer, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>Let output be "@".</li>
            <li>Append to output the result of running Serializing an Integer with input_date (<xref target="ser-integer"/>).</li>
            <li>Return output.</li>
          </ol>
        </section>
      </section>
      <section anchor="text-parse">
        <name>Parsing Structured Fields</name>
        <t>When a receiving implementation parses HTTP fields that are known to be Structured Fields, it is important that care be taken, as there are a number of edge cases that can cause interoperability or even security problems. This section specifies the algorithm for doing so.</t>
        <t>Given an array of bytes as input_bytes that represent the chosen field's field-value (which is empty if that field is not present) and field_type (one of "dictionary", "list", or "item"), return the parsed header value.</t>
        <ol spacing="normal" type="1"><li>Convert input_bytes into an ASCII string input_string; if conversion fails, fail parsing.</li>
          <li>Discard any leading SP characters from input_string.</li>
          <li>If field_type is "list", let output be the result of running Parsing a List (<xref target="parse-list"/>) with input_string.</li>
          <li>If field_type is "dictionary", let output be the result of running Parsing a Dictionary (<xref target="parse-dictionary"/>) with input_string.</li>
          <li>If field_type is "item", let output be the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</li>
          <li>Discard any leading SP characters from input_string.</li>
          <li>If input_string is not empty, fail parsing.</li>
          <li>Otherwise, return output.</li>
        </ol>
        <t>When generating input_bytes, parsers MUST combine all field lines in the same section (header or trailer) that case-insensitively match the field name into one comma-separated field-value, as per <xref section="5.2" sectionFormat="of" target="HTTP"/>; this assures that the entire field value is processed correctly.</t>
        <t>For Lists and Dictionaries, this has the effect of correctly concatenating all of the field's lines, as long as individual members of the top-level data structure are not split across multiple header instances. The parsing algorithms for both types allow tab characters, since these might
be used to combine field lines by some implementations.</t>
        <t>Strings split across multiple field lines will have unpredictable results, because one or more commas (with optional whitespace) will become part of the string output by the parser. Since concatenation might be done by an upstream intermediary, the results are not under the control of the serializer or the parser, even when they are both under the control of the same party.</t>
        <t>Tokens, Integers, Decimals, and Byte Sequences cannot be split across multiple field lines because the inserted commas will cause parsing to fail.</t>
        <t>Parsers MAY fail when processing a field value spread across multiple field lines, when one of those lines does not parse as that field. For example, a parsing handling an Example-String field that's defined as an sf-string is allowed to fail when processing this field section:</t>
        <sourcecode type="http-message"><![CDATA[
Example-String: "foo
Example-String: bar"
]]></sourcecode>
        <t>If parsing fails, either the entire field value MUST be ignored (i.e., treated as if the field were not present in the section), or alternatively the complete HTTP message MUST be treated as malformed. This is intentionally strict to improve interoperability and safety, and field specifications that use Structured Fields are not allowed to loosen this requirement.</t>
        <t>Note that this requirement does not apply to an implementation that is not parsing the field; for example, an intermediary is not required to strip a failing field from a message before forwarding it.</t>
        <section anchor="parse-list">
          <name>Parsing a List</name>
          <t>Given an ASCII string as input_string, return an array of (item_or_inner_list, parameters) tuples. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>Let members be an empty array.</li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>Append the result of running Parsing an Item or Inner List (<xref target="parse-item-or-list"/>) with input_string to members.</li>
                <li>Discard any leading OWS characters from input_string.</li>
                <li>If input_string is empty, return members.</li>
                <li>Consume the first character of input_string; if it is not ",", fail parsing.</li>
                <li>Discard any leading OWS characters from input_string.</li>
                <li>If input_string is empty, there is a trailing comma; fail parsing.</li>
              </ol>
            </li>
            <li>No structured data has been found; return members (which is empty).</li>
          </ol>
          <section anchor="parse-item-or-list">
            <name>Parsing an Item or Inner List</name>
            <t>Given an ASCII string as input_string, return the tuple (item_or_inner_list, parameters), where item_or_inner_list can be either a single bare item or an array of (bare_item, parameters) tuples. input_string is modified to remove the parsed value.</t>
            <ol spacing="normal" type="1"><li>If the first character of input_string is "(", return the result of running Parsing an Inner List (<xref target="parse-innerlist"/>) with input_string.</li>
              <li>Return the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</li>
            </ol>
          </section>
          <section anchor="parse-innerlist">
            <name>Parsing an Inner List</name>
            <t>Given an ASCII string as input_string, return the tuple (inner_list, parameters), where inner_list is an array of (bare_item, parameters) tuples. input_string is modified to remove the parsed value.</t>
            <ol spacing="normal" type="1"><li>Consume the first character of input_string; if it is not "(", fail parsing.</li>
              <li>Let inner_list be an empty array.</li>
              <li>
                <t>While input_string is not empty:
                </t>
                <ol spacing="normal" type="1"><li>Discard any leading SP characters from input_string.</li>
                  <li>
                    <t>If the first character of input_string is ")":
                    </t>
                    <ol spacing="normal" type="1"><li>Consume the first character of input_string.</li>
                      <li>Let parameters be the result of running Parsing Parameters (<xref target="parse-param"/>) with input_string.</li>
                      <li>Return the tuple (inner_list, parameters).</li>
                    </ol>
                  </li>
                  <li>Let item be the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</li>
                  <li>Append item to inner_list.</li>
                  <li>If the first character of input_string is not SP or ")", fail parsing.</li>
                </ol>
              </li>
              <li>The end of the Inner List was not found; fail parsing.</li>
            </ol>
          </section>
        </section>
        <section anchor="parse-dictionary">
          <name>Parsing a Dictionary</name>
          <t>Given an ASCII string as input_string, return an ordered map whose values are (item_or_inner_list, parameters) tuples. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>Let dictionary be an empty, ordered map.</li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>Let this_key be the result of running Parsing a Key (<xref target="parse-key"/>) with input_string.</li>
                <li>
                  <t>If the first character of input_string is "=":
                  </t>
                  <ol spacing="normal" type="1"><li>Consume the first character of input_string.</li>
                    <li>Let member be the result of running Parsing an Item or Inner List (<xref target="parse-item-or-list"/>) with input_string.</li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise:
                  </t>
                  <ol spacing="normal" type="1"><li>Let value be Boolean true.</li>
                    <li>Let parameters be the result of running Parsing Parameters (<xref target="parse-param"/>) with input_string.</li>
                    <li>Let member be the tuple (value, parameters).</li>
                  </ol>
                </li>
                <li>If dictionary already contains a key this_key (comparing character for character), overwrite its value with member.</li>
                <li>Otherwise, append key this_key with value member to dictionary.</li>
                <li>Discard any leading OWS characters from input_string.</li>
                <li>If input_string is empty, return dictionary.</li>
                <li>Consume the first character of input_string; if it is not ",", fail parsing.</li>
                <li>Discard any leading OWS characters from input_string.</li>
                <li>If input_string is empty, there is a trailing comma; fail parsing.</li>
              </ol>
            </li>
            <li>No structured data has been found; return dictionary (which is empty).</li>
          </ol>
          <t>Note that when duplicate Dictionary keys are encountered, all but the last instance are ignored.</t>
        </section>
        <section anchor="parse-item">
          <name>Parsing an Item</name>
          <t>Given an ASCII string as input_string, return a (bare_item, parameters) tuple. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>Let bare_item be the result of running Parsing a Bare Item (<xref target="parse-bare-item"/>) with input_string.</li>
            <li>Let parameters be the result of running Parsing Parameters (<xref target="parse-param"/>) with input_string.</li>
            <li>Return the tuple (bare_item, parameters).</li>
          </ol>
          <section anchor="parse-bare-item">
            <name>Parsing a Bare Item</name>
            <t>Given an ASCII string as input_string, return a bare Item. input_string is modified to remove the parsed value.</t>
            <ol spacing="normal" type="1"><li>If the first character of input_string is a "-" or a DIGIT, return the result of running Parsing an Integer or Decimal (<xref target="parse-number"/>) with input_string.</li>
              <li>If the first character of input_string is a DQUOTE, return the result of running Parsing a String (<xref target="parse-string"/>) with input_string.</li>
              <li>If the first character of input_string is an ALPHA or "*", return the result of running Parsing a Token (<xref target="parse-token"/>) with input_string.</li>
              <li>If the first character of input_string is ":", return the result of running Parsing a Byte Sequence (<xref target="parse-binary"/>) with input_string.</li>
              <li>If the first character of input_string is "?", return the result of running Parsing a Boolean (<xref target="parse-boolean"/>) with input_string.</li>
              <li>If the first character of input_string is "@", return the result of running Parsing a Date (<xref target="parse-date"/>) with input_string.</li>
              <li>Otherwise, the item type is unrecognized; fail parsing.</li>
            </ol>
          </section>
          <section anchor="parse-param">
            <name>Parsing Parameters</name>
            <t>Given an ASCII string as input_string, return an ordered map whose values are bare Items. input_string is modified to remove the parsed value.</t>
            <ol spacing="normal" type="1"><li>Let parameters be an empty, ordered map.</li>
              <li>
                <t>While input_string is not empty:
                </t>
                <ol spacing="normal" type="1"><li>If the first character of input_string is not ";", exit the loop.</li>
                  <li>Consume the ";" character from the beginning of input_string.</li>
                  <li>Discard any leading SP characters from input_string.</li>
                  <li>Let param_key be the result of running Parsing a Key (<xref target="parse-key"/>) with input_string.</li>
                  <li>Let param_value be Boolean true.</li>
                  <li>
                    <t>If the first character of input_string is "=":
                    </t>
                    <ol spacing="normal" type="1"><li>Consume the "=" character at the beginning of input_string.</li>
                      <li>Let param_value be the result of running Parsing a Bare Item (<xref target="parse-bare-item"/>) with input_string.</li>
                    </ol>
                  </li>
                  <li>If parameters already contains a key param_key (comparing character for character), overwrite its value with param_value.</li>
                  <li>Otherwise, append key param_key with value param_value to parameters.</li>
                </ol>
              </li>
              <li>Return parameters.</li>
            </ol>
            <t>Note that when duplicate parameter keys are encountered, all but the last instance are ignored.</t>
          </section>
          <section anchor="parse-key">
            <name>Parsing a Key</name>
            <t>Given an ASCII string as input_string, return a key. input_string is modified to remove the parsed value.</t>
            <ol spacing="normal" type="1"><li>If the first character of input_string is not lcalpha or "*", fail parsing.</li>
              <li>Let output_string be an empty string.</li>
              <li>
                <t>While input_string is not empty:
                </t>
                <ol spacing="normal" type="1"><li>If the first character of input_string is not one of lcalpha, DIGIT, "_", "-", ".", or "*", return output_string.</li>
                  <li>Let char be the result of consuming the first character of input_string.</li>
                  <li>Append char to output_string.</li>
                </ol>
              </li>
              <li>Return output_string.</li>
            </ol>
          </section>
        </section>
        <section anchor="parse-number">
          <name>Parsing an Integer or Decimal</name>
          <t>Given an ASCII string as input_string, return an Integer or Decimal. input_string is modified to remove the parsed value.</t>
          <t>NOTE: This algorithm parses both Integers (<xref target="integer"/>) and Decimals (<xref target="decimal"/>), and returns the corresponding structure.</t>
          <ol spacing="normal" type="1"><li>Let type be "integer".</li>
            <li>Let sign be 1.</li>
            <li>Let input_number be an empty string.</li>
            <li>If the first character of input_string is "-", consume it and set sign to -1.</li>
            <li>If input_string is empty, there is an empty integer; fail parsing.</li>
            <li>If the first character of input_string is not a DIGIT, fail parsing.</li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>Let char be the result of consuming the first character of input_string.</li>
                <li>If char is a DIGIT, append it to input_number.</li>
                <li>
                  <t>Else, if type is "integer" and char is ".":
                  </t>
                  <ol spacing="normal" type="1"><li>If input_number contains more than 12 characters, fail parsing.</li>
                    <li>Otherwise, append char to input_number and set type to "decimal".</li>
                  </ol>
                </li>
                <li>Otherwise, prepend char to input_string, and exit the loop.</li>
                <li>If type is "integer" and input_number contains more than 15 characters, fail parsing.</li>
                <li>If type is "decimal" and input_number contains more than 16 characters, fail parsing.</li>
              </ol>
            </li>
            <li>
              <t>If type is "integer":
              </t>
              <ol spacing="normal" type="1"><li>Let output_number be an Integer that is the result of parsing input_number as an integer.</li>
              </ol>
            </li>
            <li>
              <t>Otherwise:
              </t>
              <ol spacing="normal" type="1"><li>If the final character of input_number is ".", fail parsing.</li>
                <li>If the number of characters after "." in input_number is greater than three, fail parsing.</li>
                <li>Let output_number be a Decimal that is the result of parsing input_number as a decimal number.</li>
              </ol>
            </li>
            <li>Let output_number be the product of output_number and sign.</li>
            <li>Return output_number.</li>
          </ol>
        </section>
        <section anchor="parse-string">
          <name>Parsing a String</name>
          <t>Given an ASCII string as input_string, return an unquoted String. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>Let output_string be an empty string.</li>
            <li>If the first character of input_string is not DQUOTE, fail parsing.</li>
            <li>Discard the first character of input_string.</li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>Let char be the result of consuming the first character of input_string.</li>
                <li>
                  <t>If char is a backslash ("\"):
                  </t>
                  <ol spacing="normal" type="1"><li>If input_string is now empty, fail parsing.</li>
                    <li>Let next_char be the result of consuming the first character of input_string.</li>
                    <li>If next_char is not DQUOTE or "\", fail parsing.</li>
                    <li>Append next_char to output_string.</li>
                  </ol>
                </li>
                <li>Else, if char is DQUOTE, return output_string.</li>
                <li>Else, if char is in the range %x00-1f or %x7f-ff (i.e., it is not in VCHAR or SP), fail parsing.</li>
                <li>Else, append char to output_string.</li>
              </ol>
            </li>
            <li>Reached the end of input_string without finding a closing DQUOTE; fail parsing.</li>
          </ol>
        </section>
        <section anchor="parse-token">
          <name>Parsing a Token</name>
          <t>Given an ASCII string as input_string, return a Token. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>If the first character of input_string is not ALPHA or "*", fail parsing.</li>
            <li>Let output_string be an empty string.</li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>If the first character of input_string is not in tchar, ":", or "/", return output_string.</li>
                <li>Let char be the result of consuming the first character of input_string.</li>
                <li>Append char to output_string.</li>
              </ol>
            </li>
            <li>Return output_string.</li>
          </ol>
        </section>
        <section anchor="parse-binary">
          <name>Parsing a Byte Sequence</name>
          <t>Given an ASCII string as input_string, return a Byte Sequence. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>If the first character of input_string is not ":", fail parsing.</li>
            <li>Discard the first character of input_string.</li>
            <li>If there is not a ":" character before the end of input_string, fail parsing.</li>
            <li>Let b64_content be the result of consuming content of input_string up to but not including the first instance of the character ":".</li>
            <li>Consume the ":" character at the beginning of input_string.</li>
            <li>If b64_content contains a character not included in ALPHA, DIGIT, "+", "/", and "=", fail parsing.</li>
            <li>Let binary_content be the result of base64-decoding <xref target="RFC4648"/> b64_content, synthesizing padding if necessary (note the requirements about recipient behavior below). If base64 decoding fails, parsing fails.</li>
            <li>Return binary_content.</li>
          </ol>
          <t>Because some implementations of base64 do not allow rejection of encoded data that is not properly "=" padded (see <xref section="3.2" sectionFormat="comma" target="RFC4648"/>), parsers SHOULD NOT fail when "=" padding is not present, unless they cannot be configured to do so.</t>
          <t>Because some implementations of base64 do not allow rejection of encoded data that has non-zero pad bits (see <xref section="3.5" sectionFormat="comma" target="RFC4648"/>), parsers SHOULD NOT fail when non-zero pad bits are present, unless they cannot be configured to do so.</t>
          <t>This specification does not relax the requirements in Sections <xref target="RFC4648" section="3.1" sectionFormat="bare"/> and <xref target="RFC4648" section="3.3" sectionFormat="bare"/> of <xref target="RFC4648"/>; therefore, parsers MUST fail on characters outside the base64 alphabet and on line feeds in encoded data.</t>
        </section>
        <section anchor="parse-boolean">
          <name>Parsing a Boolean</name>
          <t>Given an ASCII string as input_string, return a Boolean. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>If the first character of input_string is not "?", fail parsing.</li>
            <li>Discard the first character of input_string.</li>
            <li>If the first character of input_string matches "1", discard the first character, and return true.</li>
            <li>If the first character of input_string matches "0", discard the first character, and return false.</li>
            <li>No value has matched; fail parsing.</li>
          </ol>
        </section>
        <section anchor="parse-date">
          <name>Parsing a Date</name>
          <t>Given an ASCII string as input_string, return a Date. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>If the first character of input_string is not "@", fail parsing.</li>
            <li>Discard the first character of input_string.</li>
            <li>Let output_date be the result of running Parsing an Integer or Decimal (<xref target="parse-number"/>) with input_string.</li>
            <li>If output_date is a Decimal, fail parsing.</li>
            <li>Return output_date.</li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>Please add the following note to the "Hypertext Transfer Protocol (HTTP) Field Name Registry":</t>
      <ul empty="true">
        <li>
          <t>The "Structured Type" column indicates the type of the field (per RFC nnnn), if any, and may be
"Dictionary", "List" or "Item".</t>
          <t>Note that field names beginning with characters other than ALPHA or "*" will not be able to be
represented as a Structured Fields Token, and therefore may be incompatible with being mapped into
fields that refer to it.</t>
        </li>
      </ul>
      <t>Then, add a new column, "Structured Type".</t>
      <t>Then, add the indicated Structured Type for each existing registry entry listed in <xref target="existing-fields"/>.</t>
      <table anchor="existing-fields">
        <name>Existing Fields</name>
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Structured Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Accept-CH</td>
            <td align="left">List</td>
          </tr>
          <tr>
            <td align="left">Cache-Status</td>
            <td align="left">List</td>
          </tr>
          <tr>
            <td align="left">CDN-Cache-Control</td>
            <td align="left">Dictionary</td>
          </tr>
          <tr>
            <td align="left">Cross-Origin-Embedder-Policy</td>
            <td align="left">Item</td>
          </tr>
          <tr>
            <td align="left">Cross-Origin-Embedder-Policy-Report-Only</td>
            <td align="left">Item</td>
          </tr>
          <tr>
            <td align="left">Cross-Origin-Opener-Policy</td>
            <td align="left">Item</td>
          </tr>
          <tr>
            <td align="left">Cross-Origin-Opener-Policy-Report-Only</td>
            <td align="left">Item</td>
          </tr>
          <tr>
            <td align="left">Origin-Agent-Cluster</td>
            <td align="left">Item</td>
          </tr>
          <tr>
            <td align="left">Priority</td>
            <td align="left">Dictionary</td>
          </tr>
          <tr>
            <td align="left">Proxy-Status</td>
            <td align="left">List</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The size of most types defined by Structured Fields is not limited; as a result, extremely large fields could be an attack vector (e.g., for resource consumption). Most HTTP implementations limit the sizes of individual fields as well as the overall header or trailer section size to mitigate such attacks.</t>
      <t>It is possible for parties with the ability to inject new HTTP fields to change the meaning
of a Structured Field. In some circumstances, this will cause parsing to fail, but it is not possible to reliably fail in all such circumstances.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <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. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <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="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="RFC0020">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf">
              <organization/>
            </author>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC7230">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</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 provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7230"/>
          <seriesInfo name="DOI" value="10.17487/RFC7230"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date year="2019" month="July"/>
          </front>
          <seriesInfo name="IEEE" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
          <seriesInfo name="ISBN" value="978-1-5044-5924-2"/>
        </reference>
        <reference anchor="STD63" target="http://www.rfc-editor.org/info/std63">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author initials="F." surname="Yergeau" fullname="F. Yergeau">
              <organization/>
            </author>
            <date year="2003" month="November"/>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="HPACK">
          <front>
            <title>HPACK: Header Compression for HTTP/2</title>
            <author fullname="R. Peon" initials="R." surname="Peon">
              <organization/>
            </author>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan">
              <organization/>
            </author>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7541"/>
          <seriesInfo name="DOI" value="10.17487/RFC7541"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray">
              <organization/>
            </author>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray">
              <organization/>
            </author>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
      </references>
    </references>
    <section anchor="faq">
      <name>Frequently Asked Questions</name>
      <section anchor="why-not-json">
        <name>Why Not JSON?</name>
        <t>Earlier proposals for Structured Fields were based upon JSON <xref target="RFC8259"/>. However, constraining its use to make it suitable for HTTP header fields required senders and recipients to implement specific additional handling.</t>
        <t>For example, JSON has specification issues around large numbers and objects with duplicate members. Although advice for avoiding these issues is available (e.g., <xref target="RFC7493"/>), it cannot be relied upon.</t>
        <t>Likewise, JSON strings are by default Unicode strings, which have a number of potential interoperability issues (e.g., in comparison). Although implementers can be advised to avoid non-ASCII content where unnecessary, this is difficult to enforce.</t>
        <t>Another example is JSON's ability to nest content to arbitrary depths. Since the resulting memory commitment might be unsuitable (e.g., in embedded and other limited server deployments), it's necessary to limit it in some fashion; however, existing JSON implementations have no such limits, and even if a limit is specified, it's likely that some field definition will find a need to violate it.</t>
        <t>Because of JSON's broad adoption and implementation, it is difficult to impose such additional constraints across all implementations; some deployments would fail to enforce them, thereby harming interoperability. In short, if it looks like JSON, people will be tempted to use a JSON parser/serializer on field values.</t>
        <t>Since a major goal for Structured Fields is to improve interoperability and simplify implementation, these concerns led to a format that requires a dedicated parser and serializer.</t>
        <t>Additionally, there were widely shared feelings that JSON doesn't "look right" in HTTP fields.</t>
      </section>
    </section>
    <section anchor="implementation-notes">
      <name>Implementation Notes</name>
      <t>A generic implementation of this specification should expose the top-level serialize (<xref target="text-serialize"/>) and parse (<xref target="text-parse"/>) functions. They need not be functions; for example, it could be implemented as an object, with methods for each of the different top-level types.</t>
      <t>For interoperability, it's important that generic implementations be complete and follow the algorithms closely; see <xref target="strict"/>. To aid this, a common test suite is being maintained by the community at &lt;https://github.com/httpwg/structured-field-tests&gt;.</t>
      <t>Implementers should note that Dictionaries and Parameters are order-preserving maps. Some fields may not convey meaning in the ordering of these data types, but it should still be exposed so that it will be available to applications that need to use it.</t>
      <t>Likewise, implementations should note that it's important to preserve the distinction between Tokens and Strings. While most programming languages have native types that map to the other types well, it may be necessary to create a wrapper "token" object or use a parameter on functions to assure that these types remain separate.</t>
      <t>The serialization algorithm is defined in a way that it is not strictly limited to the data types defined in <xref target="types"/> in every case. For example, Decimals are designed to take broader input and round to allowed values.</t>
      <t>Implementations are allowed to limit the size of different structures, subject to the minimums defined for each type. When a structure exceeds an implementation limit, that structure fails parsing or serialization.</t>
    </section>
    <section anchor="abnf">
      <name>ABNF</name>
      <t>This section uses the Augmented Backus-Naur Form (ABNF) notation <xref target="RFC5234"/> to illustrate expected syntax of Structured Fields. In doing so, it uses the VCHAR, SP, DIGIT, ALPHA, and DQUOTE rules from <xref target="RFC5234"/>. It also includes the tchar and OWS rules from <xref target="RFC7230"/>.</t>
      <t>This section is non-normative. If there is disagreement between the parsing algorithms and ABNF, the specified algorithms take precedence.</t>
      <sourcecode type="abnf"><![CDATA[
sf-list       = list-member *( OWS "," OWS list-member )
list-member   = sf-item / inner-list

inner-list    = "(" *SP [ sf-item *( 1*SP sf-item ) *SP ] ")"
                parameters

parameters    = *( ";" *SP parameter )
parameter     = param-key [ "=" param-value ]
param-key     = key
key           = ( lcalpha / "*" )
                *( lcalpha / DIGIT / "_" / "-" / "." / "*" )
lcalpha       = %x61-7A ; a-z
param-value   = bare-item

sf-dictionary  = dict-member *( OWS "," OWS dict-member )
dict-member    = member-key ( parameters / ( "=" member-value ))
member-key     = key
member-value   = sf-item / inner-list

sf-item   = bare-item parameters
bare-item = sf-integer / sf-decimal / sf-string / sf-token
            / sf-binary / sf-boolean

sf-integer = ["-"] 1*15DIGIT

sf-decimal  = ["-"] 1*12DIGIT "." 1*3DIGIT

sf-string = DQUOTE *chr DQUOTE
chr       = unescaped / escaped
unescaped = %x20-21 / %x23-5B / %x5D-7E
escaped   = "\" ( DQUOTE / "\" )

sf-token = ( ALPHA / "*" ) *( tchar / ":" / "/" )

sf-binary = ":" *(base64) ":"
base64    = ALPHA / DIGIT / "+" / "/" / "="

sf-boolean = "?" boolean
boolean    = "0" / "1"

sf-date = "@" ["-"] 1*15DIGIT
]]></sourcecode>
    </section>
    <section anchor="changes">
      <name>Changes from RFC 8941</name>
      <t>This revision of the Structured Field Values for HTTP specification has made the following changes:</t>
      <ul spacing="normal">
        <li>Added the Date structured type. (<xref target="date"/>)</li>
        <li>Stopped encouraging use of ABNF in definitions of new structured fields. (<xref target="specify"/>)</li>
        <li>Moved ABNF to an informative appendix. (<xref target="abnf"/>)</li>
        <li>Added a "Structured Type" column to the HTTP Field Name Registry. (<xref target="iana"/>)</li>
        <li>Refined parse failure handling. (<xref target="text-parse"/>)</li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Many thanks to Matthew Kerwin for his detailed feedback and careful consideration during the development of this specification.</t>
      <t>Thanks also to Ian Clelland, Roy Fielding, Anne van Kesteren, Kazuho Oku, Evert Pot, Julian Reschke, Martin Thomson, Mike West, and Jeffrey Yasskin for their contributions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
qxadlOrBw0mEktFoc/UWKOaivKaWrnTqnF+SkXZZb3w0uLErkr28bz7nq8zR
yvJVfC0oUvS0IYeWGzFSj7noa66Rj9CZI+lI6TxvnVSK0IBdqmPkBkBCVmPM
1dQ56sKq2pyjnnu66g3+YZsPTakKWf7WTc5tZkUPGlrOLBtz0TrsDuCayd2q
omHXsjucSwaN+UxLID1XehUsU6NWys+qq32N/rFWCexn+XItmCpbtW8fO2jb
VMPXv5zfohuatPn6vkQ1lLNw59onOwTv77zZu+lYH9ZL0+116/omDLlEs11p
+e3arSy/1Oakoe0HQeLluLaIPWwSYJUk8VOhsjbE/jETDIsd16BRtww3TZLM
zcesVOGd8rrUQSoepT3eRhvaZbP5mCkYZxZvUrZMY2G5/MCSoclJumPqu81T
bofsbnRvSY9wgd9GW428vYZF+2bV4Ve13FrQogUd2ipC1saFW3DAnn2tQ/0X
O9rP4BUbDV4hgQtnGy28em9lXv1J5rTJLF0VYze7TpBtDXA4Gf24aSdR71a3
gp/6x/hlyqNbENRM9GZVjFLRQceBdHCnrg4WMxqBkhxIuxIVGqsfAh49nCw6
3DYbWLXPRi7OJfaPQ57XIb8tIsB/s671eNnvDVfSJ2hAbq96pxsTa5l/jFbk
pOM7xNZzl7aOfoRDoq5LaecruOckiZ2B6aaxfyZVnnTdRPJPIEulS6lOWBn/
P1XnW5oIL0A1V0u7efp/OA/ZawOKsJJmYrqTju6gWZigtb5wQ91Uo6BYs0El
/ZyR4TSpcFrdoCF5BVDKAapONbtT/qAspJl4401Fb/DLsiW6h12XqhroJ2uv
91dQvmvTPbh7/fvhZ+xg+4/Xv90CoaYKbk1q8piMAfeo64fLnE3ndgxLV2gV
cz+rhO62o0Q57OGiXlB6VK9frfF8U6zgCLW1Gf3N6tdnMnBbSLACu/UKE3hL
zdKEhsb8pXnLXptm0g6yprbtVSnUt7T+UZmSyT/E3gkpKZJbynIh4erGD0ei
MdXL1hrw/jlYu/w811kfJ36tui6nBoGX0lqF4Mf6Vl1KWk+iWnFJpkqBV9RW
p+DH/VbVMY5WX0OjZEEQta1owU+2XXUx366xGFvFIMtorWPwA4yrruO71deh
tQ2iSTerG3QFfsySoglkNEhktkrzaJRNU778qKbCe8zCq5Z3+dJd6+6Gi3yu
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

-->

</rfc>
