<?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.7.2 (Ruby 3.2.2) -->
<?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-04" category="std" consensus="true" obsoletes="8941" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title>Structured Field Values for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-sfbis-04"/>
    <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>
      <?line 84?>

<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>
    <?line 91?>

<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 the VCHAR, SP, DIGIT, ALPHA, and DQUOTE rules from <xref target="RFC5234"/> to specify characters and/or their corresponding ASCII bytes, depending on context. It uses the tchar and OWS rules from <xref target="HTTP"/> for the same purpose.</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>
          <t>Normatively reference this specification. Recipients and generators of the field need to know that the requirements of this document are in effect.</t>
        </li>
        <li>
          <t>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).</t>
        </li>
        <li>
          <t>Specify the type of the field value; either List (<xref target="list"/>), Dictionary (<xref target="dictionary"/>), or Item (<xref target="item"/>).</t>
        </li>
        <li>
          <t>Define the semantics of the field value.</t>
        </li>
        <li>
          <t>Specify any additional constraints upon the field value, as well as the consequences when those constraints are violated.</t>
        </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>Field definitions can only use this specification for the entire field value, not a portion thereof.</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>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>
      <section anchor="example">
        <name>Example</name>
        <t>A fictitious Foo-Example header field might be specified as:</t>
        <blockquote>
          <t>42. Foo-Example Header Field</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 Field [RFCnnnn]. Its value
