<?xml version="1.0" encoding="UTF-8"?>
<!--
    This XML document is the output of clean-for-DTD.xslt; a tool that strips
    extensions to RFC2629(bis) from documents for processing with xml2rfc.
-->
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?><!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.0.40 -->
<!DOCTYPE rfc
  PUBLIC "" "rfc2629.dtd">
<rfc ipr="trust200902" docName="draft-ietf-httpbis-header-structure-01" category="std" obsoletes="" updates="" submissionType="IETF"><front><title>HTTP Header Common Structure</title><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 year="2017"/><area>Applications and Real-Time</area><workgroup>HTTP Working Group</workgroup><keyword>Internet-Draft</keyword><abstract><t>An abstract data model for HTTP headers, “Common Structure”, and a
HTTP/1 serialization of it, generalized from current HTTP headers.</t></abstract><note title="Note to Readers"><t>Discussion of this draft takes place on the HTTP working group mailing list (ietf-http-wg@w3.org),
which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/">https://lists.w3.org/Archives/Public/ietf-http-wg/</eref>.</t><t>Working Group information can be found at <eref target="http://httpwg.github.io/">http://httpwg.github.io/</eref>; source code and issues list
for this draft can be found at <eref target="https://github.com/httpwg/http-extensions/labels/header-structure">https://github.com/httpwg/http-extensions/labels/header-structure</eref>.</t></note></front><middle><section anchor="introduction" toc="default" title="Introduction"><t>The HTTP protocol does not impose any structure or datamodel on the
information in HTTP headers, the HTTP/1 serialization is the
datamodel:  An ASCII string without control characters.</t><t>HTTP header definitions specify how the string must be formatted
and while families of similar headers exist, it still requires an
uncomfortable large number of bespoke parser and validation routines
to process HTTP traffic correctly.</t><t>In order to improve performance HTTP/2 and HPACK uses naive
text-compression, which incidentally decoupled the on-the-wire
serialization from the data model.</t><t>During the development of HPACK it became evident that significantly
bigger gains were available if semantic compression could be used,
most notably with timestamps.  However, the lack of a common
data structure for HTTP headers would make semantic compression
one long list of special cases.</t><t>Parallel to this, various proposals for how to fulfill data-transportation
needs, and to a lesser degree to impose some kind of order on
HTTP headers, at least going forward, were floated.</t><t>All of these proposals, JSON, CBOR etc. run into the same basic
problem:  Their serialization is incompatible with RFC 7230’s <xref target="RFC7230" format="default"/>
ABNF definition of ‘field-value’.</t><t>For binary formats, such as CBOR, a wholesale base64/85
reserialization would be needed, with negative results for
both debugability and bandwidth.</t><t>For textual formats, such as JSON, the format must first be neutered
to not violate field-value’s ABNF, and then workarounds added
to reintroduce the features just lost, for instance UNICODE strings.</t><t>The post-surgery format is no longer JSON, and it experience indicates
that almost-but-not-quite compatibility is worse than no compatibility.</t><t>This proposal starts from the other end, and builds and generalizes
a data structure definition from existing HTTP headers, which means
that HTTP/1 serialization and ‘field-value’ compatibility is built in.</t><t>If all future HTTP headers are defined to fit into this Common Structure
we have at least halted the proliferation of bespoke parsers and
started to pave the road for semantic compression serializations of
HTTP traffic.</t><section anchor="terminology" toc="default" title="Terminology"><t>In this document, the key words “MUST”, “MUST NOT”, “REQUIRED”,
“SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”,
and “OPTIONAL” are to be interpreted as described in BCP 14, RFC 2119
<xref target="RFC2119" format="default"/>.</t></section></section><section anchor="definition-of-http-header-common-structure" toc="default" title="Definition of HTTP Header Common Structure"><t>The data model of Common Structure is an ordered sequence of named
dictionaries.  Please see <xref target="survey" format="default"/> for how this model was derived.</t><t>The definition of the data model is on purpose abstract, uncoupled
from any protocol serialization or programming environment
representation, it is meant as the foundation on which all such
manifestations of the model can be built.</t><t>Common Structure in ABNF (Slightly bastardized relative to RFC5234 <xref target="RFC5234" format="default"/>):</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  import token from RFC7230
  import DIGIT from RFC5234

  common-structure = 1* ( identifier dictionary )

  dictionary = * ( identifier [ value ] )

  value = identifier /
          integer /
          number /
          ascii-string /
          unicode-string /
          blob /
          timestamp /
          common-structure
]]></artwork></figure><t>Recursion is included as a way to to support deep and more general
data structures, but its use is highly discouraged and where it is
used the depth of recursion SHALL always be explicitly limited
in the specifications of the HTTP headers which allow it.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  identifier = token  [ "/" token ]

  integer = ["-"] 1*19 DIGIT
]]></artwork></figure><t>Integers SHALL be in the range +/- 2^63-1 (= +/- 9223372036854775807)</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  number = ["-"] DIGIT '.' 1*14DIGIT /
           ["-"] 2DIGIT '.' 1*13DIGIT /
           ["-"] 3DIGIT '.' 1*12DIGIT /
           ... /
           ["-"] 12DIGIT '.' 1*3DIGIT /
           ["-"] 13DIGIT '.' 1*2DIGIT /
           ["-"] 14DIGIT '.' 1DIGIT
]]></artwork></figure><t>The limit of 15 significant digits is chosen so that numbers can
be correctly represented by IEEE754 64 bit binary floating point.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  ascii-string = * %x20-7e
]]></artwork></figure><t>This is intended to be an efficient, “safe” and uncomplicated string
type, for uses where the string content is culturally neutral or
where it will not be user visible.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  unicode-string = * UNICODE

  UNICODE = <U+0000-U+D7FF / U+E000-U+10FFFF>
  # UNICODE nicked from draft-seantek-unicode-in-abnf-02
]]></artwork></figure><t>Unicode-strings are unrestricted because there is no sane and/or
culturally neutral way to subset or otherwise make unicode “safe”,
and Unicode is still evolving new and interesting code points.</t><t>Users of unicode-string SHALL be prepared for the full gammut of
glyph-gymnastics in order to avoid U+1F4A9 U+08 U+1F574.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  blob = * %0x00-ff
]]></artwork></figure><t>Blobs are intended primarily for cryptographic data, but can be
used for any otherwise unsatisfied needs.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  timestamp = number
]]></artwork></figure><t>A timestamp counts seconds since the UNIX time_t epoch, including
the “invisible leap-seconds” misfeature.</t></section><section anchor="http1-serialization-of-http-header-common-structure" toc="default" title="HTTP/1 Serialization of HTTP Header Common Structure"><t>In ABNF:</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  import OWS from RFC7230
  import HEXDIG, DQUOTE from RFC5234
  import EmbeddedUnicodeChar from RFC5137

  h1-common-structure-header =
          h1-common-structure-legacy-header /
          h1-common-structure-self-identifying-header

  h1-common-structure-legacy-header =
          field-name ":" OWS h1-common-structure
]]></artwork></figure><t>Only white-listed legacy headers (see <xref target="iana" format="default"/>) can use
this format.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  h1-common-structure-self-identifying-header:
          field-name ":" OWS ">" h1-common-structure "<"

  h1-common-structure = h1-element * ("," h1-element)

  h1-element = identifier * (";" identifier ["=" h1-value])

  h1-value = identifier /
          integer /
          number /
          h1-ascii-string /
          h1-unicode-string /
          h1-blob /
          h1-timestamp /
          ">" h1-common-structure "<"

  h1-ascii-string = DQUOTE *(
                    ( "\" DQUOTE ) /
                    ( "\" "\" ) /
                    0x20-21 /
                    0x23-5B /
                    0x5D-7E
                    ) DQUOTE

  h1-unicode-string = DQUOTE *(
                      ( "\" DQUOTE )
                      ( "\" "\" ) /
                      EmbeddedUnicodeChar /
                      0x20-21 /
                      0x23-5B /
                      0x5D-7E /
                      ) DQUOTE
]]></artwork></figure><t>The dim prospects of ever getting a majority of HTTP1 paths 8-bit
clean makes UTF-8 unviable as H1 serialization.  Given that very
little of the information in HTTP headers is presented to users in
the first place, improving H1 and HPACK efficiency by inventing a
more efficient RFC5137 compliant escape-sequences seems unwarranted.</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  h1-blob = ":" base64 ":"
  # XXX: where to import base64 from ?

  h1-timestamp = number
]]></artwork></figure><t>XXX: Allow OWS in parsers, but not in generators ?</t><t>In programming environments which do not define a native representation
or serialization of Common Structure, the HTTP/1 serialization
should be used.</t></section><section anchor="when-to-use-common-structure-parser" toc="default" title="When to use Common Structure Parser"><t>All future standardized and all private HTTP headers using Common
Structure should self identify as such.  In the HTTP/1 serialization
by making the first character “&gt;” and the last “&lt;”.  (These two
characters are deliberately “the wrong way” to not clash with
exsisting usages.)</t><t>Legacy HTTP headers which fit into Common Structure, are marked as
such in the IANA Message Header Registry (see <xref target="iana" format="default"/>), and a snapshot
of the registry can be used to trigger parsing according to Common
Structure of these headers.</t></section><section anchor="desired-normative-effects" toc="default" title="Desired Normative Effects"><t>All new HTTP headers SHOULD use the Common Structure if at all possible.</t></section><section anchor="openoutstanding-issues-to-resolve" toc="default" title="Open/Outstanding issues to resolve"><section anchor="singlemultiple-headers" toc="default" title="Single/Multiple Headers"><t>Should we allow splitting common structure data over multiple headers ?</t><t>Pro:</t><t>Avoids size restrictions, easier on-the-fly editing</t><t>Contra:</t><t>Cannot act on any such header until all headers have been received.</t><t>We must define where headers can be split (between identifier and
dictionary ?, in the middle of dictionaries ?)</t><t>Most on-the-fly editing is hackish at best.</t></section></section><section anchor="future-work" toc="default" title="Future Work"><section anchor="redefining-existing-headers-for-better-performance" toc="default" title="Redefining existing headers for better performance"><t>The HTTP/1 serializations self-identification mechanism makes it
possible to extend the definition of existing <xref target="uncommon" format="default"/> headers
into Common Structure.</t><t>For instance one could imagine:</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height=""><![CDATA[
  Date: >1475061449.201<
]]></artwork></figure><t>Which would be faster to parse and validate than
the current definition of the Date header and more precise too.</t><t>Some kind of signal/negotiation mechanism would be required to make
this work in practice.</t></section><section anchor="define-a-validation-dictionary" toc="default" title="Define a validation dictionary"><t>A machine-readable specification of the legal contents of HTTP
headers would go a long way to improve efficiency and security
in HTTP implementations.</t></section></section><section anchor="iana" toc="default" title="IANA Considerations"><t>The IANA Message Header Registry will be extended with an additional
field named “Common Structure” which can have the values “True”, “False”
or “Unknown”.</t><t>The RFC723x headers listed in <xref target="common" format="default"/> will get the value “True” in the
new field.</t><t>The RFC723x headers listed in <xref target="uncommon" format="default"/> will get the value “False”
in the new field.</t><t>All other existing entries in the registry will be set to “Unknown”
until and if the owner of the entry requests otherwise.</t></section><section anchor="security-considerations" toc="default" title="Security Considerations"><t>Unique dictionary keys are required to reduce the risk of
smuggling attacks.</t></section></middle><back><references title="Normative References"><reference anchor="RFC2119" target="http://www.rfc-editor.org/info/rfc2119"><front><title>Key words for use in RFCs to Indicate Requirement Levels</title><author initials="S." surname="Bradner" fullname="S. Bradner"><organization/></author><date year="1997" month="March"/><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="RFC5137" target="http://www.rfc-editor.org/info/rfc5137"><front><title>ASCII Escaping of Unicode Characters</title><author initials="J." surname="Klensin" fullname="J. Klensin"><organization/></author><date year="2008" month="February"/><abstract><t>There are a number of circumstances in which an escape mechanism is needed in conjunction with a protocol to encode characters that cannot be represented or transmitted directly.  With ASCII coding, the traditional escape has been either the decimal or hexadecimal numeric value of the character, written in a variety of different ways.  The move to Unicode, where characters occupy two or more octets and may be coded in several different forms, has further complicated the question of escapes.  This document discusses some options now in use and discusses considerations for selecting one for use in new IETF protocols, and protocols that are now being internationalized.  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="137"/><seriesInfo name="RFC" value="5137"/><seriesInfo name="DOI" value="10.17487/RFC5137"/></reference><reference anchor="RFC5234" target="http://www.rfc-editor.org/info/rfc5234"><front><title>Augmented BNF for Syntax Specifications: ABNF</title><author initials="D." surname="Crocker" fullname="D. Crocker" role="editor"><organization/></author><author initials="P." surname="Overell" fullname="P. Overell"><organization/></author><date year="2008" month="January"/><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="RFC7230" target="http://www.rfc-editor.org/info/rfc7230"><front><title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title><author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"><organization/></author><author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"><organization/></author><date year="2014" month="June"/><abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t></abstract></front><seriesInfo name="RFC" value="7230"/><seriesInfo name="DOI" value="10.17487/RFC7230"/></reference></references><references title="Informative References"><reference anchor="RFC7231" target="http://www.rfc-editor.org/info/rfc7231"><front><title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title><author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"><organization/></author><author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"><organization/></author><date year="2014" month="June"/><abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t></abstract></front><seriesInfo name="RFC" value="7231"/><seriesInfo name="DOI" value="10.17487/RFC7231"/></reference><reference anchor="RFC7232" target="http://www.rfc-editor.org/info/rfc7232"><front><title>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</title><author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"><organization/></author><author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"><organization/></author><date year="2014" month="June"/><abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP/1.1 conditional requests, including metadata header fields for indicating state changes, request header fields for making preconditions on such state, and rules for constructing the responses to a conditional request when one or more preconditions evaluate to false.</t></abstract></front><seriesInfo name="RFC" value="7232"/><seriesInfo name="DOI" value="10.17487/RFC7232"/></reference><reference anchor="RFC7233" target="http://www.rfc-editor.org/info/rfc7233"><front><title>Hypertext Transfer Protocol (HTTP/1.1): Range Requests</title><author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"><organization/></author><author initials="Y." surname="Lafon" fullname="Y. Lafon" role="editor"><organization/></author><author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"><organization/></author><date year="2014" month="June"/><abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems.  This document defines range requests and the rules for constructing and combining responses to those requests.</t></abstract></front><seriesInfo name="RFC" value="7233"/><seriesInfo name="DOI" value="10.17487/RFC7233"/></reference><reference anchor="RFC7234" target="http://www.rfc-editor.org/info/rfc7234"><front><title>Hypertext Transfer Protocol (HTTP/1.1): Caching</title><author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"><organization/></author><author initials="M." surname="Nottingham" fullname="M. Nottingham" role="editor"><organization/></author><author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"><organization/></author><date year="2014" month="June"/><abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t></abstract></front><seriesInfo name="RFC" value="7234"/><seriesInfo name="DOI" value="10.17487/RFC7234"/></reference><reference anchor="RFC7235" target="http://www.rfc-editor.org/info/rfc7235"><front><title>Hypertext Transfer Protocol (HTTP/1.1): Authentication</title><author initials="R." surname="Fielding" fullname="R. Fielding" role="editor"><organization/></author><author initials="J." surname="Reschke" fullname="J. Reschke" role="editor"><organization/></author><date year="2014" month="June"/><abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypermedia information systems.  This document defines the HTTP Authentication framework.</t></abstract></front><seriesInfo name="RFC" value="7235"/><seriesInfo name="DOI" value="10.17487/RFC7235"/></reference><reference anchor="RFC7239" target="http://www.rfc-editor.org/info/rfc7239"><front><title>Forwarded HTTP Extension</title><author initials="A." surname="Petersson" fullname="A. Petersson"><organization/></author><author initials="M." surname="Nilsson" fullname="M. Nilsson"><organization/></author><date year="2014" month="June"/><abstract><t>This document defines an HTTP extension header field that allows proxy components to disclose information lost in the proxying process, for example, the originating IP address of a request or IP address of the proxy on the user-agent-facing interface.  In a path of proxying components, this makes it possible to arrange it so that each subsequent component will have access to, for example, all IP addresses used in the chain of proxied HTTP requests.</t><t>This document also specifies guidelines for a proxy administrator to anonymize the origin of a request.</t></abstract></front><seriesInfo name="RFC" value="7239"/><seriesInfo name="DOI" value="10.17487/RFC7239"/></reference><reference anchor="RFC7694" target="http://www.rfc-editor.org/info/rfc7694"><front><title>Hypertext Transfer Protocol (HTTP) Client-Initiated Content-Encoding</title><author initials="J." surname="Reschke" fullname="J. Reschke"><organization/></author><date year="2015" month="November"/><abstract><t>In HTTP, content codings allow for payload encodings such as for compression or integrity checks.  In particular, the "gzip" content coding is widely used for payload data sent in response messages.</t><t>Content codings can be used in request messages as well; however, discoverability is not on par with response messages.  This document extends the HTTP "Accept-Encoding" header field for use in responses, to indicate the content codings that are supported in requests.</t></abstract></front><seriesInfo name="RFC" value="7694"/><seriesInfo name="DOI" value="10.17487/RFC7694"/></reference></references><section anchor="survey" toc="default" title="Do HTTP headers have any common structure ?"><t>Several proposals have been floated in recent years to use
some preexisting structured data serialization or other
for HTTP headers, to impose some sanity.</t><t>None of these proposals have gained traction and no obvious
candidate data serializations have been left unexamined.</t><t>This effort tries to tackle the question from the other side,
by asking if there is a common structure in existing HTTP
headers we can generalize for this purpose.</t><section anchor="survey-of-http-header-structure" toc="default" title="Survey of HTTP header structure"><t>The RFC723x family of HTTP/1 standards control 49 entries in the
IANA Message Header Registry, and they share two common motifs.</t><t>The majority of RFC723x HTTP headers are lists.  A few of them are
ordered, (‘Content-Encoding’), some are unordered (‘Connection’)
and some are ordered by ‘q=%f’ weight parameters (‘Accept’)</t><t>In most cases, the list elements are some kind of identifier, usually
derived from ABNF ‘token’ as defined by <xref target="RFC7230" format="default"/>.</t><t>A subgroup of headers, mostly related to MIME, uses what one could
call a ‘qualified token’::</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  qualified-token = token-or-asterix [ "/" token-or-asterix ]
]]></artwork></figure><t>The second motif is parameterized list elements.  The best known
is the “q=0.5” weight parameter, but other parameters exist as well.</t><t>Generalizing from these motifs, our candidate “Common Structure”
data model becomes an ordered list of named dictionaries.</t><t>In pidgin ABNF, ignoring white-space for the sake of clarity, the
HTTP/1.1 serialization of Common Structure is is something like:</t><figure suppress-title="false" align="left" alt="" width="" height=""><artwork type="abnf" xml:space="preserve" name="" align="left" alt="" width="" height=""><![CDATA[
  token-or-asterix = token from RFC7230, but also allowing "*"

  qualified-token = token-or-asterix [ "/" token-or-asterix ]

  field-name, see RFC7230

  Common-Structure-Header = field-name ":" 1#named-dictionary

  named-dictionary = qualified-token [ *(";" param) ]

  param = token [ "=" value ]

  value = we'll get back to this in a moment.
]]></artwork></figure><t>Nineteen out of the RFC723x’s 48 headers, almost 40%, can already
be parsed using this definition, and none the rest have requirements
which could not be met by this data model.  See <xref target="common" format="default"/> and
<xref target="uncommon" format="default"/> for the full survey details.</t></section><section anchor="survey-of-values-in-http-headers" toc="default" title="Survey of values in HTTP headers"><t>Surveying the datatypes of HTTP headers, standardized as well as
private, the following picture emerges:</t><section anchor="numbers" toc="default" title="Numbers"><t>Integer and floating point are both used.  Range and precision
is mostly unspecified in controlling documents.</t><t>Scientific notation (9.192631770e9) does not seem to be used anywhere.</t><t>The ranges used seem to be minus several thousand to plus a couple
of billions, the high end almost exclusively being POSIX time_t
timestamps.</t></section><section anchor="timestamps" toc="default" title="Timestamps"><t>RFC723x text format, but POSIX time_t represented as integer or
floating point is not uncommon.  ISO8601 have also been spotted.</t></section><section anchor="strings" toc="default" title="Strings"><t>The vast majority are pure ASCII strings, with either no escapes,
%xx URL-like escapes or C-style back-slash escapes, possibly with
the addition of \uxxxx UNICODE escapes.</t><t>Where non-ASCII character sets are used, they are almost always
implicit, rather than explicit.  UTF8 and ISO-8859-1 seem to be
most common.</t></section><section anchor="binary-blobs" toc="default" title="Binary blobs"><t>Often used for cryptographic data.  Usually in base64 encoding,
sometimes ““-quoted more often not.  base85 encoding is also
seen, usually quoted.</t></section><section anchor="identifiers" toc="default" title="Identifiers"><t>Seems to almost always fit in the RFC723x ‘token’ definition.</t></section></section><section anchor="is-this-actually-a-useful-thing-to-generalize-" toc="default" title="Is this actually a useful thing to generalize ?"><t>The number one wishlist item seems to be UNICODE strings,
with a big side order of not having to write a new parser
routine every time somebody comes up with a new header.</t><t>Having a common parser would indeed be a good thing, and having an
underlying data model which makes it possible define a compressed
serialization, rather than rely on serialization to text followed
by text compression (ie: HPACK) seems like a good idea too.</t><t>However, when using a datamodel and a parser general enough to
transport useful data, it will have to be followed by a validation
step, which checks that the data also makes sense.</t><t>Today validation, such as it is, is often done by the bespoke parsers.</t><t>This then is probably where the next big potential for improvement lies:</t><t>Ideally a machine readable “data dictionary” which makes it possibly
to copy that text out of RFCs, run it through a code generator which
spits out validation code which operates on the output of the common
parser.</t><t>But history has been particularly unkind to that idea.</t><t>Most attempts studied as part of this effort, have sunk under
complexity caused by reaching for generality,  but where scope
has been wisely limited, it seems to be possible.</t><t>So file that idea under “future work”.</t></section><section anchor="common" toc="default" title="RFC723x headers with “common structure”"><t><list style="symbols"><t>Accept              <xref target="RFC7231" format="default"/>, Section 5.3.2</t><t>Accept-Charset      <xref target="RFC7231" format="default"/>, Section 5.3.3</t><t>Accept-Encoding     <xref target="RFC7231" format="default"/>, Section 5.3.4, <xref target="RFC7694" format="default"/>, Section 3</t><t>Accept-Language     <xref target="RFC7231" format="default"/>, Section 5.3.5</t><t>Age                 <xref target="RFC7234" format="default"/>, Section 5.1</t><t>Allow               <xref target="RFC7231" format="default"/>, Section 7.4.1</t><t>Connection          <xref target="RFC7230" format="default"/>, Section 6.1</t><t>Content-Encoding    <xref target="RFC7231" format="default"/>, Section 3.1.2.2</t><t>Content-Language    <xref target="RFC7231" format="default"/>, Section 3.1.3.2</t><t>Content-Length      <xref target="RFC7230" format="default"/>, Section 3.3.2</t><t>Content-Type        <xref target="RFC7231" format="default"/>, Section 3.1.1.5</t><t>Expect              <xref target="RFC7231" format="default"/>, Section 5.1.1</t><t>Max-Forwards        <xref target="RFC7231" format="default"/>, Section 5.1.2</t><t>MIME-Version        <xref target="RFC7231" format="default"/>, Appendix A.1</t><t>TE                  <xref target="RFC7230" format="default"/>, Section 4.3</t><t>Trailer             <xref target="RFC7230" format="default"/>, Section 4.4</t><t>Transfer-Encoding   <xref target="RFC7230" format="default"/>, Section 3.3.1</t><t>Upgrade             <xref target="RFC7230" format="default"/>, Section 6.7</t><t>Vary                <xref target="RFC7231" format="default"/>, Section 7.1.4</t></list></t></section><section anchor="uncommon" toc="default" title="RFC723x headers with “uncommon structure”"><t>1 of the RFC723x headers is only reserved, and therefore
have no structure at all:</t><t><list style="symbols"><t>Close               <xref target="RFC7230" format="default"/>, Section 8.1</t></list></t><t>5 of the RFC723x headers are HTTP dates:</t><t><list style="symbols"><t>Date                <xref target="RFC7231" format="default"/>, Section 7.1.1.2</t><t>Expires             <xref target="RFC7234" format="default"/>, Section 5.3</t><t>If-Modified-Since   <xref target="RFC7232" format="default"/>, Section 3.3</t><t>If-Unmodified-Since <xref target="RFC7232" format="default"/>, Section 3.4</t><t>Last-Modified       <xref target="RFC7232" format="default"/>, Section 2.2</t></list></t><t>24 of the RFC723x headers use bespoke formats
which only a single or in rare cases two headers
share:</t><t><list style="symbols"><t>Accept-Ranges       <xref target="RFC7233" format="default"/>, Section 2.3
  <list style="symbols"><t>bytes-unit / other-range-unit</t></list></t><t>Authorization       <xref target="RFC7235" format="default"/>, Section 4.2</t><t>Proxy-Authorization <xref target="RFC7235" format="default"/>, Section 4.4
  <list style="symbols"><t>credentials</t></list></t><t>Cache-Control       <xref target="RFC7234" format="default"/>, Section 5.2
  <list style="symbols"><t>1#cache-directive</t></list></t><t>Content-Location    <xref target="RFC7231" format="default"/>, Section 3.1.4.2
  <list style="symbols"><t>absolute-URI / partial-URI</t></list></t><t>Content-Range       <xref target="RFC7233" format="default"/>, Section 4.2
  <list style="symbols"><t>byte-content-range / other-content-range</t></list></t><t>ETag                <xref target="RFC7232" format="default"/>, Section 2.3
  <list style="symbols"><t>entity-tag</t></list></t><t>Forwarded           <xref target="RFC7239" format="default"/>
  <list style="symbols"><t>1#forwarded-element</t></list></t><t>From                <xref target="RFC7231" format="default"/>, Section 5.5.1
  <list style="symbols"><t>mailbox</t></list></t><t>If-Match            <xref target="RFC7232" format="default"/>, Section 3.1</t><t>If-None-Match       <xref target="RFC7232" format="default"/>, Section 3.2
  <list style="symbols"><t>“*” / 1#entity-tag</t></list></t><t>If-Range            <xref target="RFC7233" format="default"/>, Section 3.2
  <list style="symbols"><t>entity-tag / HTTP-date</t></list></t><t>Host                <xref target="RFC7230" format="default"/>, Section 5.4
  <list style="symbols"><t>uri-host [ “:” port ]</t></list></t><t>Location            <xref target="RFC7231" format="default"/>, Section 7.1.2
  <list style="symbols"><t>URI-reference</t></list></t><t>Pragma              <xref target="RFC7234" format="default"/>, Section 5.4
  <list style="symbols"><t>1#pragma-directive</t></list></t><t>Range               <xref target="RFC7233" format="default"/>, Section 3.1
  <list style="symbols"><t>byte-ranges-specifier / other-ranges-specifier</t></list></t><t>Referer             <xref target="RFC7231" format="default"/>, Section 5.5.2
  <list style="symbols"><t>absolute-URI / partial-URI</t></list></t><t>Retry-After         <xref target="RFC7231" format="default"/>, Section 7.1.3
  <list style="symbols"><t>HTTP-date / delay-seconds</t></list></t><t>Server              <xref target="RFC7231" format="default"/>, Section 7.4.2</t><t>User-Agent          <xref target="RFC7231" format="default"/>, Section 5.5.3
  <list style="symbols"><t>product *( RWS ( product / comment ) )</t></list></t><t>Via                 <xref target="RFC7230" format="default"/>, Section 5.7.1
  <list style="symbols"><t>1#( received-protocol RWS received-by [ RWS comment ] )</t></list></t><t>Warning             <xref target="RFC7234" format="default"/>, Section 5.5
  <list style="symbols"><t>1#warning-value</t></list></t><t>Proxy-Authenticate  <xref target="RFC7235" format="default"/>, Section 4.3</t><t>WWW-Authenticate    <xref target="RFC7235" format="default"/>, Section 4.1
  <list style="symbols"><t>1#challenge</t></list></t></list></t></section></section><section anchor="changes" toc="default" title="Changes"><section anchor="since-draft-ietf-httpbis-header-structure-00" toc="default" title="Since draft-ietf-httpbis-header-structure-00"><t>Added signed 64bit integer type.</t><t>Drop UTF8, and settle on BCP137 <xref target="RFC5137" format="default"/>::EmbeddedUnicodeChar for
h1-unicode-string.</t><t>Change h1_blob delimiter to “:” since “’” is valid t_char</t></section></section></back><!-- ##markdown-source:
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

--></rfc>