<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-wrap-up-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>The HTTP Wrap Up Capsule</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-wrap-up-01"/>
    <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>
    <author fullname="Lucas Pardue">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTPBIS</workgroup>
    <keyword>secure</keyword>
    <keyword>tunnels</keyword>
    <keyword>masque</keyword>
    <keyword>http-ng</keyword>
    <abstract>
      <?line 56?>

<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://httpwg.org/http-extensions/draft-ietf-httpbis-wrap-up.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-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/httpwg/http-extensions/labels/wrap-up"/>.</t>
    </note>
  </front>
  <middle>
    <?line 69?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="H1"/>, <xref target="H2"/> and <xref target="H3"/> all have the notion of persistent connections, where
a single connection can carry multiple request and response messages. While it
is expected that the connection persists, there are situations where a client
or server may wish to terminate the connection gracefully.</t>
      <t>An HTTP/1.1 connection can be terminated by using a Connection header field
with the close option; see <xref section="9.6" sectionFormat="of" target="H1"/>. When a connection has
short-lived requests/responses, this mechanism allows timely and non-disruptive
connection termination. However, when requests/responses are longer lived, the
opportunity to use headers happens less frequently (or not at all). There is no
way for client or server to signal a future intent to terminate the connection.
Instead, an abrupt termination, realized via a transport-layer close or reset,
is required, which is potentially disruptive and can lead to truncated content.</t>
      <t>HTTP/2 and HTTP/3 support request multiplexing, making header-based connection
lifecycle control impractical. Connection headers are prohibited entirely.
Instead, a shutdown process using the GOAWAY frame is defined (see <xref section="6.8" sectionFormat="of" target="H2"/> and <xref section="5.2" sectionFormat="of" target="H3"/>). GOAWAY signals a future intent to
terminate the connection, supporting cases such as scheduled maintenance.
Active requests/responses can continue to run, while new requests need to be
sent on a new HTTP connection. Endpoints that use GOAWAY typically have a grace
period in which requests/responses can run naturally to completion. If they run
longer than the grace period, they are abruptly terminated when the
transport layer is closed or reset, which is potentially disruptive and can
lead to truncated content.</t>
      <section anchor="the-need-for-a-request-termination-intent-signal">
        <name>The Need for a Request Termination Intent Signal</name>
        <t>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. For example,
if a gateway has a client HTTP/2 connection and needs to go down for
maintenance, it can send a GOAWAY to stop the client issuing requests that
would be forwarded to the origin.</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 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 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="244" y="84">~~~~~~</text>
                  <text x="228" y="116">HTTP</text>
                  <text x="288" y="116">Responses</text>
                  <text x="244" y="148">~~~~~~</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>The connection close details described above apply to an intermediary's
upstream and downstream connections. Since a proxy can do request aggregation
or fan out, there is no guarantee of a 1:1 ratio of upstream/downstream. As
such, the lifetimes of these connections are not coupled tightly. For example,
a gateway can terminate a client HTTP/2 connections and map individual requests
to an origin HTTP/1.1 connection pool. If any single origin connection
indicates an intent to close, it doesn't make sense for the gateway to issue a
GOAWAY to the client, or to respond to a client GOAWAY by closing connections
in the pool.</t>
        <t>Long-lived requests pose a problem for maintenance, especially for HTTP/2 and
HTTP/3, and even more so for intermediaries. Sometimes they need to terminate
individual request streams in order to facilitate load balancing or impose data
limits, while leaving the connection still active. GOAWAY is not suitable for
this task.</t>
        <t>Some applications using HTTP have their own control plane running over HTTP,
that could be used for a graceful termination. For example, WebSockets has
separate control and data frames. The Close frame (<xref section="5.5.1" sectionFormat="of" target="WEBSOCKET"/>) is used for the WebSocket close sequence. However, in the
maintenance scenario, an intermediary that is not WebSocket aware cannot use
the formal sequence. Nor is there any standard for it to signal to the
endpoints to initiate that sequence. Some intermediaries are WebSocket aware,
and in theory could send Close frames. However, there can be other
considerations that prevent this working effectively in real deployments, since
the intermediary is a generic proxy that may invalidate endpoint expectations.</t>
        <t>Many long-lived HTTP request types do not have control messages that could
