<?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.17 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-schinazi-httpbis-wrap-up-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title>The HTTP Wrap Up Capsule</title>
    <seriesInfo name="Internet-Draft" value="draft-schinazi-httpbis-wrap-up-00"/>
    <author initials="D." surname="Schinazi" fullname="David Schinazi">
      <organization>Google LLC</organization>
      <address>
        <postal>
          <street>1600 Amphitheatre Parkway</street>
          <city>Mountain View</city>
          <region>CA</region>
          <code>94043</code>
          <country>United States of America</country>
        </postal>
        <email>dschinazi.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="05"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTPBIS</workgroup>
    <keyword>secure</keyword>
    <keyword>tunnels</keyword>
    <keyword>masque</keyword>
    <keyword>http-ng</keyword>
    <abstract>
      <?line 49?>

<t>HTTP intermediaries sometimes need to terminate long-lived request streams in
order to facilitate load balancing or impose data limits. However, Web browsers
commonly cannot retry failed proxied requests when they cannot ascertain
whether an in-progress request was acted on. To avoid user-visible failures, it
is best for the intermediary to inform the client of upcoming request stream
terminations in advance of the actual termination so that the client can wrap
up existing operations related to that stream and start sending new work to a
different stream or connection. This document specifies a new "WRAP_UP" capsule
that allows a proxy to instruct a client that it should not start new requests
on a tunneled connection, while still allowing it to finish existing requests.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://davidschinazi.github.io/draft-schinazi-httpbis-wrap-up/#go.draft-schinazi-httpbis-wrap-up.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-schinazi-httpbis-wrap-up/"/>.
      </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/DavidSchinazi/draft-schinazi-httpbis-wrap-up"/>.</t>
    </note>
  </front>
  <middle>
    <?line 62?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP intermediaries (see <xref section="3.7" sectionFormat="of" target="HTTP"/>) can provide a
variety of benefits to HTTP systems, such as load balancing, caching, and
privacy improvements. Deployments of intermediaries also need to be maintained,
which can sometimes require taking intermediaries temporarily offline.
Additionally, sometimes intermediaries need to terminate long-lived request
streams in order to facilitate load balancing or impose data limits. However,
Web browsers commonly cannot retry failed proxied requests when they cannot
ascertain whether an in-progress request was acted on.</t>
      <t>When a long-lived HTTP connection to a gateway carries many short-lived
