<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ohai-chunked-ohttp-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.5 -->
  <front>
    <title abbrev="Chunked OHTTP">Chunked Oblivious HTTP Messages</title>
    <seriesInfo name="Internet-Draft" value="draft-ohai-chunked-ohttp-00"/>
    <author fullname="Tommy Pauly">
      <organization>Apple</organization>
      <address>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <date year="2023" month="August" day="17"/>
    <area>ART</area>
    <workgroup>OHAI Working Group</workgroup>
    <abstract>
      <?line 29?>

<t>This document defines a variant of the Oblivious HTTP message format that allows
chunks of requests and responses to be encrypted and decrypted before the entire
request or response is processed. This allows incremental processing of Oblivious
HTTP messages, which is particularly useful for handling large messages or systems
that process messages slowly.</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-ohai-chunked-ohttp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OHAI Working Group mailing list (<eref target="mailto:ohai@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ohai/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ohai/"/>.
      </t>
    </note>
  </front>
  <middle>
    <?line 37?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Oblivious HTTP <xref target="OHTTP"/> defines a system for sending HTTP requests
and responses as encrypted messages. Clients send requests via a relay to a gateway, which
is able to decrypt and forward the request to a target server. Responses are encrypted
with an ephemeral symmetric key by the gateway and sent back to the client via the relay.
The messages are protected with Hybrid Public Key Encryption (HPKE; <xref target="HPKE"/>),
and are intended to prevent the gateway from linking any two independent requests to the
same client.</t>
      <t>The definition of Oblivious HTTP in <xref target="OHTTP"/> encrypts messages such that entire request
and response bodies need to be received before any of the content can be decrypted. This
is well-suited for many of the use cases of Oblivious HTTP, such as DNS queries or metrics
reporting.</t>
      <t>However, some applications of Oblivious HTTP can benefit from being able to encrypt and
decrypt parts of the messages in chunks. If a request or response can be processed by a
receiver in separate parts, and is particularly large or will be generated slowly, then
sending a series of encrypted chunks can improve the performance of applications.</t>
      <t>Incremental delivery of responses allows an Oblivious Gateway Resource to provide
Informational (1xx) responses (<xref section="15.2" sectionFormat="of" target="HTTP"/>).</t>
      <t>This document defines an optional message format for Oblivious HTTP that supports the
progressive creation and processing of both requests and responses. New media types are
defined for this purpose.</t>
      <section anchor="applicability">
        <name>Applicability</name>
        <t>Like the non-chunked variant, chunked Oblivious HTTP has limited applicability
as described in <xref section="2.1" sectionFormat="of" target="OHTTP"/>, and requires the use of a willing
Oblivious Relay Resource and Oblivious Gateway Resource.</t>
        <t>Chunked Oblivious HTTP is intended to be used in cases for where the privacy
properties of Oblivious HTTP are needed — specifically, removing linkage
at the transport layer between separate HTTP requests — but incremental
processing is also needed for performance or functionality.</t>
        <t>One specific functional capability that requires chunked Oblivious HTTP
is support for Informational (1xx) responses
(<xref section="15.2" sectionFormat="of" target="HTTP"/>).</t>
        <t>In order to be useful, the content of chunked Oblivious HTTP needs to be
possible to process incrementally. Since incremental processing means that the
message might end up being truncated, for example in the case of an error on the
underlying transport, applications also need to be prepared to safely handle incomplete
messages (see <xref target="security"/> for more discussion). Applications that use the Indeterminate
format of Binary HTTP (<xref section="3.2" sectionFormat="of" target="BHTTP"/>) are well-suited
to using chunked Oblivious HTTP.</t>
        <t>Chunked Oblivious HTTP is not intended to be used for long-lived sessions
between clients and servers that might build up state, or as a replacement
for a proxied TLS session.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>Notational conventions from <xref target="OHTTP"/> are used in this document.</t>
    </section>
    <section anchor="chunked-request-and-response-media-types">
      <name>Chunked Request and Response Media Types</name>
      <t>Chunked Oblivious HTTP defines different media than the non-chunked variant. These
media types are "message/ohttp-chunked-req" (defined in <xref target="iana-req"/>) and
"message/ohttp-chunked-res" (defined in <xref target="iana-res"/>).</t>
    </section>
    <section anchor="request">
      <name>Request Format</name>
      <t>Chunked OHTTP requests start with the same header as used for the non-chunked variant,
which consists of a key ID, algorithm IDs, and the KEM shared secret. This header is
followed by chunks of data protected with HPKE, each of which is preceded by a
variable-length integer (as defined in <xref section="16" sectionFormat="of" target="QUIC"/>)
that indicates the length of the chunk. The final chunk is preceded by a length
field with the value 0, which means the chunk extends to the end of the outer stream.</t>
      <figure anchor="fig-enc-request">
        <name>Chunked Encapsulated Request Format</name>
        <artwork><![CDATA[
Chunked Encapsulated Request {
  Chunked Request Header (56 + 8 * Nenc),
  Chunked Request Chunks (..),
}

Chunked Request Header {
  Key Identifier (8),
  HPKE KEM ID (16),
  HPKE KDF ID (16),
  HPKE AEAD ID (16),
  Encapsulated KEM Shared Secret (8 * Nenc),
}

Chunked Request Chunks {
  Non-Final Request Chunk (..),
  Final Request Chunk Indicator (i) = 0,
  HPKE-Protected Final Chunk (..),
}

Non-Final Request Chunk {
  Length (i) = 1..,
  HPKE-Protected Chunk (..),
}
]]></artwork>
      </figure>
      <t>The content of the HPKE-protected chunks is defined in <xref target="request-encap"/>.</t>
    </section>
    <section anchor="response">
      <name>Response Format</name>
      <t>Chunked OHTTP responses start with a nonce, followed by chunks of data protected with
an AEAD. Each chunk is preceded by a variable-length integer that indicates the length
of the chunk. The final chunk is preceded by a length field with the value 0, which means
the chunk extends to the end of the outer stream.</t>
      <figure anchor="fig-enc-response">
        <name>Chunked Encapsulated Response Format</name>
        <artwork><![CDATA[
Chunked Encapsulated Response {
  Response Nonce (Nk),
  Chunked Response Chunks (..),
}

Chunked Response Chunks {
  Non-Final Response Chunk (..),
  Final Response Chunk Indicator (i) = 0,
  AEAD-Protected Final Response Chunk (..),
}

Non-Final Response Chunk {
  Length (i) = 1..,
  AEAD-Protected Chunk (..),
}
]]></artwork>
      </figure>
    </section>
    <section anchor="encapsulation-of-chunks">
      <name>Encapsulation of Chunks</name>
      <t>The encapsulation of chunked Oblivious HTTP requests and responses uses
the same approach as the non-chunked variant, with the difference that
the body of requests and responses are sealed and opened in chunks, instead
of as a whole.</t>
      <t>The AEAD that protects both requests and responses protects individual chunks from
modification or truncation. Additionally, chunk authentication protects two other
pieces of information:</t>
      <ol spacing="normal" type="1"><li>the order of the chunks (the sequence number of each chunk), which is
included in the nonce of each chunk.</li>
        <li>which chunk is the final chunk, which is indicated by a sentinel in the AAD
of the final chunk.</li>
      </ol>
      <t>The format of the outer packaging that carries the chunks (the length prefix for each
chunk specifically) is not explicitly authenticated. This allows the chunks to be
transported by alternative means, and still be valid as long as the order and
finality are preserved.  In particular, the variable-length encoding used for lengths
allows for different expressions of the same value, where the choice between
equivalent encodings is not authenticated.</t>
      <section anchor="request-encap">
        <name>Request Encapsulation</name>
        <t>For requests, the setup of the HPKE context and the encrypted request header
is the same as the non-chunked variant. This is the Chunked Request Header
defined in <xref target="request"/>.</t>
        <artwork><![CDATA[
hdr = concat(encode(1, key_id),
             encode(2, kem_id),
             encode(2, kdf_id),
             encode(2, aead_id))
info = concat(encode_str("message/bhttp chunked request"),
              encode(1, 0),
              hdr)
enc, sctxt = SetupBaseS(pkR, info)
enc_request_hdr = concat(hdr, enc)
]]></artwork>
        <t>Each chunk is sealed using the HPKE context. For non-final chunks, the AAD
is empty.</t>
        <artwork><![CDATA[
sealed_chunk = sctxt.Seal("", chunk)
sealed_chunk_len = varint_encode(len(sealed_chunk))
non_final_chunk = concat(sealed_chunk_len, sealed_chunk)
]]></artwork>
        <t>The final chunk in a request uses an AAD of the string "final".</t>
        <artwork><![CDATA[
sealed_final_chunk = sctxt.Seal("final", chunk)
sealed_final_chunk_len = varint_encode(len(sealed_final_chunk))
final_chunk = concat(sealed_final_chunk_len, sealed_final_chunk)
]]></artwork>
        <t>HPKE already maintains a sequence number for sealing operations as part of
the context, so the order of chunks is protected.</t>
      </section>
      <section anchor="response-encap">
        <name>Response Encapsulation</name>
        <t>For responses, the first piece of data sent back is the response nonce,
as in the non-chunked variant.</t>
        <artwork><![CDATA[
entropy = max(Nn, Nk)
response_nonce = random(entropy)
]]></artwork>
        <t>Each chunk is sealed using the same AEAD key and AEAD nonce that are
derived for the non-chunked variant, which are calculated as follows:</t>
        <artwork><![CDATA[
secret = context.Export("message/bhttp chunked response", entropy)
response_nonce = random(entropy)
salt = concat(enc, response_nonce)
prk = Extract(salt, secret)
aead_key = Expand(prk, "key", Nk)
aead_nonce = Expand(prk, "nonce", Nn)
]]></artwork>
        <t>The sender also maintains a counter of chunks, which is initialized
to 0.</t>
        <artwork><![CDATA[
counter = 0
]]></artwork>
        <t>The nonce additionally is XORed with a counter to indicate the order
of the chunks. For non-final chunks, the AAD is empty.</t>
        <artwork><![CDATA[
chunk_nonce = aead_nonce XOR encode(Nn, counter)
sealed_chunk = Seal(aead_key, chunk_nonce, "", chunk)
sealed_chunk_len = varint_encode(len(sealed_chunk))
non_final_chunk = concat(sealed_chunk_len, sealed_chunk)
counter++
]]></artwork>
        <t>The final chunk in a response uses an AAD of the string "final".</t>
        <artwork><![CDATA[
chunk_nonce = aead_nonce XOR encode(Nn, counter)
sealed_final_chunk = Seal(aead_key, chunk_nonce, "final", chunk)
sealed_final_chunk_len = varint_encode(len(sealed_final_chunk))
final_chunk = concat(sealed_final_chunk_len, sealed_final_chunk)
]]></artwork>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>The primary advantage of a chunked encoding is that chunked requests or responses can
be generated or processed incrementally.  However, for a recipient in particular,
processing an incomplete message can have security consequences.</t>
      <t>The potential for message truncation is not a new concern for HTTP.  All versions of
HTTP provide incremental delivery of messages.  For this use of Oblivious HTTP,
incremental processing that might result in side-effects demands particular attention
as Oblivious HTTP does not provide strong protection against replay attacks; see
<xref section="6.5" sectionFormat="of" target="OHTTP"/>.  Truncation might be the result of interference at the
network layer, or by a malicious Oblivious Relay Resource.</t>
      <t>Endpoints that receive chunked messages can perform early processing if the risks are
understood and accepted. Conversely, endpoints that depend on having a complete
message <bcp14>MUST</bcp14> ensure that they do not consider a message complete until having
received a chunk with a 0-valued length prefix, which was successfully decrypted
using the expected sentinel value, "final", in the AAD.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document updates the "Media Types" registry at
<eref target="https://iana.org/assignments/media-types">https://iana.org/assignments/media-types</eref> to add the media types
"message/ohttp-chunked-req" (<xref target="iana-req"/>), and
"message/ohttp-chunked-res" (<xref target="iana-res"/>), following the procedures of
<xref target="RFC6838"/>.</t>
      <section anchor="iana-req">
        <name>message/ohttp-chunked-req Media Type</name>
        <t>The "message/ohttp-chunked-req" identifies an encrypted binary HTTP request
that is transmitted or processed in chunks. This is a binary format that is
defined in <xref target="request"/>.</t>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-chunked-req</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>"binary"</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>this specification</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Oblivious HTTP and applications that use Oblivious HTTP use this media type to
identify encapsulated binary HTTP requests that are incrementally generated or processed.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-res">
        <name>message/ohttp-chunked-res Media Type</name>
        <t>The "message/ohttp-res" identifies an encrypted binary HTTP response
that is transmitted or processed in chunks. This is a binary format that
is defined in <xref target="response"/>.</t>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>ohttp-chunked-res</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>"binary"</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>this specification</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Oblivious HTTP and applications that use Oblivious HTTP use this media type to
identify encapsulated binary HTTP responses that are incrementally generated or processed.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>see Authors' Addresses section</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="27" month="July" year="2023"/>
            <abstract>
              <t>   This document describes a system for forwarding encrypted HTTP
   messages.  This allows a client to make multiple requests to an
   origin server without that server being able to link those requests
   to the client or to identify the requests as having come from the
   same client, while placing only limited trust in the nodes used to
   forward the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-09"/>
        </reference>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="BHTTP">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a binary format for representing HTTP messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9292"/>
          <seriesInfo name="DOI" value="10.17487/RFC9292"/>
        </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="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
      </references>
      <references>
        <name>Informative 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>
      </references>
    </references>
    <?line 479?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledgements.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
8RXw/xcOe16/+upZRPaO/KWQ/PcKqnuCZ8X1DwnqO9SP4rkTDUasiWu4ftyp
J1JOyHlhljROUvEdIIVmbNxDDWBQ56zGD2x6iYpt33/g2waic2GBpqH1bYje
AFDWFzncbKdA0p/zRR7TSabb01a6zVBP2+qxP11yWKg7cnt/bL4g6AKY9cVK
nlGzCQ7uJnH+06bkq3Nkmep7Fj0KBV7LYzHU+qgQaHLlM3J3pczfc+jMMds3
J5pbV+zjPDTwo/beFRixZRTampNB0FXC4iGdjjVKBSo/Y71U1NBpZCZVWboR
BkW7/pQh0+6kgXf4DhU7PjDzNYg54WXpBnArooZ4av8E+WrR9KlfT75t3SnA
Ca8bYfrBng4RmPjmqhh+FloGfribonDJEBx4Gs/DP65El4rKPeJ6200EKPYk
jfPMpKUNI3O+alNbaT2OJQvxY3kUmnTLpj3CdxBSGHvrrnDwdNiWWeZ6FCqK
tLvmxGPGwmpqCeju1u5aF82XYYnuWk5/Kix5jEb3Vgtdz7ZX0AdrI/KeSkcP
dh0MHfBkEk9Y1Be0vJuGgPNyzKVh3K2tQ4C7V3wljM5M10tXze0t0eQmqDld
I6tuA/hqs8a5pi3AndfTw/PDHsb07+tUeVx3OQetKdgA2pob2B7Zl3hLOYjd
f/GCZkp0y/aFgnLmKZGwL3i4Nebh1ju+XRjH/nZWPfTaPraigVdnyjX6/Jir
M9sKfeEgJTaduCq40SPc9PX1m6/fuG70jtzKSGsICCSuOXL49Bz/JkwxOOw1
ZfW0dRcgXO9zzWXr7jUsTbkBhuu0I9TXKlBqX+41dntxzUfgK8pC7IcDC3FV
TcvOm7WzCHHprrXEBFdYBjywvPT8xaEQF+FG16aXJyEYRR2D4wUDd4ABeGjH
gN6q/qUMuvGCPbie8VdvNnzFm/M1Ubsg3wjdKd/b23eo3nksxLaLHca2rJa/
7t9pSuPuRZT6497CDfTgG0IGa1m1OsObbcXW9UY3Nm8J4ND7+0LN2atNM1fb
JrGmg9prhu7Lt3ECeakIyjwYEMqhJBi8A+tv4/LdmZqbyJedQ7u7//YFHr6N
43egir/jsO5Y0zDE1TyJAbyR1dnm3h0LeNvH702i3SSE4vlz25wRm2VmacxC
F5pIzJzEbfvmRZy8g73AdP2FQr6XT5hF/TyCLyrEcGJmdVYV1DleExGZ6iH/
OwP7T9SMpm9paqX9FfLTcA2nItfjT+guxMU5eRhlw5G/Epu2Vji9+H+98AWb
HC1UOndVfQEI1O4r/gcZj/vrGoQ/PYd/diP+2c34xzj8Zbjnss/fDPjE+sjR
DxP/L8hnf0e+fwzkq/9Nyu/Q9zv0/ZbQR//gh/qOlBcfRrdpdo/qnE3G4hOn
VB0fDGYqsZrvQFwcX6C4CCvZBlGt/i/Ijvu+eTcAAA==

-->

</rfc>