signal an intent to terminate the request. For example, see CONNECT (<xref section="9.3.6" sectionFormat="of" target="HTTP"/>) or connect-udp ({?CONNECT-UDP=RFC9298}}). In these models, the
client requests that a proxy create a tunnel to a target origin. On success,
the newly established tunnel is used 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. This is especially disruptive if the tunnelled HTTP
connection has many active requests. Web browsers, for example, commonly cannot
retry failed proxied requests when they cannot ascertain whether an in-progress
request was acted on.</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.
This allows the client to wrap up existing operations related to that stream
and start sending new work to a different stream or connection.</t>
      </section>
      <section anchor="the-wrapup-capsule">
        <name>The WRAP_UP Capsule</name>
        <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 64,144 L 328,144" 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="144" y="116">+~~~~~~~~~~~~~~~~</text>
                  <text x="244" y="116">~~~~~~</text>
                  <text x="228" y="132">HTTP</text>
                  <text x="288" y="132">Responses</text>
                  <text x="108" y="164">~~~~~~</text>
                  <text x="176" y="164">~~~~~~~~~</text>
                  <text x="244" y="164">~~~~~~</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"/>), which a server can send on an HTTP Data Stream, to
inform a client that it intends to close the stream.</t>
        <t>An HTTP proxy can send a WRAP_UP capsule 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>
      <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. Endpoints that abort the
request stream due to an unexpected or malformed WRAP_UP capsule <bcp14>MUST</bcp14> follow
the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DGRAM"/>.</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="H1" to="HTTP/1.1"/>
    <displayreference target="H2" to="HTTP/2"/>
    <displayreference target="H3" to="HTTP/3"/>
    <references anchor="sec-combined-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="H1">
          <front>
            <title>HTTP/1.1</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 specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <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="WEBSOCKET">
          <front>
            <title>The WebSocket Protocol</title>
            <author fullname="I. Fette" initials="I." surname="Fette"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6455"/>
          <seriesInfo name="DOI" value="10.17487/RFC6455"/>
        </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="3" month="March" year="2025"/>
            <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-12"/>
        </reference>
      </references>
    </references>
    <?line 310?>