streams, it is currently possible to inform the client of an upcoming graceful
termination by leveraging the GOAWAY frame (see <xref section="5.2" sectionFormat="of" target="H3"/> and
<xref section="6.8" sectionFormat="of" target="H2"/>). This instructs the client to send future requests to a
different intermediary without impacting their active requests.</t>
      <figure anchor="diagram-gateway">
        <name>Gateway Sends GOAWAY</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="352" viewBox="0 0 352 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,80" fill="none" stroke="black"/>
              <path d="M 80,144 L 80,160" fill="none" stroke="black"/>
              <path d="M 104,160 L 104,176" fill="none" stroke="black"/>
              <path d="M 136,32 L 136,80" fill="none" stroke="black"/>
              <path d="M 136,144 L 136,160" fill="none" stroke="black"/>
              <path d="M 200,64 L 200,96" fill="none" stroke="black"/>
              <path d="M 216,32 L 216,80" fill="none" stroke="black"/>
              <path d="M 216,144 L 216,160" fill="none" stroke="black"/>
              <path d="M 248,160 L 248,176" fill="none" stroke="black"/>
              <path d="M 272,32 L 272,80" fill="none" stroke="black"/>
              <path d="M 272,144 L 272,160" fill="none" stroke="black"/>
              <path d="M 328,64 L 328,128" fill="none" stroke="black"/>
              <path d="M 344,32 L 344,160" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 136,32 L 216,32" fill="none" stroke="black"/>
              <path d="M 272,32 L 344,32" fill="none" stroke="black"/>
              <path d="M 80,78 L 136,78" fill="none" stroke="black"/>
              <path d="M 80,82 L 136,82" fill="none" stroke="black"/>
              <path d="M 216,80 Q 218,76.8 220,80 Q 222,83.2 224,80 Q 226,76.8 228,80 Q 230,83.2 232,80 Q 234,76.8 236,80 Q 238,83.2 240,80 Q 242,76.8 244,80 Q 246,83.2 248,80 Q 250,76.8 252,80 Q 254,83.2 256,80 Q 258,76.8 260,80 Q 262,83.2 264,80 Q 266,76.8 268,80 Q 270,83.2 272,80 " fill="none" stroke="black"/>
              <path d="M 64,96 L 200,96" fill="none" stroke="black"/>
              <path d="M 64,128 L 328,128" fill="none" stroke="black"/>
              <path d="M 80,142 L 136,142" fill="none" stroke="black"/>
              <path d="M 80,146 L 136,146" fill="none" stroke="black"/>
              <path d="M 216,144 Q 218,140.8 220,144 Q 222,147.2 224,144 Q 226,140.8 228,144 Q 230,147.2 232,144 Q 234,140.8 236,144 Q 238,147.2 240,144 Q 242,140.8 244,144 Q 246,147.2 248,144 Q 250,140.8 252,144 Q 254,147.2 256,144 Q 258,140.8 260,144 Q 262,147.2 264,144 Q 266,140.8 268,144 Q 270,147.2 272,144 " fill="none" stroke="black"/>
              <path d="M 8,160 L 80,160" fill="none" stroke="black"/>
              <path d="M 136,160 L 216,160" fill="none" stroke="black"/>
              <path d="M 272,160 L 344,160" fill="none" stroke="black"/>
              <path d="M 80,192 L 88,192" fill="none" stroke="black"/>
              <path d="M 264,192 L 272,192" fill="none" stroke="black"/>
              <path d="M 88,192 C 96.83064,192 104,184.83064 104,176" fill="none" stroke="black"/>
              <path d="M 264,192 C 255.16936,192 248,184.83064 248,176" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="256,160 244,154.4 244,165.6" fill="black" transform="rotate(270,248,160)"/>
              <polygon class="arrowhead" points="112,160 100,154.4 100,165.6" fill="black" transform="rotate(270,104,160)"/>
              <polygon class="arrowhead" points="72,128 60,122.4 60,133.6" fill="black" transform="rotate(180,64,128)"/>
              <polygon class="arrowhead" points="72,96 60,90.4 60,101.6" fill="black" transform="rotate(180,64,96)"/>
              <circle cx="200" cy="64" r="6" class="closeddot" fill="black"/>
              <circle cx="328" cy="64" r="6" class="closeddot" fill="black"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="176" y="52">Gateway</text>
                <text x="308" y="52">Origin</text>
                <text x="172" y="84">GOAWAY</text>
                <text x="228" y="116">HTTP</text>
                <text x="288" y="116">Responses</text>
                <text x="56" y="196">TLS</text>
                <text x="296" y="196">TLS</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+      +---------+      +--------+
| Client |      | Gateway |      | Origin |
|        |      |       * |      |      * |
|        +======+ GOAWAY| +~~~~~~+      | |
|      <----------------+               | |
|                         HTTP Responses| |
|      <--------------------------------+ |
|        +======+         +~~~~~~+        |
+--------+  ^   +---------+   ^  +--------+
            |                 |
     TLS --'                   '-- TLS
]]></artwork>
        </artset>
      </figure>
      <t>However, GOAWAY is not well suited for cases where there is a single long-lived
request. For example, this happens when the client sends a CONNECT (see
<xref section="9.3.6" sectionFormat="of" target="HTTP"/>) or connect-udp (see <xref target="CONNECT-UDP"/>)
request to the proxy, and then uses the newly established tunnel as the
underlying transport to then establish a second HTTP connection directly to the
origin. In that situation, the proxy cannot inspect the contents of the tunnel,
nor inject any data into it; the proxy only sees a single long-lived request.
The proxy is responsible for managing the lifetime of the tunnel, but can only
terminate it abortively. Such abrupt termination can lead to truncated content,
which the client cannot safely request again.</t>
      <t>To avoid user-visible failures, it is best for the proxy to inform the client
