<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.2) -->
<?rfc-ext html-pretty-print="prettyprint https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"?>
<rfc xmlns:x="http://purl.org/net/xml2rfc/ext"
     category="std"
     consensus="true"
     docName="draft-ietf-httpbis-wrap-up-01"
     ipr="trust200902"
     sortRefs="true"
     submissionType="IETF"
     symRefs="true"
     tocInclude="true">
   <x:feedback template="mailto:ietf-http-wg@w3.org?subject={docname},%20%22{section}%22\&amp;amp;body=%3c{ref}%3e:"/>
   <front>
      <title>The HTTP Wrap Up Capsule</title>
      <author fullname="David Schinazi" initials="D." surname="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 day="07" month="July" year="2025"/>
      <area>Web and Internet Transport</area>
      <workgroup>HTTPBIS</workgroup>
      <keyword>secure</keyword>
      <keyword>tunnels</keyword>
      <keyword>masque</keyword>
      <keyword>http-ng</keyword>
      <abstract><?line 57?>
         <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" title="About This Document">
         <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 70?>
      <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" title="Gateway Sends GOAWAY">
               <artset>
                  <artwork type="svg">
                     <svg xmlns="http://www.w3.org/2000/svg"
                          class="diagram"
                          font-family="monospace"
                          font-size="13px"
                          height="208"
                          stroke-linecap="round"
                          text-anchor="middle"
                          version="1.1"
                          viewBox="0 0 352 208"
                          width="352">
                        <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"
                                 fill="black"
                                 points="256,160 244,154.4 244,165.6"
                                 transform="rotate(270,248,160)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="112,160 100,154.4 100,165.6"
                                 transform="rotate(270,104,160)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="72,128 60,122.4 60,133.6"
                                 transform="rotate(180,64,128)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="72,96 60,90.4 60,101.6"
                                 transform="rotate(180,64,96)"/>
                        <circle class="closeddot" cx="200" cy="64" fill="black" r="6"/>
                        <circle class="closeddot" cx="328" cy="64" fill="black" r="6"/>
                        <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">
+--------+      +---------+      +--------+
| Client |      | Gateway |      | Origin |
|        |      |       * |      |      * |
|        +======+ GOAWAY| +~~~~~~+      | |
|      &lt;----------------+               | |
|                         HTTP Responses| |
|      &lt;--------------------------------+ |
|        +======+         +~~~~~~+        |
+--------+  ^   +---------+   ^  +--------+
            |                 |
     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" title="Proxy Sends WRAP_UP">
               <artset>
                  <artwork type="svg">
                     <svg xmlns="http://www.w3.org/2000/svg"
                          class="diagram"
                          font-family="monospace"
                          font-size="13px"
                          height="240"
                          stroke-linecap="round"
                          text-anchor="middle"
                          version="1.1"
                          viewBox="0 0 352 240"
                          width="352">
                        <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"
                                 fill="black"
                                 points="256,176 244,170.4 244,181.6"
                                 transform="rotate(270,248,176)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="112,192 100,186.4 100,197.6"
                                 transform="rotate(270,104,192)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="72,144 60,138.4 60,149.6"
                                 transform="rotate(180,64,144)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="72,96 60,90.4 60,101.6"
                                 transform="rotate(180,64,96)"/>
                        <circle class="closeddot" cx="200" cy="64" fill="black" r="6"/>
                        <circle class="closeddot" cx="328" cy="64" fill="black" r="6"/>
                        <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">
+--------+      +---------+      +--------+
| Client |      |  Proxy  |      | Origin |
|        |      |       * |      |      * |
|        +======+WRAP_UP| |      |      | |
|      &lt;----------------+ |      |      | |
|        +~~~~~~~~~~~~~~~~+~~~~~~+      | |
|                         HTTP Responses| |
|      &lt;--------------------------------+ |
|        +~~~~~~+~~~~~~~~~+~~~~~~+        |
|        +======+         |   ^  +        |
+--------+  ^   +---------+   |  +--------+
            |                 |
     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 newline="false" spacing="compact">
            <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" title="References">
         <references anchor="sec-normative-references" title="Normative References">
            <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"/>
               </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"/>
               </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"/>
               </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"/>
               </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" title="Informative References">
            <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"/>
               </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"/>
               </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"/>
               </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"/>
               </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="7" month="July" year="2025"/>
               </front>
               <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-13"/>
            </reference>
         </references>
      </references>
      <?line 311?>
      <section anchor="acknowledgments" numbered="false">
         <name>Acknowledgments</name>
         <t>This mechanism was inspired by the GOAWAY frame from HTTP/2.</t>
      </section>
   </back>
</rfc>
