<?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.17 (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-01" category="std" consensus="true" obsoletes="8941" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title>Structured Field Values for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-sfbis-01"/>
    <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; <xref target="changes"/> lists changes.</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 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 error handling, this should be explicitly specified.</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>
    </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"/>), or a Boolean (<xref target="boolean"/>). 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 -- including when calling another algorithm -- the entire field value MUST be ignored (i.e., treated as if the field were not present in the section). This is intentionally strict, to improve interoperability and safety, and specifications referencing this document 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>Parse input_number as an integer and let output_number be the product of the result and sign.</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>Parse input_number as a decimal number and let output_number be the product of the result and sign.</li>
              </ol>
            </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-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </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>
      </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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
+KDgfwG0p/7+etMAAA==

-->

</rfc>