of upcoming request stream terminations in advance of the actual termination so
that the client can wrap up existing operations related to that stream and
start sending new work to a different stream or connection.</t>
      <figure anchor="diagram-proxy">
        <name>Proxy Sends WRAP_UP</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="352" viewBox="0 0 352 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,192" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,80" fill="none" stroke="black"/>
              <path d="M 80,160 L 80,192" fill="none" stroke="black"/>
              <path d="M 104,192 L 104,208" fill="none" stroke="black"/>
              <path d="M 136,32 L 136,80" fill="none" stroke="black"/>
              <path d="M 136,160 L 136,192" fill="none" stroke="black"/>
              <path d="M 200,64 L 200,96" fill="none" stroke="black"/>
              <path d="M 216,32 L 216,112" fill="none" stroke="black"/>
              <path d="M 216,160 L 216,192" fill="none" stroke="black"/>
              <path d="M 248,176 L 248,208" fill="none" stroke="black"/>
              <path d="M 272,32 L 272,112" fill="none" stroke="black"/>
              <path d="M 272,160 L 272,192" fill="none" stroke="black"/>
              <path d="M 328,64 L 328,144" fill="none" stroke="black"/>
              <path d="M 344,32 L 344,192" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 136,32 L 216,32" fill="none" stroke="black"/>
              <path d="M 272,32 L 344,32" fill="none" stroke="black"/>
              <path d="M 80,78 L 136,78" fill="none" stroke="black"/>
              <path d="M 80,82 L 136,82" fill="none" stroke="black"/>
              <path d="M 64,96 L 200,96" fill="none" stroke="black"/>
              <path d="M 80,112 Q 82,108.8 84,112 Q 86,115.2 88,112 Q 90,108.8 92,112 Q 94,115.2 96,112 Q 98,108.8 100,112 Q 102,115.2 104,112 Q 106,108.8 108,112 Q 110,115.2 112,112 Q 114,108.8 116,112 Q 118,115.2 120,112 Q 122,108.8 124,112 Q 126,115.2 128,112 Q 130,108.8 132,112 Q 134,115.2 136,112 Q 138,108.8 140,112 Q 142,115.2 144,112 Q 146,108.8 148,112 Q 150,115.2 152,112 Q 154,108.8 156,112 Q 158,115.2 160,112 Q 162,108.8 164,112 Q 166,115.2 168,112 Q 170,108.8 172,112 Q 174,115.2 176,112 Q 178,108.8 180,112 Q 182,115.2 184,112 Q 186,108.8 188,112 Q 190,115.2 192,112 Q 194,108.8 196,112 Q 198,115.2 200,112 Q 202,108.8 204,112 Q 206,115.2 208,112 Q 210,108.8 212,112 Q 214,115.2 216,112 Q 218,108.8 220,112 Q 222,115.2 224,112 Q 226,108.8 228,112 Q 230,115.2 232,112 Q 234,108.8 236,112 Q 238,115.2 240,112 Q 242,108.8 244,112 Q 246,115.2 248,112 Q 250,108.8 252,112 Q 254,115.2 256,112 Q 258,108.8 260,112 Q 262,115.2 264,112 Q 266,108.8 268,112 Q 270,115.2 272,112 " fill="none" stroke="black"/>
              <path d="M 64,144 L 328,144" fill="none" stroke="black"/>
              <path d="M 80,160 Q 82,156.8 84,160 Q 86,163.2 88,160 Q 90,156.8 92,160 Q 94,163.2 96,160 Q 98,156.8 100,160 Q 102,163.2 104,160 Q 106,156.8 108,160 Q 110,163.2 112,160 Q 114,156.8 116,160 Q 118,163.2 120,160 Q 122,156.8 124,160 Q 126,163.2 128,160 Q 130,156.8 132,160 Q 134,163.2 136,160 Q 138,156.8 140,160 Q 142,163.2 144,160 Q 146,156.8 148,160 Q 150,163.2 152,160 Q 154,156.8 156,160 Q 158,163.2 160,160 Q 162,156.8 164,160 Q 166,163.2 168,160 Q 170,156.8 172,160 Q 174,163.2 176,160 Q 178,156.8 180,160 Q 182,163.2 184,160 Q 186,156.8 188,160 Q 190,163.2 192,160 Q 194,156.8 196,160 Q 198,163.2 200,160 Q 202,156.8 204,160 Q 206,163.2 208,160 Q 210,156.8 212,160 Q 214,163.2 216,160 Q 218,156.8 220,160 Q 222,163.2 224,160 Q 226,156.8 228,160 Q 230,163.2 232,160 Q 234,156.8 236,160 Q 238,163.2 240,160 Q 242,156.8 244,160 Q 246,163.2 248,160 Q 250,156.8 252,160 Q 254,163.2 256,160 Q 258,156.8 260,160 Q 262,163.2 264,160 Q 266,156.8 268,160 Q 270,163.2 272,160 " fill="none" stroke="black"/>
              <path d="M 80,174 L 136,174" fill="none" stroke="black"/>
              <path d="M 80,178 L 136,178" fill="none" stroke="black"/>
              <path d="M 8,192 L 80,192" fill="none" stroke="black"/>
              <path d="M 136,192 L 216,192" fill="none" stroke="black"/>
              <path d="M 272,192 L 344,192" fill="none" stroke="black"/>
              <path d="M 80,224 L 88,224" fill="none" stroke="black"/>
              <path d="M 264,224 L 272,224" fill="none" stroke="black"/>
              <path d="M 88,224 C 96.83064,224 104,216.83064 104,208" fill="none" stroke="black"/>
              <path d="M 264,224 C 255.16936,224 248,216.83064 248,208" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="256,176 244,170.4 244,181.6" fill="black" transform="rotate(270,248,176)"/>
              <polygon class="arrowhead" points="112,192 100,186.4 100,197.6" fill="black" transform="rotate(270,104,192)"/>
              <polygon class="arrowhead" points="72,144 60,138.4 60,149.6" fill="black" transform="rotate(180,64,144)"/>
              <polygon class="arrowhead" points="72,96 60,90.4 60,101.6" fill="black" transform="rotate(180,64,96)"/>
              <circle cx="200" cy="64" r="6" class="closeddot" fill="black"/>
              <circle cx="328" cy="64" r="6" class="closeddot" fill="black"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="176" y="52">Proxy</text>
                <text x="308" y="52">Origin</text>
                <text x="168" y="84">WRAP_UP</text>
                <text x="228" y="132">HTTP</text>
                <text x="288" y="132">Responses</text>
                <text x="56" y="228">TLS</text>
                <text x="296" y="228">TLS</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+      +---------+      +--------+
