<?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.35 (Ruby 3.4.7) -->
<?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-connect-tcp-11"
     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 abbrev="Templated CONNECT-TCP">Template-Driven HTTP CONNECT Proxying for TCP</title>
      <author fullname="Benjamin M. Schwartz" initials="B. M." surname="Schwartz">
         <organization>Meta Platforms, Inc.</organization>
         <address>
            <email>ietf@bemasc.net</email>
         </address>
      </author>
      <date day="23" month="March" year="2026"/>
      <area>wit</area>
      <workgroup>httpbis</workgroup>
      <abstract><?line 34?>
         <t>TCP proxying using HTTP CONNECT has long been part of the core HTTP specification. However, this proxying functionality has several important deficiencies in modern HTTP environments. This specification defines an alternative HTTP proxy service configuration for TCP connections. This configuration is described by a URI Template, similar to the CONNECT-UDP and CONNECT-IP protocols.</t>
      </abstract>
   </front>
   <middle><?line 38?>
      <section anchor="introduction">
         <name>Introduction</name>
         <section anchor="history">
            <name>History</name>
            <t>HTTP has used the CONNECT method for proxying TCP connections since HTTP/1.1. When using CONNECT, the request target specifies a host and port number, and the proxy forwards TCP payloads between the client and this destination (<xref section="9.3.6" sectionFormat="comma" target="RFC9110"/>). To date, this is the only mechanism defined for proxying TCP over HTTP. In this specification, this is referred to as a "classic HTTP CONNECT proxy".</t>
            <t>HTTP/3 uses a UDP transport, so it cannot be forwarded using the pre-existing CONNECT mechanism. To enable forward proxying of HTTP/3, the MASQUE effort has defined proxy mechanisms that are capable of proxying UDP datagrams <xref target="CONNECT-UDP"/>, and more generally IP datagrams <xref target="CONNECT-IP"/>. The destination host and port number (if applicable) are encoded into the HTTP resource path, and end-to-end datagrams are wrapped into HTTP Datagrams <xref target="RFC9297"/> on the client-proxy path.</t>
         </section>
         <section anchor="problems">
            <name>Problems</name>
            <t>HTTP clients can be configured to use proxies by selecting a proxy hostname, a port, and whether to use a security protocol. However, Classic HTTP CONNECT requests using the proxy do not carry this configuration information. Instead, they only indicate the hostname and port of the target. This prevents any HTTP server from hosting multiple distinct proxy services, as the server cannot distinguish them by path (as with distinct resources) or by origin (as in "virtual hosting").</t>
            <t>The absence of an explicit origin for the proxy also rules out the usual defenses against server port misdirection attacks (see <xref section="7.4" sectionFormat="of" target="RFC9110"/>) and creates ambiguity about the use of origin-scoped response header fields (e.g., "Alt-Svc" <xref target="RFC7838"/>, "Strict-Transport-Security" <xref target="RFC6797"/>).</t>
            <t>Classic HTTP CONNECT requests cannot carry in-stream metadata. For example, the WRAP_UP capsule <xref target="I-D.schinazi-httpbis-wrap-up"/> cannot be used with Classic HTTP CONNECT.</t>
         </section>
         <section anchor="overview">
            <name>Overview</name>
            <t>This specification describes an alternative mechanism for proxying TCP in HTTP. Like <xref target="CONNECT-UDP"/> and <xref target="CONNECT-IP"/>, the proxy service is identified by a URI Template. Proxy interactions reuse standard HTTP components and semantics, avoiding changes to the core HTTP protocol.</t>
         </section>
      </section>
      <section anchor="conventions-and-definitions">
         <name>Conventions and Definitions</name>
         <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>
            <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
         <?line -18?>
      </section>
      <section anchor="specification">
         <name>Specification</name>
         <t>A template-driven TCP transport proxy for HTTP is identified by a URI Template <xref target="RFC6570"/> containing variables named "target_host" and "target_port". This URI Template and its variable values <bcp14>MUST</bcp14> meet all the same requirements as for UDP proxying (<xref section="2" sectionFormat="comma" target="RFC9298"/>), and are subject to the same validation rules. The client <bcp14>MUST</bcp14> substitute the destination host and port number into this template to produce the request URI. The derived URI serves as the destination of a Capsule Protocol connection using the Upgrade Token "connect-tcp" (see registration in <xref target="new-upgrade-token"/>).</t>
         <t>When using "connect-tcp", TCP payload data is sent in the payload of new Capsule Types named DATA and FINAL_DATA (see registrations in <xref target="data-capsule"/>). The ordered concatenation of these capsule payloads represents the TCP payload data. A FINAL_DATA capsule additionally indicates that the sender has closed this stream, semantically equivalent to TCP FIN. After sending a FINAL_DATA capsule, an endpoint <bcp14>MUST NOT</bcp14> send any more DATA or FINAL_DATA capsules on this data stream. (See <xref target="closing-connections"/> for related requirements.)</t>
         <t>An intermediary <bcp14>MAY</bcp14> merge and split successive DATA and FINAL_DATA capsules, subject to the following requirements:</t>
         <t>
            <list style="symbols">
               <t>There are no intervening capsules of other types.</t>
               <t>The order of payload content is preserved.</t>
               <t>The final emitted capsule uses the same capsule type (DATA or FINAL_DATA) as the final input capsule, and all others use the DATA capsule type.</t>
            </list>
         </t>
         <section anchor="in-http11">
            <name>In HTTP/1.1</name>
            <t>In HTTP/1.1, the client uses the proxy by issuing a request as follows:</t>
            <t>
               <list style="symbols">
                  <t>The method <bcp14>SHALL</bcp14> be "GET".</t>
                  <t>The request's target <bcp14>SHALL</bcp14> correspond to the URI derived from expansion of the proxy's URI Template.</t>
                  <t>The request <bcp14>SHALL</bcp14> include a single "Host" header field containing the origin of the proxy.</t>
                  <t>The request <bcp14>SHALL</bcp14> include a "Connection" header field with the value "Upgrade". (Note that this requirement is case-insensitive as per <xref section="7.6.1" sectionFormat="of" target="RFC9110"/>.)</t>
                  <t>The request <bcp14>SHALL</bcp14> include an "Upgrade" header field with the value "connect-tcp".</t>
                  <t>The request <bcp14>SHOULD</bcp14> include a "Capsule-Protocol: ?1" header (as recommended in <xref section="3.4" sectionFormat="comma" target="RFC9297"/>).</t>
               </list>
            </t>
            <t>If the request is well-formed and permissible, the proxy <bcp14>MUST</bcp14> attempt to establish the TCP connection before sending any response status code other than "100 (Continue)" (see <xref target="conveying-metadata"/>). If the TCP connection is successful, the response <bcp14>SHALL</bcp14> be as follows:</t>
            <t>
               <list style="symbols">
                  <t>The HTTP status code <bcp14>SHALL</bcp14> be "101 (Switching Protocols)".</t>
                  <t>The response <bcp14>SHALL</bcp14> include a "Connection" header field with the value "Upgrade".</t>
                  <t>The response <bcp14>SHALL</bcp14> include a single "Upgrade" header field with the value "connect-tcp".</t>
                  <t>The response <bcp14>SHOULD</bcp14> include a "Capsule-Protocol: ?1" header (as above).</t>
               </list>
            </t>
            <t>If the request is malformed or impermissible, the proxy <bcp14>MUST</bcp14> return a 4XX error code. If a TCP connection was not established, the proxy <bcp14>MUST NOT</bcp14> switch protocols to "connect-tcp", and the client <bcp14>MAY</bcp14> reuse this connection for additional HTTP requests.</t>
            <figure title="Templated TCP proxy example in HTTP/1.1">
               <artwork>