MUST be an Integer (Section 3.3.1 of [RFCnnnn]).</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 [RFCnnnn]), 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="error-handling">
        <name>Error Handling</name>
        <t>When parsing fails, the entire field is ignored (see <xref target="text-parse"/>). Field definitions cannot override this, 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).</t>
        <t>When field-specific constraints are violated, the entire field is also ignored, unless the field definition defines other handling requirements. For example, if a header field is defined as an Item and required to be an Integer, but a String is received, it should be ignored unless that field's definition explicitly specifies otherwise.</t>
      </section>
      <section anchor="preserving-extensibility">
        <name>Preserving Extensibility</name>
        <t>Structured Fields are designed to be extensible, because experience has shown that even when it is not foreseen, it is often necessary to modify and add to the allowable syntax and semantics of a field in a controlled fashion.</t>
        <t>Both Items and Inner Lists allow Parameters as an extensibility mechanism; this means that their 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>Field specifications are required to be either an Item, List, or Dictionary to preserve extensibility. Fields that erroneously defined as another type (e.g., Integer) are assumed to be Items (i.e., they allow Parameters).</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 keys be ignored. Subsequent specifications can then add additional keys, 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>
      </section>
      <section anchor="using-new-structured-types-in-extensions">
        <name>Using New Structured Types in Extensions</name>
        <t>Because a field definition needs to reference 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>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>Upgrading a Structured Fields implementation to support a newer revision of the specification (such as this document) brings the possibility that some field values that were invalid according to the earlier RFC might become valid when processed.</t>
        <t>For example, field instance might contain a syntactically valid Date (<xref target="date"/>), even though that field's definition does not accommodate Dates. An RFC8941 implementation would fail parsing such a field instance, because they are not defined in that specification. If that implementation were upgraded to this specification, parsing would now succeed. 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>
    <section anchor="types">
      <name>Structured Data Types</name>
      <t>This section defines the abstract types for Structured Fields, and summarizes how those types are serialized into textual HTTP fields.</t>
      <t>In summary:</t>
      <ul spacing="normal">
        <li>
          <t>There are three top-level types that an HTTP field can be defined as: Lists, Dictionaries, and Items.</t>
        </li>
        <li>
          <t>Lists and Dictionaries are containers; their members can be Items or Inner Lists (which are themselves arrays of Items).</t>
        </li>
        <li>
          <t>Both Items and Inner Lists can be Parameterized with key/value pairs.</t>
        </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 serialized 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 serialized 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 serialized 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 are undefined or unknown, unless the field's specification specifically disallows them.</t>
        <t>When serialized 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 field 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>Non-ASCII characters are not directly supported in Strings, because they cause a number of interoperability issues, and -- with few exceptions -- field values do not require them.</t>
          <t>When it is necessary for a field value to convey non-ASCII content, a Display String (<xref target="displaystring"/>) can be specified.</t>
          <t>When serialized 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>
          <t>Note that Tokens are defined largely for compatibility with the data model of existing HTTP fields, and may require additional steps to use in some implementations. As a result, new fields are encouraged to use Strings.</t>
        </section>
        <section anchor="binary">
          <name>Byte Sequences</name>
          <t>Byte Sequences can be conveyed in Structured Fields.</t>
          <t>When serialized 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 serialized 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 1970-01-01T00:00:00Z, excluding leap seconds.</t>
          <t>For example:</t>
          <sourcecode type="http-message-new"><![CDATA[
Example-Date: @1659578233
]]></sourcecode>
          <t>Parsers MUST support Dates whose values include all days in years 1 to 9999 (i.e., -62,135,596,800 to 253,402,214,400 delta seconds from 1970-01-01T00:00:00Z).</t>
        </section>
        <section anchor="displaystring">
          <name>Display Strings</name>
          <t>Display Strings are similar to Strings, in that they consist of zero or more characters, but they allow Unicode content, unlike Strings.</t>
          <t>Display Strings are intended for use in cases where a value is displayed to end users, and therefore may need to carry non-ASCII content. It is NOT RECOMMENDED that they be used in situations where a String (<xref target="string"/>) or Token (<xref target="token"/>) would be adequate, because Unicode has processing considerations (e.g., normalization) and security considerations (e.g., homograph attacks) that make it more difficult to handle correctly.</t>
          <t>Note that Display Strings do not indicate the language used in the value; that can be done separately if necessary (e.g., with a parameter).</t>
          <t>For example:</t>
          <sourcecode type="http-message-new"><![CDATA[
Example-DisplayString: %"This is intended for display to %c3%bcsers."
]]></sourcecode>
          <t>See <xref target="security"/> for additional security considerations when handling Display Strings.</t>
        </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>
            <t>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).</t>
          </li>
          <li>
            <t>If the structure is a List, let output_string be the result of running Serializing a List (<xref target="ser-list"/>) with the structure.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Else, fail serialization.</t>
          </li>
          <li>
            <t>Return output_string converted into an array of bytes, using ASCII encoding <xref target="RFC0020"/>.</t>
          </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>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>For each (member_value, parameters) of input_list:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>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.</t>
                </li>
                <li>
                  <t>Otherwise, append the result of running Serializing an Item (<xref target="ser-item"/>) with (member_value, parameters) to output.</t>
                </li>
                <li>
                  <t>If more member_values remain in input_list:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Append "," to output.</t>
                    </li>
                    <li>
                      <t>Append a single SP to output.</t>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>
              <t>Return output.</t>
            </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>
                <t>Let output be the string "(".</t>
              </li>
              <li>
                <t>For each (member_value, parameters) of inner_list:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Append the result of running Serializing an Item (<xref target="ser-item"/>) with (member_value, parameters) to output.</t>
                  </li>
                  <li>
                    <t>If more values remain in inner_list, append a single SP to output.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Append ")" to output.</t>
              </li>
              <li>
                <t>Append the result of running Serializing Parameters (<xref target="ser-params"/>) with list_parameters to output.</t>
              </li>
              <li>
                <t>Return output.</t>
              </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>
                <t>Let output be an empty string.</t>
              </li>
              <li>
                <t>For each param_key with a value of param_value in input_parameters:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Append ";" to output.</t>
                  </li>
                  <li>
                    <t>Append the result of running Serializing a Key (<xref target="ser-key"/>) with param_key to output.</t>
                  </li>
                  <li>
                    <t>If param_value is not Boolean true:
                    </t>
                    <ol spacing="normal" type="1"><li>
                        <t>Append "=" to output.</t>
                      </li>
                      <li>
                        <t>Append the result of running Serializing a bare Item (<xref target="ser-bare-item"/>) with param_value to output.</t>
                      </li>
                    </ol>
                  </li>
                </ol>
              </li>
              <li>
                <t>Return output.</t>
              </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>
                <t>Convert input_key into a sequence of ASCII characters; if conversion fails, fail serialization.</t>
              </li>
              <li>
                <t>If input_key contains characters not in lcalpha, DIGIT, "_", "-", ".", or "*", fail serialization.</t>
              </li>
              <li>
                <t>If the first character of input_key is not lcalpha or "*", fail serialization.</t>
              </li>
              <li>
                <t>Let output be an empty string.</t>
              </li>
              <li>
                <t>Append input_key to output.</t>
              </li>
              <li>
                <t>Return output.</t>
              </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>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>For each member_key with a value of (member_value, parameters) in input_dictionary:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Append the result of running Serializing a Key (<xref target="ser-key"/>) with member's member_key to output.</t>
                </li>
                <li>
                  <t>If member_value is Boolean true:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Append the result of running Serializing Parameters (<xref target="ser-params"/>) with parameters to output.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Append "=" to output.</t>
                    </li>
                    <li>
                      <t>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.</t>
                    </li>
                    <li>
                      <t>Otherwise, append the result of running Serializing an Item (<xref target="ser-item"/>) with (member_value, parameters) to output.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If more members remain in input_dictionary:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Append "," to output.</t>
                    </li>
                    <li>
                      <t>Append a single SP to output.</t>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>
              <t>Return output.</t>
            </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>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>Append the result of running Serializing a Bare Item (<xref target="ser-bare-item"/>) with bare_item to output.</t>
            </li>
            <li>
              <t>Append the result of running Serializing Parameters (<xref target="ser-params"/>) with item_parameters to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </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>
                <t>If input_item is an Integer, return the result of running Serializing an Integer (<xref target="ser-integer"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a Decimal, return the result of running Serializing a Decimal (<xref target="ser-decimal"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a String, return the result of running Serializing a String (<xref target="ser-string"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a Token, return the result of running Serializing a Token (<xref target="ser-token"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a Byte Sequence, return the result of running Serializing a Byte Sequence (<xref target="ser-binary"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a Boolean, return the result of running Serializing a Boolean (<xref target="ser-boolean"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a Date, return the result of running Serializing a Date (<xref target="ser-date"/>) with input_item.</t>
              </li>
              <li>
                <t>If input_item is a Display String, return the result of running Serializing a Display String (<xref target="ser-display"/>) with input_item.</t>
              </li>
              <li>
                <t>Otherwise, fail serialization.</t>
              </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>
              <t>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.</t>
            </li>
            <li>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>If input_integer is less than (but not equal to) 0, append "-" to output.</t>
            </li>
            <li>
              <t>Append input_integer's numeric value represented in base 10 using only decimal digits to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </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>
              <t>If input_decimal is not a decimal number, fail serialization.</t>
            </li>
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>If input_decimal has more than 12 significant digits to the left of the decimal point after rounding, fail serialization.</t>
            </li>
            <li>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>If input_decimal is less than (but not equal to) 0, append "-" to output.</t>
            </li>
            <li>
              <t>Append input_decimal's integer component represented in base 10 (using only decimal digits) to output; if it is zero, append "0".</t>
            </li>
            <li>
              <t>Append "." to output.</t>
            </li>
            <li>
              <t>If input_decimal's fractional component is zero, append "0" to output.</t>
            </li>
            <li>
              <t>Otherwise, append the significant digits of input_decimal's fractional component represented in base 10 (using only decimal digits) to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </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>
              <t>Convert input_string into a sequence of ASCII characters; if conversion fails, fail serialization.</t>
            </li>
            <li>
              <t>If input_string contains characters in the range %x00-1f or %x7f-ff (i.e., not in VCHAR or SP), fail serialization.</t>
            </li>
            <li>
              <t>Let output be the string DQUOTE.</t>
            </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>
                      <t>Append "\" to output.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Append char to output.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Append DQUOTE to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </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>
              <t>Convert input_token into a sequence of ASCII characters; if conversion fails, fail serialization.</t>
            </li>
            <li>
              <t>If the first character of input_token is not ALPHA or "*", or the remaining portion contains a character not in tchar, ":", or "/", fail serialization.</t>
            </li>
            <li>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>Append input_token to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </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>
              <t>If input_bytes is not a sequence of bytes, fail serialization.</t>
            </li>
            <li>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>Append ":" to output.</t>
            </li>
            <li>
              <t>Append the result of base64-encoding input_bytes as per <xref section="4" sectionFormat="comma" target="RFC4648"/>, taking account of the requirements below.</t>
            </li>
            <li>
              <t>Append ":" to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </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>
              <t>If input_boolean is not a boolean, fail serialization.</t>
            </li>
            <li>
              <t>Let output be an empty string.</t>
            </li>
            <li>
              <t>Append "?" to output.</t>
            </li>
            <li>
              <t>If input_boolean is true, append "1" to output.</t>
            </li>
            <li>
              <t>If input_boolean is false, append "0" to output.</t>
            </li>
            <li>
              <t>Return output.</t>
            </li>
          </ol>
        </section>
        <section anchor="ser-date">
          <name>Serializing a Date</name>
          <t>Given a Date as input_date, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>
              <t>Let output be "@".</t>
            </li>
            <li>
              <t>Append to output the result of running Serializing an Integer with input_date (<xref target="ser-integer"/>).</t>
            </li>
            <li>
              <t>Return output.</t>
            </li>
          </ol>
        </section>
        <section anchor="ser-display">
          <name>Serializing a Display String</name>
          <t>Given a sequence of Unicode codepoints as input_sequence, return an ASCII string suitable for use in an HTTP field value.</t>
          <ol spacing="normal" type="1"><li>
              <t>If input_sequence is not a sequence of Unicode codepoints, fail serialization.</t>
            </li>
            <li>
              <t>Let byte_array be the result of applying UTF-8 encoding (<xref section="3" sectionFormat="of" target="UTF8"/>) to input_sequence.</t>
            </li>
            <li>
              <t>Let encoded_string be a string containing "%" followed by DQUOTE.</t>
            </li>
            <li>
              <t>For each byte in byte_array:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>If byte is %x25 ("%"), %x22 (DQUOTE), or in the ranges %x00-1f or %x7f-ff:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Append "%" to encoded_string.</t>
                    </li>
                    <li>
                      <t>Let encoded_byte be the result of applying base16 encoding (<xref section="8" sectionFormat="of" target="RFC4648"/>) to byte, with any alphabetic characters converted to lowercase.</t>
                    </li>
                    <li>
                      <t>Append encoded_byte to encoded_string.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise, decode byte as an ASCII character and append the result to encoded_string.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Append DQUOTE to encoded_string.</t>
            </li>
            <li>
              <t>Return encoded_string.</t>
            </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 field value.</t>
        <ol spacing="normal" type="1"><li>
            <t>Convert input_bytes into an ASCII string input_string; if conversion fails, fail parsing.</t>
          </li>
          <li>
            <t>Discard any leading SP characters from input_string.</t>
          </li>
          <li>
            <t>If field_type is "list", let output be the result of running Parsing a List (<xref target="parse-list"/>) with input_string.</t>
          </li>
          <li>
            <t>If field_type is "dictionary", let output be the result of running Parsing a Dictionary (<xref target="parse-dictionary"/>) with input_string.</t>
          </li>
          <li>
            <t>If field_type is "item", let output be the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</t>
          </li>
          <li>
            <t>Discard any leading SP characters from input_string.</t>
          </li>
          <li>
            <t>If input_string is not empty, fail parsing.</t>
          </li>
          <li>
            <t>Otherwise, return output.</t>
          </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 field 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>
              <t>Let members be an empty array.</t>
            </li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Append the result of running Parsing an Item or Inner List (<xref target="parse-item-or-list"/>) with input_string to members.</t>
                </li>
                <li>
                  <t>Discard any leading OWS characters from input_string.</t>
                </li>
                <li>
                  <t>If input_string is empty, return members.</t>
                </li>
                <li>
                  <t>Consume the first character of input_string; if it is not ",", fail parsing.</t>
                </li>
                <li>
                  <t>Discard any leading OWS characters from input_string.</t>
                </li>
                <li>
                  <t>If input_string is empty, there is a trailing comma; fail parsing.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>No structured data has been found; return members (which is empty).</t>
            </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>
                <t>If the first character of input_string is "(", return the result of running Parsing an Inner List (<xref target="parse-innerlist"/>) with input_string.</t>
              </li>
              <li>
                <t>Return the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</t>
              </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>
                <t>Consume the first character of input_string; if it is not "(", fail parsing.</t>
              </li>
              <li>
                <t>Let inner_list be an empty array.</t>
              </li>
              <li>
                <t>While input_string is not empty:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Discard any leading SP characters from input_string.</t>
                  </li>
                  <li>
                    <t>If the first character of input_string is ")":
                    </t>
                    <ol spacing="normal" type="1"><li>
                        <t>Consume the first character of input_string.</t>
                      </li>
                      <li>
                        <t>Let parameters be the result of running Parsing Parameters (<xref target="parse-param"/>) with input_string.</t>
                      </li>
                      <li>
                        <t>Return the tuple (inner_list, parameters).</t>
                      </li>
                    </ol>
                  </li>
                  <li>
                    <t>Let item be the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</t>
                  </li>
                  <li>
                    <t>Append item to inner_list.</t>
                  </li>
                  <li>
                    <t>If the first character of input_string is not SP or ")", fail parsing.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>The end of the Inner List was not found; fail parsing.</t>
              </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>
              <t>Let dictionary be an empty, ordered map.</t>
            </li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let this_key be the result of running Parsing a Key (<xref target="parse-key"/>) with input_string.</t>
                </li>
                <li>
                  <t>If the first character of input_string is "=":
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Consume the first character of input_string.</t>
                    </li>
                    <li>
                      <t>Let member be the result of running Parsing an Item or Inner List (<xref target="parse-item-or-list"/>) with input_string.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Let value be Boolean true.</t>
                    </li>
                    <li>
                      <t>Let parameters be the result of running Parsing Parameters (<xref target="parse-param"/>) with input_string.</t>
                    </li>
                    <li>
                      <t>Let member be the tuple (value, parameters).</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If dictionary already contains a key this_key (comparing character for character), overwrite its value with member.</t>
                </li>
                <li>
                  <t>Otherwise, append key this_key with value member to dictionary.</t>
                </li>
                <li>
                  <t>Discard any leading OWS characters from input_string.</t>
                </li>
                <li>
                  <t>If input_string is empty, return dictionary.</t>
                </li>
                <li>
                  <t>Consume the first character of input_string; if it is not ",", fail parsing.</t>
                </li>
                <li>
                  <t>Discard any leading OWS characters from input_string.</t>
                </li>
                <li>
                  <t>If input_string is empty, there is a trailing comma; fail parsing.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>No structured data has been found; return dictionary (which is empty).</t>
            </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>
              <t>Let bare_item be the result of running Parsing a Bare Item (<xref target="parse-bare-item"/>) with input_string.</t>
            </li>
            <li>
              <t>Let parameters be the result of running Parsing Parameters (<xref target="parse-param"/>) with input_string.</t>
            </li>
            <li>
              <t>Return the tuple (bare_item, parameters).</t>
            </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>
                <t>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.</t>
              </li>
              <li>
                <t>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.</t>
              </li>
              <li>
                <t>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.</t>
              </li>
              <li>
                <t>If the first character of input_string is ":", return the result of running Parsing a Byte Sequence (<xref target="parse-binary"/>) with input_string.</t>
              </li>
              <li>
                <t>If the first character of input_string is "?", return the result of running Parsing a Boolean (<xref target="parse-boolean"/>) with input_string.</t>
              </li>
              <li>
                <t>If the first character of input_string is "@", return the result of running Parsing a Date (<xref target="parse-date"/>) with input_string.</t>
              </li>
              <li>
                <t>If the first character of input_string is "%", return the result of running Parsing a Display String (<xref target="parse-display"/>) with input_string.</t>
              </li>
              <li>
                <t>Otherwise, the item type is unrecognized; fail parsing.</t>
              </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>
                <t>Let parameters be an empty, ordered map.</t>
              </li>
              <li>
                <t>While input_string is not empty:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>If the first character of input_string is not ";", exit the loop.</t>
                  </li>
                  <li>
                    <t>Consume the ";" character from the beginning of input_string.</t>
                  </li>
                  <li>
                    <t>Discard any leading SP characters from input_string.</t>
                  </li>
                  <li>
                    <t>Let param_key be the result of running Parsing a Key (<xref target="parse-key"/>) with input_string.</t>
                  </li>
                  <li>
                    <t>Let param_value be Boolean true.</t>
                  </li>
                  <li>
                    <t>If the first character of input_string is "=":
                    </t>
                    <ol spacing="normal" type="1"><li>
                        <t>Consume the "=" character at the beginning of input_string.</t>
                      </li>
                      <li>
                        <t>Let param_value be the result of running Parsing a Bare Item (<xref target="parse-bare-item"/>) with input_string.</t>
                      </li>
                    </ol>
                  </li>
                  <li>
                    <t>If parameters already contains a key param_key (comparing character for character), overwrite its value with param_value.</t>
                  </li>
                  <li>
                    <t>Otherwise, append key param_key with value param_value to parameters.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Return parameters.</t>
              </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>
                <t>If the first character of input_string is not lcalpha or "*", fail parsing.</t>
              </li>
              <li>
                <t>Let output_string be an empty string.</t>
              </li>
              <li>
                <t>While input_string is not empty:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>If the first character of input_string is not one of lcalpha, DIGIT, "_", "-", ".", or "*", return output_string.</t>
                  </li>
                  <li>
                    <t>Let char be the result of consuming the first character of input_string.</t>
                  </li>
                  <li>
                    <t>Append char to output_string.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Return output_string.</t>
              </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>
              <t>Let type be "integer".</t>
            </li>
            <li>
              <t>Let sign be 1.</t>
            </li>
            <li>
              <t>Let input_number be an empty string.</t>
            </li>
            <li>
              <t>If the first character of input_string is "-", consume it and set sign to -1.</t>
            </li>
            <li>
              <t>If input_string is empty, there is an empty integer; fail parsing.</t>
            </li>
            <li>
              <t>If the first character of input_string is not a DIGIT, fail parsing.</t>
            </li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let char be the result of consuming the first character of input_string.</t>
                </li>
                <li>
                  <t>If char is a DIGIT, append it to input_number.</t>
                </li>
                <li>
                  <t>Else, if type is "integer" and char is ".":
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>If input_number contains more than 12 characters, fail parsing.</t>
                    </li>
                    <li>
                      <t>Otherwise, append char to input_number and set type to "decimal".</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise, prepend char to input_string, and exit the loop.</t>
                </li>
                <li>
                  <t>If type is "integer" and input_number contains more than 15 characters, fail parsing.</t>
                </li>
                <li>
                  <t>If type is "decimal" and input_number contains more than 16 characters, fail parsing.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>If type is "integer":
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let output_number be an Integer that is the result of parsing input_number as an integer.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Otherwise:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>If the final character of input_number is ".", fail parsing.</t>
                </li>
                <li>
                  <t>If the number of characters after "." in input_number is greater than three, fail parsing.</t>
                </li>
                <li>
                  <t>Let output_number be a Decimal that is the result of parsing input_number as a decimal number.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Let output_number be the product of output_number and sign.</t>
            </li>
            <li>
              <t>Return output_number.</t>
            </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>
              <t>Let output_string be an empty string.</t>
            </li>
            <li>
              <t>If the first character of input_string is not DQUOTE, fail parsing.</t>
            </li>
            <li>
              <t>Discard the first character of input_string.</t>
            </li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let char be the result of consuming the first character of input_string.</t>
                </li>
                <li>
                  <t>If char is a backslash ("\"):
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>If input_string is now empty, fail parsing.</t>
                    </li>
                    <li>
                      <t>Let next_char be the result of consuming the first character of input_string.</t>
                    </li>
                    <li>
                      <t>If next_char is not DQUOTE or "\", fail parsing.</t>
                    </li>
                    <li>
                      <t>Append next_char to output_string.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Else, if char is DQUOTE, return output_string.</t>
                </li>
                <li>
                  <t>Else, if char is in the range %x00-1f or %x7f-ff (i.e., it is not in VCHAR or SP), fail parsing.</t>
                </li>
                <li>
                  <t>Else, append char to output_string.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Reached the end of input_string without finding a closing DQUOTE; fail parsing.</t>
            </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>
              <t>If the first character of input_string is not ALPHA or "*", fail parsing.</t>
            </li>
            <li>
              <t>Let output_string be an empty string.</t>
            </li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>If the first character of input_string is not in tchar, ":", or "/", return output_string.</t>
                </li>
                <li>
                  <t>Let char be the result of consuming the first character of input_string.</t>
                </li>
                <li>
                  <t>Append char to output_string.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Return output_string.</t>
            </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>
              <t>If the first character of input_string is not ":", fail parsing.</t>
            </li>
            <li>
              <t>Discard the first character of input_string.</t>
            </li>
            <li>
              <t>If there is not a ":" character before the end of input_string, fail parsing.</t>
            </li>
            <li>
              <t>Let b64_content be the result of consuming content of input_string up to but not including the first instance of the character ":".</t>
            </li>
            <li>
              <t>Consume the ":" character at the beginning of input_string.</t>
            </li>
            <li>
              <t>If b64_content contains a character not included in ALPHA, DIGIT, "+", "/", and "=", fail parsing.</t>
            </li>
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>Return binary_content.</t>
            </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>
              <t>If the first character of input_string is not "?", fail parsing.</t>
            </li>
            <li>
              <t>Discard the first character of input_string.</t>
            </li>
            <li>
              <t>If the first character of input_string matches "1", discard the first character, and return true.</t>
            </li>
            <li>
              <t>If the first character of input_string matches "0", discard the first character, and return false.</t>
            </li>
            <li>
              <t>No value has matched; fail parsing.</t>
            </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>
              <t>If the first character of input_string is not "@", fail parsing.</t>
            </li>
            <li>
              <t>Discard the first character of input_string.</t>
            </li>
            <li>
              <t>Let output_date be the result of running Parsing an Integer or Decimal (<xref target="parse-number"/>) with input_string.</t>
            </li>
            <li>
              <t>If output_date is a Decimal, fail parsing.</t>
            </li>
            <li>
              <t>Return output_date.</t>
            </li>
          </ol>
        </section>
        <section anchor="parse-display">
          <name>Parsing a Display String</name>
          <t>Given an ASCII string as input_string, return a sequence of Unicode codepoints. input_string is modified to remove the parsed value.</t>
          <ol spacing="normal" type="1"><li>
              <t>If the first two characters of input_string are not "%" followed by DQUOTE, fail parsing.</t>
            </li>
            <li>
              <t>Discard the first two characters of input_string.</t>
            </li>
            <li>
              <t>Let byte_array be an empty byte array.</t>
            </li>
            <li>
              <t>While input_string is not empty:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let char be the result of consuming the first character of input_string.</t>
                </li>
                <li>
                  <t>If char is in the range %x00-1f or %x7f-ff (i.e., it is not in VCHAR or SP), fail parsing.</t>
                </li>
                <li>
                  <t>If char is "%":
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Let octet_hex be the result of consuming two characters from input_string. If there are not two characters, fail parsing.</t>
                    </li>
                    <li>
                      <t>If octet_hex contains characters outside the range %x30-39 or %x61-66 (i.e., it is not in 0-9 or lowercase a-f), fail parsing.</t>
                    </li>
                    <li>
                      <t>Let octet be the result of hex decoding octet_hex (<xref section="8" sectionFormat="of" target="RFC4648"/>).</t>
                    </li>
                    <li>
                      <t>Append octet to byte_array.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If char is DQUOTE:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Let unicode_sequence be the result of decoding byte_array as a UTF-8 string (<xref section="3" sectionFormat="of" target="UTF8"/>). Fail parsing if decoding fails.</t>
                    </li>
                    <li>
                      <t>Return unicode_sequence.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>Otherwise, if char is not "%" or DQUOTE:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Let byte be the result of applying ASCII encoding to char.</t>
                    </li>
                    <li>
                      <t>Append byte to byte_array.</t>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>
              <t>Reached the end of input_string without finding a closing DQUOTE; fail parsing.</t>
            </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">
      <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>
      <t>The Display String type can convey any possible Unicode code point without sanitization; for example, they might contain unassigned code points, control points (including NUL), or noncharacters. Therefore, applications consuming Display Strings need to consider strategies such as filtering or escaping untrusted content before displaying it. See also <xref target="UNICODE-SECURITY"/> and <xref target="I-D.draft-bray-unichars"/>.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <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"/>
            <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"/>
            <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"/>
            <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"/>
            <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>
      </references>
      <references anchor="sec-informative-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="UTF8" 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"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <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"/>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan"/>
            <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="UNICODE-SECURITY" target="http://www.unicode.org/reports/tr36/">
          <front>
            <title>Unicode Security Considerations</title>
            <author initials="M." surname="Davis" fullname="Mark Davis">
              <organization/>
            </author>
            <author initials="M." surname="Suignard" fullname="Michel Suignard">
              <organization/>
            </author>
            <date year="2014" month="September" day="19"/>
          </front>
          <seriesInfo name="Unicode Technical Report" value="#16"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <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>
        <reference anchor="I-D.draft-bray-unichars">
          <front>
            <title>Unicode Character Repertoire Subsets</title>
            <author fullname="Tim Bray" initials="T." surname="Bray">
              <organization>Textuality Services</organization>
            </author>
            <author fullname="Paul E. Hoffman" initials="P. E." surname="Hoffman">
              <organization>ICANN</organization>
            </author>
            <date day="12" month="October" year="2023"/>
            <abstract>
              <t>   This document discusses specifying subsets of the Unicode character
   repertoire for use in protocols and data formats.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bray-unichars-07"/>
        </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"/>
            <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"/>
            <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>
      </references>
    </references>
    <?line 1061?>

<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 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. However, it cannot be used to validate their syntax, because it does not capture all requirements.</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-date / sf-displaystring

sf-integer       = ["-"] 1*15DIGIT
sf-decimal       = ["-"] 1*12DIGIT "." 1*3DIGIT
sf-string        = DQUOTE *( unescaped / "%" / bs-escaped ) DQUOTE
sf-token         = ( ALPHA / "*" ) *( tchar / ":" / "/" )
sf-binary        = ":" base64 ":"
sf-boolean       = "?" ( "0" / "1" )
sf-date          = "@" sf-integer
sf-displaystring = "%" DQUOTE *( unescaped / "\" / pct-encoded ) DQUOTE

base64       = *( ALPHA / DIGIT / "+" / "/" ) *"="

unescaped    = %x20-21 / %x23-24 / %x26-5B / %x5D-7E
bs-escaped   = "\" ( DQUOTE / "\" )

pct-encoded  = "%" lc-hexdig lc-hexdig
lc-hexdig = DIGIT / %x61-66 ; 0-9, a-f
]]></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>
          <t>Added the Date structured type. (<xref target="date"/>)</t>
        </li>
        <li>
          <t>Stopped encouraging use of ABNF in definitions of new structured fields. (<xref target="specify"/>)</t>
        </li>
        <li>
          <t>Moved ABNF to an informative appendix. (<xref target="abnf"/>)</t>
        </li>
        <li>
          <t>Added a "Structured Type" column to the HTTP Field Name Registry. (<xref target="iana"/>)</t>
        </li>
        <li>
          <t>Refined parse failure handling. (<xref target="text-parse"/>)</t>
        </li>
        <li>
          <t>Added the Display String structured type. (<xref target="displaystring"/>)</t>
        </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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
gbjggyybPTHaRIghYuMe9f8XKMRysXL2AAA=

-->

</rfc>