| Client |      |  Proxy  |      | Origin |
|        |      |       * |      |      * |
|        +======+WRAP_UP| |      |      | |
|      <----------------+ |      |      | |
|        +~~~~~~~~~~~~~~~~+~~~~~~+      | |
|                         HTTP Responses| |
|      <--------------------------------+ |
|        +~~~~~~+~~~~~~~~~+~~~~~~+        |
|        +======+         |   ^  +        |
+--------+  ^   +---------+   |  +--------+
            |                 |
     TLS --'                   '-- TLS
]]></artwork>
        </artset>
      </figure>
      <t>This document specifies a new "WRAP_UP" capsule (see <xref section="3" sectionFormat="of" target="HTTP-DGRAM"/>) that allows a proxy to instruct a client that it should
not start new requests on a tunneled connection, while still allowing it to
finish existing requests.</t>
      <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>This document uses the terms "connection", "client", and "server" from
<xref section="3.3" sectionFormat="of" target="HTTP"/> and the terms "intermediary", "proxy", and "gateway"
from <xref section="3.7" sectionFormat="of" target="HTTP"/>.</t>
      </section>
    </section>
    <section anchor="mechanism">
      <name>Mechanism</name>
      <t>This document defines the "WRAP_UP" capsule (see <xref target="iana"/> for the value). The
WRAP_UP capsule allows a proxy to indicate to a client that it wishes to close
the request stream that the capsule was sent on. The WRAP_UP capsule has no
Capsule Value.</t>
      <section anchor="proxy-behavior">
        <name>Proxy Behavior</name>
        <t>Proxies often know in advance that they will close a request stream. This can
be due to maintenance of the proxy itself, load balancing, or applying data
usage limits on a particular stream. When a proxy has advance notice that it
will soon close a request stream, it <bcp14>MAY</bcp14> send a WRAP_UP capsule to share that
information with the client. This can also be used when the proxy wishes to
release resources associated with a request stream, such as HTTP Datagrams (see
<xref section="2" sectionFormat="of" target="HTTP-DGRAM"/>) or WebTransport streams (see
<xref target="WEBTRANSPORT"/>).</t>
      </section>
      <section anchor="client-handling">
        <name>Client Handling</name>
        <t>When a client receives a WRAP_UP capsule on a request stream, it <bcp14>SHOULD</bcp14> try to