<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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
tdQIMYB7jMupSdOQZTVvQp1Sb7KHuJSnYbMWO/G6ZCjREXW33+YZDcW5pV/c
4weUi50j5qQoyakqXyivQldez2aarRXuaHKuApErGnQ2pDCVeDn15GsIJc2B
DUuTxB4QLUK9BpPfoZakwwYZBRMaG54dmPw5ibXTiGRTj25K5wbUkWLlsf1H
A4xNE9lauYjFcH5vGRzobhg74eLjy4uLV8e3HbsVz8eHoRcBlshS227ZqE4L
DP0+zBq9PfEQ+uD5N1yzneYhFS1tqjPfphEhqvYQXps3IW9OOL7/5eNwpcq5
riLWk5c5IW2qNoesBpRV0BVoIZYYt6Cw5ydHl1JsurLOof9szUGqqVe8veai
mU5FrU5sqLq7oSwFpE4qDxI62NPvkgw7dp48Ww0QIKWZnIJ808CqItCn357b
IZRLQf1fNIyMgeMKNGiFqf4qW4rcO4auyN5CytxuYPtI5CdwZ4KBIfV8hc8/
uZrHaB2hwyY/09qDdl6wNSC4OxBT6V1kLG646Nnqnzzc3ojVYL/XC0EJp2bk
eS1wUiZ2ZKkb2KbKTuVounxnwXlEv1tGW16HPNQ2R3ud+SFHs8YdNvr04t/t
08vdfXqxs08P0PqbjXq52ajvdJw3OvTi/g69/MMd+rFgNcQ+Yqs6rExdevmH
uvTiN7r08je69E0zILTjm3PhP60UlFcs1z+7FAz8ftwY+3ApeO/YpkJrP/eW
mDs+f1bZ2Ft5iwf5YIlJb6hsbMc+XGJ+/P8oMYNP+QLTG4IvL+PpD9eXf+ic
aKvzRGCQ+06jk9fXR+chdX6N1Bnjo4o97qZ5wh0Xr7YTShA37BtD6n8G7986
bWIU4PszHkqS64YisjnZ6NStoUkT/Spy/ztOtMTuEy3575xoiQdOtOD5xzYn
7NaUoCfUXTa+JOPC/z1CMd0ccHJw/vbmdjD0f+XFJX+/fvWfb0+vX53Q95s3
R2dnzRcRRty8uXx7dtJ+a2ceX56fv7o48ZPxVPYeicH50U8DX7QNLq9uTy8v
js4GHr927YWQrm/nMY4EGK0Yq4i2M4E5L4+v/vd/9p/CbP4C8zjY33/+6VP4
8c3+10/xgzKPX42zlf9JmUjQKYsqObZDvNAjyi1CYdT4XlDtRDAZ4vzy7ySZ
f0zkt9Ok2H/6XXhAG+49jDLrPWSZbT/ZmuyFuOPRjmUaafaeb0i6z+/RT73f
Ue6dh99+T51OOdr/5vvvxKbz1s7XzZzvYDKtjZKOvbFHnXqXHKDssEvRbSQf
tiiZR3bodUsFosjeFgmGHsVAEMXt1rSnSGYvz+Np3ib//nDFb+HewGOA+sBa
hA2oSWrtD9nEprPvOs32TZheayS6Px2m6jbCiE6R0cCN5vw2LEG4J5yNjHuJ
PA4g1JZbEfK6/Bux653fx+OXGqWQsaUQV4zGCFAj0sn3uV11AU1cmc58yQ8y
34/p8xcwJh1AwCNTf7rTrawDLAqQunI6mw23Ov3UV6A+IsUr7pHUVJ2FCyE+
DBaIjiapMzhmXDkc73rS3G4PnNOxe9yAqQSz72zTytzcA4PDczokuzeCuwWH
HWqqN/d3QK9zJE16bYXhjx5i3ySC3MBqo3VgWUB9Rzp3ti4TyoHO2cT4UyIi
vs1rPC1pchnlXX880/Gqg+gBPkeG+hOwvblt1zSxwkxqr9xeH13cXF1e3744
HZ3wNanRSk+56uM7aHyk6PNIaGzCEREe5kLEs/ZYpSaaLtLtkCZrc4cCQlSr
+NKMiMCY9E9ne2xGqrW6XgUeCpnYXlZlSTWGEt1yu3t34vcUuNzryuNVqW7u
rXincJkybNNfW9iymhbotwGbTUxQSbWZ6KN5GN2cW3cqsRFXlU1O79ZDWyVV
7Fkr7sj4uxXVdpzwejw3eV0ZBfjvNepkTGHeG3ZN5MZzRFjbmhZhnHcrosZ1
b6jhy9Aq3q6sume6kQlxHxPRO+guxs+6tLGMkWc6n1eL0Bxv2kbiAYN8mNKO
XYiHdxGjal+Q3ILmw2Kb601ReaeYG+pVRzIs5G13Ck2WXV4lPIFdwa2vhW15
+2ZSs8GNHBTCOniv8+ZiEbdDMoqFepsdXnBmKRtyUtNlacvRIkQLf+shpWsI
8XYD8s5OSBDDF6fxG7rHSvdijntdSQo+/uaTXNL5jL9atCzYVdqrL76nShFj
6XPwtlFN14J2XAU0jfhgwon/QqVRC52TWMNsMCmdJ+W6iNe9Qi93VNkRKb8b
PlJL1JEdFpzIw46Ir9i1b/r9PpJR/3ypgNkT8m2LaLVxg8G3NqeawlJoiAwD
kKJ0R+mIR8TFRH8xfwIXRWECukDQiKnV1hVvM6Tydl+i3XQ8qqbAQ+Ivaxd6
F7saOutOA4hazmwYOhUhUsUO4UudqCb4GyDweNodlRg6JU23reZcCi0VdMmy
QWd8Er+g7jFJpfFLGu2b8HwAlupea8f2GBY7GZY9hqW/hsWmenp0cbRhpvKX
zxhJbmLQR3RtoOBbDekXHmtF/2MqJMPUB0HvUdxuz32iZEsbMBaIceuWut4D
vjrtaFB760ECvnz79388ipfPV6vVmFji6+dAHmaec7N+z98M/+I7bIXh40SI
iXzy4eDrg5OTo2ev5CPmEnomWD0Pegaqg2w8PPZ+090ldcDiJoXo8srEY0AU
dIW7dvyMr5HQXXiVtSsW0JHKmeLDS1xrboMlnn5P5Fif+SYF0XFARv+mQYR/
4yDoIfyIn+z6FwTiwlbac3iBWE7tD1coArIvBnRZCHMH3FyHyF8MZkCCmroe
oxGSuErek3UcJQS2YUBzljdI+H9ZodPOhNv+PUTC/dQOp5ty0e56d8W4CvKn
oGPxf2rcquYKMgAA

-->

</rfc>