Client                                                 Proxy

GET /proxy?target_host=192.0.2.1&amp;target_port=443 HTTP/1.1
Host: example.com
Connection: Upgrade
Upgrade: connect-tcp
Capsule-Protocol: ?1

** Proxy establishes a TCP connection to 192.0.2.1:443 **

                            HTTP/1.1 101 Switching Protocols
                            Connection: Upgrade
                            Upgrade: connect-tcp
                            Capsule-Protocol: ?1
</artwork>
            </figure>
         </section>
         <section anchor="in-http2-and-http3">
            <name>In HTTP/2 and HTTP/3</name>
            <t>In HTTP/2 and HTTP/3, the proxy <bcp14>MUST</bcp14> include SETTINGS_ENABLE_CONNECT_PROTOCOL in its SETTINGS frame <xref target="RFC8441"/>
               <xref target="RFC9220"/>. The client uses the proxy by issuing an "extended CONNECT" request as follows:</t>
            <t>
               <list style="symbols">
                  <t>The :method pseudo-header field <bcp14>SHALL</bcp14> be "CONNECT".</t>
                  <t>The :protocol pseudo-header field <bcp14>SHALL</bcp14> be "connect-tcp".</t>
                  <t>The :authority pseudo-header field <bcp14>SHALL</bcp14> contain the authority of the proxy.</t>
                  <t>The :path and :scheme pseudo-header fields <bcp14>SHALL</bcp14> contain the path and scheme of the request URI derived from the proxy's URI Template.</t>
               </list>
            </t>
            <t>A templated TCP proxying request that does not conform to all of these requirements represents a client error (see <xref section="15.5" sectionFormat="comma" target="RFC9110"/>) and may be malformed (see <xref section="8.1.1" sectionFormat="of" target="RFC9113"/> and <xref section="4.1.2" sectionFormat="of" target="RFC9114"/>).</t>
            <t>Additionally the "capsule-protocol" header field <bcp14>SHOULD</bcp14> be present with a value of "?1" (as recommended in <xref section="3.4" sectionFormat="comma" target="RFC9297"/>).</t>
            <figure title="Templated TCP proxy example in HTTP/2">
               <artwork>