wrap up its use of that stream. For example, if the stream carried a
connect-udp request and is used as the underlying transport for an HTTP/3
connection, then after receiving a WRAP_UP capsule the client <bcp14>SHOULD NOT</bcp14> send
any new requests on the proxied HTTP/3 connection - but existing in-progress
proxied requests are not affected by the WRAP_UP capsule.</t>
      </section>
      <section anchor="minutiae">
        <name>Minutiae</name>
        <t>Clients <bcp14>MUST NOT</bcp14> send the WRAP_UP capsule. If a server receives a WRAP_UP
capsule, it <bcp14>MUST</bcp14> abort the corresponding request stream. Endpoints <bcp14>MUST NOT</bcp14>
send the WRAP_UP capsule with a non-zero Capsule Length. If an endpoint
receives a WRAP_UP capsule with a non-zero Capsule Length, it <bcp14>MUST</bcp14> abort the
corresponding request stream. Proxies <bcp14>MUST NOT</bcp14> send more than one WRAP_UP
capsule on a given stream. If a client receives a second WRAP_UP capsule on a
given request stream, it <bcp14>MUST</bcp14> abort the stream.</t>
        <t>Endpoints that abort the request stream due to an unexpected or malformed
WRAP_UP capsule received over HTTP/3 <bcp14>SHOULD</bcp14> use the H3_DATAGRAM_ERROR error
code when aborting the stream.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>While it might be tempting for clients to implement the WRAP_UP capsule by
treating it as if they had received a GOAWAY inside the encryption of the
end-to-end connection, doing so has security implications. GOAWAY carries
semantics around which requests have been acted on, and those can have security
implications. Since WRAP_UP is sent by a proxy outside of the end-to-end
encryption, it cannot be trusted to ascertain whether any requests were handled
by the origin. Because of this, client implementations can only use receipt of
WRAP_UP as a hint and <bcp14>MUST NOT</bcp14> use it to make determinations on whether any
requests were handled by the origin or not.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document (if approved) will request IANA to add the following entry to the
"HTTP Capsule Types" registry maintained at
&lt;<eref target="https://www.iana.org/assignments/masque"/>&gt;.</t>
      <dl spacing="compact" newline="false">
        <dt>Value:</dt>
        <dd>
          <t>0x272DDA5E (will be changed to a lower value if this document is approved)</t>
        </dd>
        <dt>Capsule Type:</dt>
        <dd>
          <t>WRAP_UP</t>
        </dd>
        <dt>Status:</dt>
        <dd>
          <t>provisional (will be permanent if this document is approved)</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This document</t>
        </dd>
        <dt>Change Controller:</dt>
        <dd>
          <t>IETF</t>
        </dd>
        <dt>Contact:</dt>
        <dd>
          <t>ietf-http-wg@w3.org</t>
        </dd>
        <dt>Notes:</dt>
        <dd>
          <t>None</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <displayreference target="H2" to="HTTP/2"/>
    <displayreference target="H3" to="HTTP/3"/>
    <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="HTTP-DGRAM">
          <front>
            <title>HTTP Datagrams and the Capsule Protocol</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes HTTP Datagrams, a convention for conveying multiplexed, potentially unreliable datagrams inside an HTTP connection.</t>
              <t>In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or undesirable, HTTP Datagrams can be sent using the Capsule Protocol, which is a more general convention for conveying data in HTTP connections.</t>
              <t>HTTP Datagrams and the Capsule Protocol are intended for use by HTTP extensions, not applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9297"/>
          <seriesInfo name="DOI" value="10.17487/RFC9297"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="H2">
          <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="H3">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="CONNECT-UDP">
          <front>
            <title>Proxying UDP in HTTP</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
        <reference anchor="WEBTRANSPORT">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Facebook</organization>
            </author>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="4" month="March" year="2024"/>
            <abstract>
              <t>   WebTransport [OVERVIEW] is a protocol framework that enables clients
   constrained by the Web security model to communicate with a remote
   server using a secure multiplexed transport.  This document describes
   a WebTransport protocol that is based on HTTP/3 [HTTP3] and provides
   support for unidirectional streams, bidirectional streams and
   datagrams, all multiplexed within the same HTTP/3 connection.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-09"/>
        </reference>
      </references>
    </references>
    <?line 248?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This mechanism was inspired by the GOAWAY frame from HTTP/2.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
vJcmJAAA

-->

</rfc>