HEADERS
:method = CONNECT
:scheme = https
:authority = request-proxy.example
:path = /proxy?target_host=2001%3Adb8%3A%3A1&amp;target_port=443
:protocol = connect-tcp
capsule-protocol = ?1
...
</artwork>
            </figure>
         </section>
         <section anchor="use-of-other-relevant-headers">
            <name>Use of Other Relevant Headers</name>
            <section anchor="origin-scoped-headers">
               <name>Origin-scoped Headers</name>
               <t>Ordinary HTTP headers apply only to the single resource identified in the request or response. An origin-scoped HTTP header is a special response header that is intended to change the client's behavior for subsequent requests to any resource on this origin.</t>
               <t>Unlike classic HTTP CONNECT proxies, a templated TCP proxy has an unambiguous origin of its own. Origin-scoped headers apply to this origin when they are associated with a templated TCP proxy response. Here are some origin-scoped headers that could potentially be sent by a templated TCP proxy:</t>
               <t>
                  <list style="symbols">
                     <t>"Alt-Svc" <xref target="RFC7838"/>
                     </t>
                     <t>"Strict-Transport-Security" <xref target="RFC6797"/>
                     </t>
                     <t>"Public-Key-Pins" <xref target="RFC7469"/>
                     </t>
                     <t>"Accept-CH" <xref target="RFC8942"/>
                     </t>
                     <t>"Set-Cookie" <xref target="RFC6265"/>, which has configurable scope.</t>
                     <t>"Clear-Site-Data" <xref target="CLEAR-SITE-DATA"/>
                     </t>
                  </list>
               </t>
            </section>
            <section anchor="authentication-headers">
               <name>Authentication Headers</name>
               <t>Authentication to a templated TCP proxy normally uses ordinary HTTP authentication via the "401 (Unauthorized)" response code, the "WWW-Authenticate" response header field, and the "Authorization" request header field (<xref section="11.6" sectionFormat="comma" target="RFC9110"/>). A templated TCP proxy does not use the "407 (Proxy Authentication Required)" response code and related header fields (<xref section="11.7" sectionFormat="comma" target="RFC9110"/>) because they do not traverse HTTP gateways (see <xref target="operational-considerations"/>).</t>
               <t>Clients <bcp14>SHOULD</bcp14> assume that all proxy resources generated by a single template share a protection space (i.e., a realm) (<xref section="11.5" sectionFormat="comma" target="RFC9110"/>). For many authentication schemes, this will allow the client to avoid waiting for a "401 (Unauthorized)" response before each new connection through the proxy.</t>
            </section>
         </section>
         <section anchor="closing-connections">
            <name>Closing Connections</name>
            <t>Connection termination is essentially symmetrical for proxies and their clients. In this section, we use the term "endpoint" to describe an implementation of this specification in either role.</t>
            <t>When closing connections, endpoints are subject to the following requirements:</t>
            <t>
               <list style="symbols">
                  <t>When an endpoint receives a valid TCP FIN, it <bcp14>MUST</bcp14> send a FINAL_DATA capsule.</t>
                  <t>When an endpoint receives a valid FINAL_DATA capsule, it <bcp14>MUST</bcp14> send a TCP FIN.</t>
                  <t>When a TCP connection reaches the TIME-WAIT or CLOSED state, the associated endpoint <bcp14>MUST</bcp14> close its send stream. <list style="symbols">
                        <t>If the connection closed gracefully, the endpoint <bcp14>MUST</bcp14> close the send stream gracefully.</t>
                        <t>Otherwise, the endpoint <bcp14>SHOULD</bcp14> close the send stream abruptly, using a mechanism appropriate to the HTTP version: <list style="symbols">
                              <t>HTTP/3: reset the stream with H3_CONNECT_ERROR; see <xref section="19.4" sectionFormat="comma" target="RFC9000"/> and <xref section="8.1" sectionFormat="comma" target="RFC9114"/>
                              </t>
                              <t>HTTP/2: reset the stream with CONNECT_ERROR; see <xref target="RFC9113"/>, Sections <xref target="RFC9113" x:fmt="number" x:sec="6.4"/> and <xref target="RFC9113" x:fmt="number" x:sec="7"/>
                              </t>
                              <t>HTTP/1.1 over TLS: TCP shutdown without a TLS closure alert; see <xref section="6.1" sectionFormat="comma" target="RFC8446"/>.</t>
                              <t>HTTP/1.1 without TLS: TCP RST</t>
                           </list>
                        </t>
                     </list>
                  </t>
                  <t>When the receive stream is closed abruptly or without a FINAL_DATA capsule received, the endpoint <bcp14>SHOULD</bcp14> send a TCP RST if the TCP subsystem permits it.</t>
               </list>
            </t>
            <t>The mandatory behaviors above enable endpoints to detect any truncation of incoming TCP data. The recommended behaviors propagate any TCP errors through the proxy connection.</t>
            <figure title="Simple graceful termination example (HTTP/3)">
               <artset>
                  <artwork type="svg">
                     <svg xmlns="http://www.w3.org/2000/svg"
                          class="diagram"
                          font-family="monospace"
                          font-size="13px"
                          height="176"
                          stroke-linecap="round"
                          text-anchor="middle"
                          version="1.1"
                          viewBox="0 0 472 176"
                          width="472">
                        <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                        <path d="M 24,64 L 24,160" fill="none" stroke="black"/>
                        <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                        <path d="M 128,64 L 128,160" fill="none" stroke="black"/>
                        <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,32 L 256,64" fill="none" stroke="black"/>
                        <path d="M 344,64 L 344,160" fill="none" stroke="black"/>
                        <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                        <path d="M 448,64 L 448,160" fill="none" stroke="black"/>
                        <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
                        <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                        <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                        <path d="M 256,32 L 360,32" fill="none" stroke="black"/>
                        <path d="M 400,32 L 464,32" fill="none" stroke="black"/>
                        <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,64 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                        <path d="M 24,80 L 48,80" fill="none" stroke="black"/>
                        <path d="M 96,80 L 184,80" fill="none" stroke="black"/>
                        <path d="M 280,80 L 368,80" fill="none" stroke="black"/>
                        <path d="M 416,80 L 440,80" fill="none" stroke="black"/>
                        <path d="M 24,96 L 56,96" fill="none" stroke="black"/>
                        <path d="M 88,96 L 176,96" fill="none" stroke="black"/>
                        <path d="M 296,96 L 376,96" fill="none" stroke="black"/>
                        <path d="M 408,96 L 440,96" fill="none" stroke="black"/>
                        <path d="M 32,112 L 56,112" fill="none" stroke="black"/>
                        <path d="M 88,112 L 176,112" fill="none" stroke="black"/>
                        <path d="M 296,112 L 376,112" fill="none" stroke="black"/>
                        <path d="M 408,112 L 448,112" fill="none" stroke="black"/>
                        <path d="M 136,128 L 168,128" fill="none" stroke="black"/>
                        <path d="M 304,128 L 344,128" fill="none" stroke="black"/>
                        <path d="M 24,144 L 48,144" fill="none" stroke="black"/>
                        <path d="M 104,144 L 168,144" fill="none" stroke="black"/>
                        <path d="M 304,144 L 336,144" fill="none" stroke="black"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,96 436,90.4 436,101.6"
                                 transform="rotate(0,440,96)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,80 436,74.4 436,85.6"
                                 transform="rotate(0,440,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="360,112 348,106.4 348,117.6"
                                 transform="rotate(180,352,112)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,144 332,138.4 332,149.6"
                                 transform="rotate(0,336,144)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,96 332,90.4 332,101.6"
                                 transform="rotate(0,336,96)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,80 332,74.4 332,85.6"
                                 transform="rotate(0,336,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="144,128 132,122.4 132,133.6"
                                 transform="rotate(180,136,128)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="144,112 132,106.4 132,117.6"
                                 transform="rotate(180,136,112)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,144 116,138.4 116,149.6"
                                 transform="rotate(0,120,144)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,96 116,90.4 116,101.6"
                                 transform="rotate(0,120,96)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,80 116,74.4 116,85.6"
                                 transform="rotate(0,120,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="40,112 28,106.4 28,117.6"
                                 transform="rotate(180,32,112)"/>
                        <g class="text">
                           <text x="32" y="52">TCP</text>
                           <text x="56" y="52">A</text>
                           <text x="156" y="52">Endpoint</text>
                           <text x="200" y="52">A</text>
                           <text x="300" y="52">Endpoint</text>
                           <text x="344" y="52">B</text>
                           <text x="424" y="52">TCP</text>
                           <text x="448" y="52">B</text>
                           <text x="72" y="84">"abc"</text>
                           <text x="232" y="84">DATA{"abc"}</text>
                           <text x="392" y="84">"abc"</text>
                           <text x="72" y="100">FIN</text>
                           <text x="236" y="100">FINAL_DATA{""}</text>
                           <text x="392" y="100">FIN</text>
                           <text x="72" y="116">FIN</text>
                           <text x="236" y="116">FINAL_DATA{""}</text>
                           <text x="392" y="116">FIN</text>
                           <text x="236" y="132">QUIC.STREAM{FIN}</text>
                           <text x="76" y="148">FINACK</text>
                           <text x="236" y="148">QUIC.STREAM{FIN}</text>
                        </g>
                     </svg>
                  </artwork>
                  <artwork type="ascii-art">
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +---"abc"---&gt;+-------DATA{"abc"}-------&gt;+---"abc"---&gt;|
  +----FIN----&gt;+------FINAL_DATA{""}-----&gt;+----FIN----&gt;|
  |&lt;---FIN-----+&lt;-----FINAL_DATA{""}------+&lt;---FIN-----+
  |            |&lt;----QUIC.STREAM{FIN}-----+            |
  +---FINACK--&gt;+-----QUIC.STREAM{FIN}----&gt;|            |
  |            |                          |            |
</artwork>
               </artset>
            </figure>
            <figure title="Simple TCP RST termination example (HTTP/2)">
               <artset>
                  <artwork type="svg">
                     <svg xmlns="http://www.w3.org/2000/svg"
                          class="diagram"
                          font-family="monospace"
                          font-size="13px"
                          height="112"
                          stroke-linecap="round"
                          text-anchor="middle"
                          version="1.1"
                          viewBox="0 0 472 112"
                          width="472">
                        <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                        <path d="M 24,64 L 24,96" fill="none" stroke="black"/>
                        <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                        <path d="M 128,64 L 128,96" fill="none" stroke="black"/>
                        <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,32 L 256,64" fill="none" stroke="black"/>
                        <path d="M 344,64 L 344,96" fill="none" stroke="black"/>
                        <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                        <path d="M 448,64 L 448,96" fill="none" stroke="black"/>
                        <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
                        <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                        <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                        <path d="M 256,32 L 360,32" fill="none" stroke="black"/>
                        <path d="M 400,32 L 464,32" fill="none" stroke="black"/>
                        <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,64 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                        <path d="M 24,80 L 56,80" fill="none" stroke="black"/>
                        <path d="M 88,80 L 152,80" fill="none" stroke="black"/>
                        <path d="M 312,80 L 376,80" fill="none" stroke="black"/>
                        <path d="M 408,80 L 440,80" fill="none" stroke="black"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,80 436,74.4 436,85.6"
                                 transform="rotate(0,440,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,80 332,74.4 332,85.6"
                                 transform="rotate(0,336,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,80 116,74.4 116,85.6"
                                 transform="rotate(0,120,80)"/>
                        <g class="text">
                           <text x="32" y="52">TCP</text>
                           <text x="56" y="52">A</text>
                           <text x="156" y="52">Endpoint</text>
                           <text x="200" y="52">A</text>
                           <text x="300" y="52">Endpoint</text>
                           <text x="344" y="52">B</text>
                           <text x="424" y="52">TCP</text>
                           <text x="448" y="52">B</text>
                           <text x="72" y="84">RST</text>
                           <text x="232" y="84">RST_STREAM{CON_ERR}</text>
                           <text x="392" y="84">RST</text>
                        </g>
                     </svg>
                  </artwork>
                  <artwork type="ascii-art">
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +----RST----&gt;+---RST_STREAM{CON_ERR}---&gt;+----RST----&gt;|
  |            |                          |            |
</artwork>
               </artset>
            </figure>
            <figure title="Timeout example (HTTP/1.1)">
               <artset>
                  <artwork type="svg">
                     <svg xmlns="http://www.w3.org/2000/svg"
                          class="diagram"
                          font-family="monospace"
                          font-size="13px"
                          height="144"
                          stroke-linecap="round"
                          text-anchor="middle"
                          version="1.1"
                          viewBox="0 0 472 144"
                          width="472">
                        <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                        <path d="M 24,64 L 24,128" fill="none" stroke="black"/>
                        <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                        <path d="M 128,64 L 128,128" fill="none" stroke="black"/>
                        <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,32 L 256,64" fill="none" stroke="black"/>
                        <path d="M 344,64 L 344,128" fill="none" stroke="black"/>
                        <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                        <path d="M 448,64 L 448,128" fill="none" stroke="black"/>
                        <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
                        <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                        <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                        <path d="M 256,32 L 360,32" fill="none" stroke="black"/>
                        <path d="M 400,32 L 464,32" fill="none" stroke="black"/>
                        <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,64 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                        <path d="M 24,80 L 48,80" fill="none" stroke="black"/>
                        <path d="M 96,80 L 184,80" fill="none" stroke="black"/>
                        <path d="M 280,80 L 368,80" fill="none" stroke="black"/>
                        <path d="M 416,80 L 440,80" fill="none" stroke="black"/>
                        <path d="M 128,112 L 144,112" fill="none" stroke="black"/>
                        <path d="M 312,112 L 376,112" fill="none" stroke="black"/>
                        <path d="M 408,112 L 440,112" fill="none" stroke="black"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,112 436,106.4 436,117.6"
                                 transform="rotate(0,440,112)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,80 436,74.4 436,85.6"
                                 transform="rotate(0,440,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,112 332,106.4 332,117.6"
                                 transform="rotate(0,336,112)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,80 332,74.4 332,85.6"
                                 transform="rotate(0,336,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,80 116,74.4 116,85.6"
                                 transform="rotate(0,120,80)"/>
                        <g class="text">
                           <text x="32" y="52">TCP</text>
                           <text x="56" y="52">A</text>
                           <text x="156" y="52">Endpoint</text>
                           <text x="200" y="52">A</text>
                           <text x="300" y="52">Endpoint</text>
                           <text x="344" y="52">B</text>
                           <text x="424" y="52">TCP</text>
                           <text x="448" y="52">B</text>
                           <text x="72" y="84">"abc"</text>
                           <text x="232" y="84">DATA{"abc"}</text>
                           <text x="392" y="84">"abc"</text>
                           <text x="164" y="100">(...</text>
                           <text x="216" y="100">timeout</text>
                           <text x="256" y="100">@</text>
                           <text x="272" y="100">A</text>
                           <text x="300" y="100">...)</text>
                           <text x="160" y="116">FIN</text>
                           <text x="192" y="116">(no</text>
                           <text x="260" y="116">close_notify</text>
                           <text x="392" y="116">RST</text>
                        </g>
                     </svg>
                  </artwork>
                  <artwork type="ascii-art">
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +---"abc"---&gt;+-------DATA{"abc"}-------&gt;+---"abc"---&gt;|
  |            |  (... timeout @ A ...)   |            |
  |            +--FIN (no close_notify)--&gt;+----RST----&gt;|
  |            |                          |            |
</artwork>
               </artset>
            </figure>
            <figure title="RST after FIN example (HTTP/3)">
               <artset>
                  <artwork type="svg">
                     <svg xmlns="http://www.w3.org/2000/svg"
                          class="diagram"
                          font-family="monospace"
                          font-size="13px"
                          height="192"
                          stroke-linecap="round"
                          text-anchor="middle"
                          version="1.1"
                          viewBox="0 0 472 192"
                          width="472">
                        <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                        <path d="M 24,64 L 24,176" fill="none" stroke="black"/>
                        <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                        <path d="M 128,64 L 128,176" fill="none" stroke="black"/>
                        <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,32 L 256,64" fill="none" stroke="black"/>
                        <path d="M 344,64 L 344,176" fill="none" stroke="black"/>
                        <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                        <path d="M 448,64 L 448,176" fill="none" stroke="black"/>
                        <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
                        <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                        <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                        <path d="M 256,32 L 360,32" fill="none" stroke="black"/>
                        <path d="M 400,32 L 464,32" fill="none" stroke="black"/>
                        <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                        <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                        <path d="M 256,64 L 360,64" fill="none" stroke="black"/>
                        <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                        <path d="M 24,80 L 64,80" fill="none" stroke="black"/>
                        <path d="M 96,80 L 184,80" fill="none" stroke="black"/>
                        <path d="M 304,80 L 384,80" fill="none" stroke="black"/>
                        <path d="M 416,80 L 440,80" fill="none" stroke="black"/>
                        <path d="M 32,128 L 56,128" fill="none" stroke="black"/>
                        <path d="M 104,128 L 168,128" fill="none" stroke="black"/>
                        <path d="M 312,128 L 376,128" fill="none" stroke="black"/>
                        <path d="M 424,128 L 448,128" fill="none" stroke="black"/>
                        <path d="M 136,144 L 168,144" fill="none" stroke="black"/>
                        <path d="M 304,144 L 344,144" fill="none" stroke="black"/>
                        <path d="M 24,160 L 64,160" fill="none" stroke="black"/>
                        <path d="M 96,160 L 168,160" fill="none" stroke="black"/>
                        <path d="M 304,160 L 384,160" fill="none" stroke="black"/>
                        <path d="M 416,160 L 440,160" fill="none" stroke="black"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,160 436,154.4 436,165.6"
                                 transform="rotate(0,440,160)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="448,80 436,74.4 436,85.6"
                                 transform="rotate(0,440,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="360,128 348,122.4 348,133.6"
                                 transform="rotate(180,352,128)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,160 332,154.4 332,165.6"
                                 transform="rotate(0,336,160)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="344,80 332,74.4 332,85.6"
                                 transform="rotate(0,336,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="144,144 132,138.4 132,149.6"
                                 transform="rotate(180,136,144)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="144,128 132,122.4 132,133.6"
                                 transform="rotate(180,136,128)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,160 116,154.4 116,165.6"
                                 transform="rotate(0,120,160)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="128,80 116,74.4 116,85.6"
                                 transform="rotate(0,120,80)"/>
                        <polygon class="arrowhead"
                                 fill="black"
                                 points="40,128 28,122.4 28,133.6"
                                 transform="rotate(180,32,128)"/>
                        <g class="text">
                           <text x="32" y="52">TCP</text>
                           <text x="56" y="52">A</text>
                           <text x="156" y="52">Endpoint</text>
                           <text x="200" y="52">A</text>
                           <text x="300" y="52">Endpoint</text>
                           <text x="344" y="52">B</text>
                           <text x="424" y="52">TCP</text>
                           <text x="448" y="52">B</text>
                           <text x="80" y="84">FIN</text>
                           <text x="244" y="84">FINAL_DATA{""}</text>
                           <text x="400" y="84">FIN</text>
                           <text x="80" y="116">(FIN)</text>
                           <text x="400" y="116">(FIN)</text>
                           <text x="80" y="132">"abc"</text>
                           <text x="240" y="132">FINAL_DATA{"abc"}</text>
                           <text x="400" y="132">"abc"</text>
                           <text x="236" y="148">QUIC.STREAM{FIN}</text>
                           <text x="80" y="164">RST</text>
                           <text x="236" y="164">H3_CONNECT_ERROR</text>
                           <text x="400" y="164">RST</text>
                        </g>
                     </svg>
                  </artwork>
                  <artwork type="ascii-art">
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +-----FIN---&gt;+-------FINAL_DATA{""}----&gt;+-----FIN---&gt;|
  |            |                          |            |
  |    (FIN)   |                          |    (FIN)   |
  |&lt;---"abc"---+&lt;----FINAL_DATA{"abc"}----+&lt;---"abc"---+
  |            |&lt;----QUIC.STREAM{FIN}-----+            |
  +-----RST---&gt;+-----H3_CONNECT_ERROR----&gt;+-----RST---&gt;|
  |            |                          |            |
</artwork>
               </artset>
            </figure>
         </section>
      </section>
      <section anchor="additional-connection-setup-behaviors">
         <name>Additional Connection Setup Behaviors</name>
         <t>This section discusses some behaviors that are permitted or recommended in order to enhance the performance or functionality of connection setup.</t>
         <section anchor="latency-optimizations">
            <name>Latency optimizations</name>
            <t>When using this specification in HTTP/2 or HTTP/3, clients <bcp14>MAY</bcp14> start sending TCP stream content optimistically, subject to flow control limits (<xref section="5.2" sectionFormat="of" target="RFC9113"/> or <xref section="4.1" sectionFormat="of" target="RFC9000"/>). Proxies <bcp14>MUST</bcp14> buffer this "optimistic" content until the TCP stream becomes writable, and discard it if the TCP connection fails. (Clients <bcp14>MUST NOT</bcp14> use "optimistic" behavior in HTTP/1.1, as this would interfere with reuse of the connection after an error response such as "401 (Unauthorized)".)</t>
            <t>Servers that host a proxy under this specification <bcp14>MAY</bcp14> offer support for TLS early data in accordance with <xref target="RFC8470"/>. Clients <bcp14>MAY</bcp14> send "connect-tcp" requests in early data, and <bcp14>MAY</bcp14> include "optimistic" TCP content in early data (in HTTP/2 and HTTP/3). At the TLS layer, proxies <bcp14>MAY</bcp14> ignore, reject, or accept the <spanx style="verb">early_data</spanx> extension (<xref section="4.2.10" sectionFormat="comma" target="RFC8446"/>). At the HTTP layer, proxies <bcp14>MAY</bcp14> process the request immediately, return a "425 (Too Early)" response (<xref section="5.2" sectionFormat="comma" target="RFC8470"/>), or delay some or all processing of the request until the handshake completes. For example, a proxy with limited anti-replay defenses might choose to perform DNS resolution of the <spanx style="verb">target_host</spanx> when a request arrives in early data, but delay the TCP connection until the TLS handshake completes.</t>
         </section>
         <section anchor="conveying-metadata">
            <name>Conveying metadata</name>
            <t>This specification supports the "Expect: 100-continue" request header (<xref section="10.1.1" sectionFormat="comma" target="RFC9110"/>) in any HTTP version. The "100 (Continue)" status code confirms receipt of a request at the proxy without waiting for the proxy-destination TCP handshake to succeed or fail. This might be particularly helpful when the destination host is not responding, as TCP handshakes can hang for several minutes before failing. Clients <bcp14>MAY</bcp14> send "Expect: 100-continue", and proxies <bcp14>MUST</bcp14> respect it by returning "100 (Continue)" if the request is not immediately rejected.</t>
            <t>Proxies implementing this specification <bcp14>SHOULD</bcp14> include a "Proxy-Status" response header field <xref target="RFC9209"/> in any success or failure response (i.e., status codes 101, 2XX, 4XX, or 5XX) to support advanced client behaviors and diagnostics. Clients and proxies <bcp14>MUST NOT</bcp14> send trailer fields on "connect-tcp" streams.</t>
         </section>
      </section>
      <section anchor="applicability">
         <name>Applicability</name>
         <section anchor="servers">
            <name>Servers</name>
            <t>For server operators, template-driven TCP proxies are particularly valuable in situations where virtual-hosting is needed, or where multiple proxies must share an origin. For example, the proxy might benefit from sharing an HTTP gateway that provides DDoS defense, performs request sanitization, or enforces user authorization.</t>
            <t>The URI template can also be structured to generate high-entropy Capability URLs <xref target="CAPABILITY"/>, so that only authorized users can discover the proxy service.</t>
         </section>
         <section anchor="clients">
            <name>Clients</name>
            <t>Clients that support both classic HTTP CONNECT proxies and template-driven TCP proxies <bcp14>MAY</bcp14> accept both types via a single configuration string. If the configuration string can be parsed as a URI Template containing the required variables, it is a template-driven TCP proxy. Otherwise, it is presumed to represent a classic HTTP CONNECT proxy.</t>
            <t>In some cases, it is valuable to allow "connect-tcp" clients to reach "connect-tcp"-only proxies when using a legacy configuration method that cannot convey a URI Template. To support this arrangement, clients <bcp14>SHOULD</bcp14> treat certain errors during classic HTTP CONNECT as indications that the proxy might only support "connect-tcp":</t>
            <t>
               <list style="symbols">
                  <t>In HTTP/1.1: the response status code is "426 (Upgrade Required)", with an "Upgrade: connect-tcp" response header.</t>
                  <t>In any HTTP version: the response status code is "501 (Not Implemented)". <list style="symbols">
                        <t>Requires SETTINGS_ENABLE_CONNECT_PROTOCOL to have been negotiated in HTTP/2 or HTTP/3.</t>
                     </list>
                  </t>
               </list>
            </t>
            <t>If the client infers that classic HTTP CONNECT is not supported, it <bcp14>SHOULD</bcp14> retry the request using the registered default template for "connect-tcp":</t>
            <figure title="Registered default template">
               <artwork>
https://$PROXY_HOST:$PROXY_PORT/.well-known/masque
                 /tcp/{target_host}/{target_port}/
</artwork>
            </figure>
            <t>If this request succeeds, the client <bcp14>SHOULD</bcp14> record a preference for "connect-tcp" to avoid further retry delays.</t>
         </section>
      </section>
      <section anchor="security-considerations">
         <name>Security Considerations</name>
         <t>Template-driven TCP proxying is largely subject to the same security risks as classic HTTP CONNECT. For example, any restrictions on authorized use of the proxy (see <xref section="9.3.6" sectionFormat="comma" target="RFC9110"/>) apply equally to both.</t>
         <t>A small additional risk is posed by the use of a URI Template parser on the client side. The template input string could be crafted to exploit any vulnerabilities in the parser implementation. Client implementers should apply their usual precautions for code that processes untrusted inputs.</t>
         <section anchor="resource-exhaustion-attacks">
            <name>Resource Exhaustion attacks</name>
            <t>A malicious client can achieve cause highly asymmetric resource usage at the proxy by colluding with a destination server and violating the ordinary rules of TCP or HTTP. Some example attacks, and mitigations that proxies can apply:</t>
            <t>
               <list style="symbols">
                  <t>
                     <strong>Connection Pileup</strong>: A malicious client can attempt to open a large number of connections to exhaust the proxy's memory, port, or file descriptor limits. When using HTTP/2 or HTTP/3, each incremental TCP connection imposes a much higher cost on the proxy than on the attacker. <list style="symbols">
                        <t>Mitigation: Limit the number of concurrent connections per client.</t>
                     </list>
                  </t>
                  <t>
                     <strong>Window Bloat</strong>: An attacker can grow the receive window size by simulating a "long, fat network" <xref target="RFC7323"/>, then fill the window (from the sender) and stop acknowledging it (at the receiver). This leaves the proxy buffering up to 1 GiB of TCP data until some timeout, while the attacker does not have to retain a large buffer. <list style="symbols">
                        <t>Mitigation: Limit the maximum receive window for TCP and HTTP connections, and the size of userspace buffers used for proxying. Alternatively, monitor the connections' send queues and limit the total buffered data per client.</t>
                     </list>
                  </t>
                  <t>
                     <strong>WAIT Abuse</strong>: An attacker can force the proxy into a TIME-WAIT, CLOSE-WAIT, or FIN-WAIT state until the timer expires, tying up a proxy-to-destination 4-tuple for up to four minutes after the client's connection is closed. <list style="symbols">
                        <t>Mitigation: Limit the number of connections for each client to each destination, even if those connections are in a waiting state and the corresponding CONNECT stream is closed. Alternatively, allocate a large range of IP addresses for TCP connections (especially in IPv6).</t>
                     </list>
                  </t>
               </list>
            </t>
         </section>
      </section>
      <section anchor="operational-considerations">
         <name>Operational Considerations</name>
         <section anchor="avoiding-http11">
            <name>Avoiding HTTP/1.1</name>
            <t>While this specification is fully functional under HTTP/1.1, performance-sensitive deployments <bcp14>SHOULD</bcp14> use HTTP/2 or HTTP/3 instead. When using HTTP/1.1:</t>
            <t>
               <list style="symbols">
                  <t>Each CONNECT request requires a new TCP and TLS connection, imposing a higher cost in setup latency, congestion control convergence, CPU time, and data transfer.</t>
                  <t>The graceful and abrupt closure signals (<xref target="closing-connections"/>) are more likely to be missing or corrupted: <list style="symbols">
                        <t>Some implementations may be unable to emit the recommended abrupt closure signals, due to limitations in their TCP and TLS subsystems.</t>
                        <t>Faulty implementations may fail to send a TLS closure alert during graceful shutdown, or fail to report an error when the expected closure alert is not received. These misbehaviors are not compliant with <xref target="RFC8446"/>, but they are common nonetheless among HTTP/1.1 implementations today.</t>
                     </list>
                  </t>
                  <t>The number of active connections through each client may be limited by the number of available TCP client ports, especially if: <list style="symbols">
                        <t>The client only has one IP address that can be used to reach the proxy.</t>
                        <t>The client is shared between many parties, such as when acting as a gateway or concentrator.</t>
                        <t>The proxied connections are often closed by the destination. This causes the client to initiate closure of the client-to-proxy connection, leaving the client in a TIME-WAIT state for up to four minutes.</t>
                     </list>
                  </t>
               </list>
            </t>
         </section>
         <section anchor="gateway-compatibility">
            <name>Gateway Compatibility</name>
            <t>Templated TCP proxies can make use of standard HTTP gateways and path-routing to ease implementation and allow use of shared infrastructure. However, current gateways might need modifications to support TCP proxy services. To be compatible, a gateway must:</t>
            <t>
               <list style="symbols">
                  <t>support Extended CONNECT (if acting as an HTTP/2 or HTTP/3 server).</t>
                  <t>support HTTP/1.1 Upgrade to "connect-tcp" (if acting as an HTTP/1.1 server) <list style="symbols">
                        <t>only after forwarding the upgrade request to the origin and observing a success response.</t>
                     </list>
                  </t>
                  <t>forward the "connect-tcp" protocol to the origin.</t>
                  <t>convert "connect-tcp" requests between all supported HTTP server and client versions.</t>
                  <t>allow any "Proxy-Status" headers to traverse the gateway.</t>
               </list>
            </t>
         </section>
      </section>
      <section anchor="iana-considerations">
         <name>IANA Considerations</name>
         <section anchor="new-upgrade-token">
            <name>New Upgrade Token</name>
            <t>IF APPROVED, IANA is requested to add the following entry to the HTTP Upgrade Token Registry:</t>
            <texttable>
               <ttcol align="left">Value</ttcol>
               <ttcol align="left">Description</ttcol>
               <ttcol align="left">Reference</ttcol>
               <c>"connect-tcp"</c>
               <c>Proxying of TCP payloads</c>
               <c>(This document)</c>
            </texttable>
            <t>For interoperability testing of this draft version, implementations <bcp14>SHALL</bcp14> use the value "connect-tcp-07".</t>
         </section>
         <section anchor="iana-template">
            <name>New MASQUE Default Template</name>
            <t>IF APPROVED, IANA is requested to add the following entry to the "MASQUE URI Suffixes" registry:</t>
            <texttable>
               <ttcol align="left">Path Segment</ttcol>
               <ttcol align="left">Description</ttcol>
               <ttcol align="left">Reference</ttcol>
               <c>tcp</c>
               <c>TCP Proxying</c>
               <c>(This document)</c>
            </texttable>
         </section>
         <section anchor="data-capsule">
            <name>New Capsule Type</name>
            <t>IF APPROVED, IANA is requested to add the following entry to the "HTTP Capsule Types" registry:</t>
            <texttable>
               <ttcol align="left">Value</ttcol>
               <ttcol align="left">Capsule Type</ttcol>
               <ttcol align="left">Status</ttcol>
               <ttcol align="left">Reference</ttcol>
               <ttcol align="left">Change Controller</ttcol>
               <ttcol align="left">Contact</ttcol>
               <c>(TBD)</c>
               <c>DATA</c>
               <c>permanent</c>
               <c>(This document), <xref target="specification"/>
               </c>
               <c>IETF</c>
               <c>HTTPBIS</c>
               <c>(TBD)</c>
               <c>FINAL_DATA</c>
               <c>permanent</c>
               <c>(This document), <xref target="specification"/>
               </c>
               <c>IETF</c>
               <c>HTTPBIS</c>
            </texttable>
            <t>For this draft version of the protocol, the Capsule Type values <spanx style="verb">0x2028d7f0</spanx> and <spanx style="verb">0x2028d7f1</spanx> shall be used provisionally for testing, under the names "DATA-08" and "FINAL_DATA-08".</t>
         </section>
      </section>
   </middle>
   <back>
      <references anchor="sec-combined-references" title="References">
         <references anchor="sec-normative-references" title="Normative References">
            <reference anchor="RFC9110">
               <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="RFC9297">
               <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>
            <reference anchor="RFC6570">
               <front>
                  <title>URI Template</title>
                  <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
                  <author fullname="R. Fielding" initials="R." surname="Fielding"/>
                  <author fullname="M. Hadley" initials="M." surname="Hadley"/>
                  <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
                  <author fullname="D. Orchard" initials="D." surname="Orchard"/>
                  <date month="March" year="2012"/>
               </front>
               <seriesInfo name="RFC" value="6570"/>
               <seriesInfo name="DOI" value="10.17487/RFC6570"/>
            </reference>
            <reference anchor="RFC9298">
               <front>
                  <title>Proxying UDP in HTTP</title>
                  <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
                  <date month="August" year="2022"/>
               </front>
               <seriesInfo name="RFC" value="9298"/>
               <seriesInfo name="DOI" value="10.17487/RFC9298"/>
            </reference>
            <reference anchor="RFC8441">
               <front>
                  <title>Bootstrapping WebSockets with HTTP/2</title>
                  <author fullname="P. McManus" initials="P." surname="McManus"/>
                  <date month="September" year="2018"/>
               </front>
               <seriesInfo name="RFC" value="8441"/>
               <seriesInfo name="DOI" value="10.17487/RFC8441"/>
            </reference>
            <reference anchor="RFC9220">
               <front>
                  <title>Bootstrapping WebSockets with HTTP/3</title>
                  <author fullname="R. Hamilton" initials="R." surname="Hamilton"/>
                  <date month="June" year="2022"/>
               </front>
               <seriesInfo name="RFC" value="9220"/>
               <seriesInfo name="DOI" value="10.17487/RFC9220"/>
            </reference>
            <reference anchor="RFC9113">
               <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="RFC9114">
               <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="RFC9000">
               <front>
                  <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
                  <author fullname="J. Iyengar"
                          initials="J."
                          role="editor"
                          surname="Iyengar"/>
                  <author fullname="M. Thomson"
                          initials="M."
                          role="editor"
                          surname="Thomson"/>
                  <date month="May" year="2021"/>
               </front>
               <seriesInfo name="RFC" value="9000"/>
               <seriesInfo name="DOI" value="10.17487/RFC9000"/>
            </reference>
            <reference anchor="RFC8446">
               <front>
                  <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
                  <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
                  <date month="August" year="2018"/>
               </front>
               <seriesInfo name="RFC" value="8446"/>
               <seriesInfo name="DOI" value="10.17487/RFC8446"/>
            </reference>
            <reference anchor="RFC8470">
               <front>
                  <title>Using Early Data in HTTP</title>
                  <author fullname="M. Thomson" initials="M." surname="Thomson"/>
                  <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
                  <author fullname="W. Tarreau" initials="W." surname="Tarreau"/>
                  <date month="September" year="2018"/>
               </front>
               <seriesInfo name="RFC" value="8470"/>
               <seriesInfo name="DOI" value="10.17487/RFC8470"/>
            </reference>
            <reference anchor="RFC9209">
               <front>
                  <title>The Proxy-Status HTTP Response Header Field</title>
                  <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
                  <author fullname="P. Sikora" initials="P." surname="Sikora"/>
                  <date month="June" year="2022"/>
               </front>
               <seriesInfo name="RFC" value="9209"/>
               <seriesInfo name="DOI" value="10.17487/RFC9209"/>
            </reference>
         </references>
         <references anchor="sec-informative-references" title="Informative References">
            <reference anchor="CAPABILITY" target="https://www.w3.org/TR/capability-urls/">
               <front>
                  <title>Good Practices for Capability URLs</title>
                  <author/>
                  <date month="February" year="2014"/>
               </front>
            </reference>
            <reference anchor="CLEAR-SITE-DATA"
                       target="https://www.w3.org/TR/clear-site-data/">
               <front>
                  <title>Clear Site Data</title>
                  <author/>
                  <date month="November" year="2017"/>
               </front>
            </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"/>
               </front>
               <seriesInfo name="RFC" value="9298"/>
               <seriesInfo name="DOI" value="10.17487/RFC9298"/>
            </reference>
            <reference anchor="CONNECT-IP">
               <front>
                  <title>Proxying IP in HTTP</title>
                  <author fullname="T. Pauly" initials="T." role="editor" surname="Pauly"/>
                  <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
                  <author fullname="A. Chernyakhovsky" initials="A." surname="Chernyakhovsky"/>
                  <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
                  <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
                  <date month="October" year="2023"/>
               </front>
               <seriesInfo name="RFC" value="9484"/>
               <seriesInfo name="DOI" value="10.17487/RFC9484"/>
            </reference>
            <reference anchor="RFC7838">
               <front>
                  <title>HTTP Alternative Services</title>
                  <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
                  <author fullname="P. McManus" initials="P." surname="McManus"/>
                  <author fullname="J. Reschke" initials="J." surname="Reschke"/>
                  <date month="April" year="2016"/>
               </front>
               <seriesInfo name="RFC" value="7838"/>
               <seriesInfo name="DOI" value="10.17487/RFC7838"/>
            </reference>
            <reference anchor="RFC6797">
               <front>
                  <title>HTTP Strict Transport Security (HSTS)</title>
                  <author fullname="J. Hodges" initials="J." surname="Hodges"/>
                  <author fullname="C. Jackson" initials="C." surname="Jackson"/>
                  <author fullname="A. Barth" initials="A." surname="Barth"/>
                  <date month="November" year="2012"/>
               </front>
               <seriesInfo name="RFC" value="6797"/>
               <seriesInfo name="DOI" value="10.17487/RFC6797"/>
            </reference>
            <reference anchor="I-D.schinazi-httpbis-wrap-up">
               <front>
                  <title>The HTTP Wrap Up Capsule</title>
                  <author fullname="David Schinazi" initials="D." surname="Schinazi">
                     <organization>Google LLC</organization>
                  </author>
                  <author fullname="Lucas Pardue" initials="L." surname="Pardue">
                     <organization>Cloudflare</organization>
                  </author>
                  <date day="16" month="October" year="2024"/>
               </front>
               <seriesInfo name="Internet-Draft" value="draft-schinazi-httpbis-wrap-up-01"/>
            </reference>
            <reference anchor="RFC7469">
               <front>
                  <title>Public Key Pinning Extension for HTTP</title>
                  <author fullname="C. Evans" initials="C." surname="Evans"/>
                  <author fullname="C. Palmer" initials="C." surname="Palmer"/>
                  <author fullname="R. Sleevi" initials="R." surname="Sleevi"/>
                  <date month="April" year="2015"/>
               </front>
               <seriesInfo name="RFC" value="7469"/>
               <seriesInfo name="DOI" value="10.17487/RFC7469"/>
            </reference>
            <reference anchor="RFC8942">
               <front>
                  <title>HTTP Client Hints</title>
                  <author fullname="I. Grigorik" initials="I." surname="Grigorik"/>
                  <author fullname="Y. Weiss" initials="Y." surname="Weiss"/>
                  <date month="February" year="2021"/>
               </front>
               <seriesInfo name="RFC" value="8942"/>
               <seriesInfo name="DOI" value="10.17487/RFC8942"/>
            </reference>
            <reference anchor="RFC6265">
               <front>
                  <title>HTTP State Management Mechanism</title>
                  <author fullname="A. Barth" initials="A." surname="Barth"/>
                  <date month="April" year="2011"/>
               </front>
               <seriesInfo name="RFC" value="6265"/>
               <seriesInfo name="DOI" value="10.17487/RFC6265"/>
            </reference>
            <reference anchor="RFC7323">
               <front>
                  <title>TCP Extensions for High Performance</title>
                  <author fullname="D. Borman" initials="D." surname="Borman"/>
                  <author fullname="B. Braden" initials="B." surname="Braden"/>
                  <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
                  <author fullname="R. Scheffenegger"
                          initials="R."
                          role="editor"
                          surname="Scheffenegger"/>
                  <date month="September" year="2014"/>
               </front>
               <seriesInfo name="RFC" value="7323"/>
               <seriesInfo name="DOI" value="10.17487/RFC7323"/>
            </reference>
         </references>
      </references>
      <?line 365?>
      <section anchor="acknowledgments" numbered="false">
         <name>Acknowledgments</name>
         <t>Thanks to Amos Jeffries, Tommy Pauly, Kyle Nekritz, David Schinazi, and Kazuho Oku for close review and suggested changes.</t>
      </section>
   </back>
</rfc>
