<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-connect-tcp-09" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="Templated CONNECT-TCP">Template-Driven HTTP CONNECT Proxying for TCP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-connect-tcp-09"/>
    <author initials="B. M." surname="Schwartz" fullname="Benjamin M. Schwartz">
      <organization>Meta Platforms, Inc.</organization>
      <address>
        <email>ietf@bemasc.net</email>
      </address>
    </author>
    <date year="2025" month="June" day="30"/>
    <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>
      <ul spacing="normal">
        <li>
          <t>There are no intervening capsules of other types.</t>
        </li>
        <li>
          <t>The order of payload content is preserved.</t>
        </li>
        <li>
          <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>
        </li>
      </ul>
      <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>
        <ul spacing="normal">
          <li>
            <t>The method <bcp14>SHALL</bcp14> be "GET".</t>
          </li>
          <li>
            <t>The request's target <bcp14>SHALL</bcp14> correspond to the URI derived from expansion of the proxy's URI Template.</t>
          </li>
          <li>
            <t>The request <bcp14>SHALL</bcp14> include a single "Host" header field containing the origin of the proxy.</t>
          </li>
          <li>
            <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>
          </li>
          <li>
            <t>The request <bcp14>SHALL</bcp14> include an "Upgrade" header field with the value "connect-tcp".</t>
          </li>
          <li>
            <t>The request <bcp14>SHOULD</bcp14> include a "Capsule-Protocol: ?1" header (as recommended in <xref section="3.4" sectionFormat="comma" target="RFC9297"/>).</t>
          </li>
        </ul>
        <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>
        <ul spacing="normal">
          <li>
            <t>The HTTP status code <bcp14>SHALL</bcp14> be "101 (Switching Protocols)".</t>
          </li>
          <li>
            <t>The response <bcp14>SHALL</bcp14> include a "Connection" header field with the value "Upgrade".</t>
          </li>
          <li>
            <t>The response <bcp14>SHALL</bcp14> include a single "Upgrade" header field with the value "connect-tcp".</t>
          </li>
          <li>
            <t>The response <bcp14>SHOULD</bcp14> include a "Capsule-Protocol: ?1" header (as above).</t>
          </li>
        </ul>
        <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>
          <name>Templated TCP proxy example in HTTP/1.1</name>
          <artwork><![CDATA[
Client                                                 Proxy

GET /proxy?target_host=192.0.2.1&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>
        <ul spacing="normal">
          <li>
            <t>The :method pseudo-header field <bcp14>SHALL</bcp14> be "CONNECT".</t>
          </li>
          <li>
            <t>The :protocol pseudo-header field <bcp14>SHALL</bcp14> be "connect-tcp".</t>
          </li>
          <li>
            <t>The :authority pseudo-header field <bcp14>SHALL</bcp14> contain the authority of the proxy.</t>
          </li>
          <li>
            <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>
          </li>
        </ul>
        <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>
          <name>Templated TCP proxy example in HTTP/2</name>
          <artwork><![CDATA[
HEADERS
:method = CONNECT
:scheme = https
:authority = request-proxy.example
:path = /proxy?target_host=2001%3Adb8%3A%3A1&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>
          <ul spacing="normal">
            <li>
              <t>"Alt-Svc" <xref target="RFC7838"/></t>
            </li>
            <li>
              <t>"Strict-Transport-Security" <xref target="RFC6797"/></t>
            </li>
            <li>
              <t>"Public-Key-Pins" <xref target="RFC7469"/></t>
            </li>
            <li>
              <t>"Accept-CH" <xref target="RFC8942"/></t>
            </li>
            <li>
              <t>"Set-Cookie" <xref target="RFC6265"/>, which has configurable scope.</t>
            </li>
            <li>
              <t>"Clear-Site-Data" <xref target="CLEAR-SITE-DATA"/></t>
            </li>
          </ul>
        </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>
        <ul spacing="normal">
          <li>
            <t>When an endpoint receives a valid TCP FIN, it <bcp14>MUST</bcp14> send a FINAL_DATA capsule.</t>
          </li>
          <li>
            <t>When an endpoint receives a valid FINAL_DATA capsule, it <bcp14>MUST</bcp14> send a TCP FIN.</t>
          </li>
          <li>
            <t>When a TCP connection reaches the TIME-WAIT or CLOSED state, the associated endpoint <bcp14>MUST</bcp14> close its send stream.
            </t>
            <ul spacing="normal">
              <li>
                <t>If the connection closed gracefully, the endpoint <bcp14>MUST</bcp14> close the send stream gracefully.</t>
              </li>
              <li>
                <t>Otherwise, the endpoint <bcp14>SHOULD</bcp14> close the send stream abruptly, using a mechanism appropriate to the HTTP version:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>HTTP/3: RESET_STREAM with H3_CONNECT_ERROR</t>
                  </li>
                  <li>
                    <t>HTTP/2: RST_STREAM with CONNECT_ERROR</t>
                  </li>
                  <li>
                    <t>HTTP/1.1 over TLS: a TLS Error Alert</t>
                  </li>
                  <li>
                    <t>HTTP/1.1 (insecure): TCP RST.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <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>
          </li>
        </ul>
        <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>
          <name>Simple graceful termination example (HTTP/3)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="472" viewBox="0 0 472 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <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" points="448,96 436,90.4 436,101.6" fill="black" transform="rotate(0,440,96)"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="360,112 348,106.4 348,117.6" fill="black" transform="rotate(180,352,112)"/>
                <polygon class="arrowhead" points="344,144 332,138.4 332,149.6" fill="black" transform="rotate(0,336,144)"/>
                <polygon class="arrowhead" points="344,96 332,90.4 332,101.6" fill="black" transform="rotate(0,336,96)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,80)"/>
                <polygon class="arrowhead" points="144,128 132,122.4 132,133.6" fill="black" transform="rotate(180,136,128)"/>
                <polygon class="arrowhead" points="144,112 132,106.4 132,117.6" fill="black" transform="rotate(180,136,112)"/>
                <polygon class="arrowhead" points="128,144 116,138.4 116,149.6" fill="black" transform="rotate(0,120,144)"/>
                <polygon class="arrowhead" points="128,96 116,90.4 116,101.6" fill="black" transform="rotate(0,120,96)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" transform="rotate(0,120,80)"/>
                <polygon class="arrowhead" points="40,112 28,106.4 28,117.6" fill="black" 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"><![CDATA[
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +---"abc"--->+-------DATA{"abc"}------->+---"abc"--->|
  +----FIN---->+------FINAL_DATA{""}----->+----FIN---->|
  |<---FIN-----+<-----FINAL_DATA{""}------+<---FIN-----+
  |            |<----QUIC.STREAM{FIN}-----+            |
  +---FINACK-->+-----QUIC.STREAM{FIN}---->|            |
  |            |                          |            |
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>Simple TCP RST termination example (HTTP/2)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="472" viewBox="0 0 472 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <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" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,80)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" 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"><![CDATA[
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +----RST---->+---RST_STREAM{CON_ERR}--->+----RST---->|
  |            |                          |            |
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>Timeout example (HTTP/1.1)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="472" viewBox="0 0 472 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <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 192,112" fill="none" stroke="black"/>
                <path d="M 272,112 L 376,112" fill="none" stroke="black"/>
                <path d="M 408,112 L 440,112" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="448,112 436,106.4 436,117.6" fill="black" transform="rotate(0,440,112)"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="344,112 332,106.4 332,117.6" fill="black" transform="rotate(0,336,112)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,80)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" 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="208" y="116">TLS</text>
                  <text x="248" y="116">Alert</text>
                  <text x="392" y="116">RST</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +---"abc"--->+-------DATA{"abc"}------->+---"abc"--->|
  |            |  (... timeout @ A ...)   |            |
  |            +--------TLS Alert-------->+----RST---->|
  |            |                          |            |
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>RST after FIN example (HTTP/3)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="472" viewBox="0 0 472 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <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" points="448,160 436,154.4 436,165.6" fill="black" transform="rotate(0,440,160)"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="360,128 348,122.4 348,133.6" fill="black" transform="rotate(180,352,128)"/>
                <polygon class="arrowhead" points="344,160 332,154.4 332,165.6" fill="black" transform="rotate(0,336,160)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,80)"/>
                <polygon class="arrowhead" points="144,144 132,138.4 132,149.6" fill="black" transform="rotate(180,136,144)"/>
                <polygon class="arrowhead" points="144,128 132,122.4 132,133.6" fill="black" transform="rotate(180,136,128)"/>
                <polygon class="arrowhead" points="128,160 116,154.4 116,165.6" fill="black" transform="rotate(0,120,160)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" transform="rotate(0,120,80)"/>
                <polygon class="arrowhead" points="40,128 28,122.4 28,133.6" fill="black" 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"><![CDATA[
+-------+    +------------+    +------------+    +-------+
| TCP A |    | Endpoint A |    | Endpoint B |    | TCP B |
+-+-----+    +-+----------+    +----------+-+    +-----+-+
  +-----FIN--->+-------FINAL_DATA{""}---->+-----FIN--->|
  |            |                          |            |
  |    (FIN)   |                          |    (FIN)   |
  |<---"abc"---+<----FINAL_DATA{"abc"}----+<---"abc"---+
  |            |<----QUIC.STREAM{FIN}-----+            |
  +-----RST--->+-----H3_CONNECT_ERROR---->+-----RST--->|
  |            |                          |            |
]]></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 <tt>early_data</tt> 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 <tt>target_host</tt> 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 <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.  In HTTP/2 or HTTP/3, proxies <bcp14>MAY</bcp14> additionally send a "Proxy-Status" trailer in the event of an unclean shutdown.</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>
        <ul spacing="normal">
          <li>
            <t>In HTTP/1.1: the response status code is "426 (Upgrade Required)", with an "Upgrade: connect-tcp" response header.</t>
          </li>
          <li>
            <t>In any HTTP version: the response status code is "501 (Not Implemented)".
            </t>
            <ul spacing="normal">
              <li>
                <t>Requires SETTINGS_ENABLE_CONNECT_PROTOCOL to have been negotiated in HTTP/2 or HTTP/3.</t>
              </li>
            </ul>
          </li>
        </ul>
        <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>
          <name>Registered default template</name>
          <artwork><![CDATA[
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>
        <ul spacing="normal">
          <li>
            <t><strong>Connection Pileup</strong>: A malicious client can attempt to open a large number of proxy&lt;-&gt;destination 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.
            </t>
            <ul spacing="normal">
              <li>
                <t>Mitigation: Limit the number of concurrent connections per client.</t>
              </li>
            </ul>
          </li>
          <li>
            <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.
            </t>
            <ul spacing="normal">
              <li>
                <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>
              </li>
            </ul>
          </li>
          <li>
            <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&lt;-&gt;destination 4-tuple for up to four minutes after the client's connection is closed.
            </t>
            <ul spacing="normal">
              <li>
                <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>
              </li>
            </ul>
          </li>
        </ul>
      </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>
        <ul spacing="normal">
          <li>
            <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>
          </li>
          <li>
            <t>It may be difficult to implement the recommended unclean shutdown signals (<xref target="closing-connections"/>), as many TLS libraries do not support injecting TLS Alerts.</t>
          </li>
          <li>
            <t>The number of active connections through each client may be limited by the number of available TCP client ports, especially if:
            </t>
            <ul spacing="normal">
              <li>
                <t>The client only has one IP address that can be used to reach the proxy.</t>
              </li>
              <li>
                <t>The client is shared between many parties, such as when acting as a gateway or concentrator.</t>
              </li>
              <li>
                <t>The proxied connections are often closed by the destination. This causes the client to initiate closure of the client&lt;-&gt;proxy connection, leaving the client in a TIME-WAIT state for up to four minutes.</t>
              </li>
            </ul>
          </li>
        </ul>
      </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>
        <ul spacing="normal">
          <li>
            <t>support Extended CONNECT (if acting as an HTTP/2 or HTTP/3 server).</t>
          </li>
          <li>
            <t>support HTTP/1.1 Upgrade to "connect-tcp" (if acting as an HTTP/1.1 server)
            </t>
            <ul spacing="normal">
              <li>
                <t>only after forwarding the upgrade request to the origin and observing a success response.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>forward the "connect-tcp" protocol to the origin.</t>
          </li>
          <li>
            <t>convert "connect-tcp" requests between all supported HTTP server and client versions.</t>
          </li>
          <li>
            <t>allow any "Proxy-Status" headers to traverse the gateway.</t>
          </li>
        </ul>
      </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>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">"connect-tcp"</td>
              <td align="left">Proxying of TCP payloads</td>
              <td align="left">(This document)</td>
            </tr>
          </tbody>
        </table>
        <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>
        <table>
          <thead>
            <tr>
              <th align="left">Path Segment</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">tcp</td>
              <td align="left">TCP Proxying</td>
              <td align="left">(This document)</td>
            </tr>
          </tbody>
        </table>
      </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>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Capsule Type</th>
              <th align="left">Status</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
              <th align="left">Contact</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(TBD)</td>
              <td align="left">DATA</td>
              <td align="left">permanent</td>
              <td align="left">(This document), <xref target="specification"/></td>
              <td align="left">IETF</td>
              <td align="left">HTTPBIS</td>
            </tr>
            <tr>
              <td align="left">(TBD)</td>
              <td align="left">FINAL_DATA</td>
              <td align="left">permanent</td>
              <td align="left">(This document), <xref target="specification"/></td>
              <td align="left">IETF</td>
              <td align="left">HTTPBIS</td>
            </tr>
          </tbody>
        </table>
        <t>For this draft version of the protocol, the Capsule Type values <tt>0x2028d7f0</tt> and <tt>0x2028d7f1</tt> 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">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="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"/>
            <abstract>
              <t>This document describes HTTP Datagrams, a convention for conveying multiplexed, potentially unreliable datagrams inside an HTTP connection.</t>
              <t>In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or undesirable, HTTP Datagrams can be sent using the Capsule Protocol, which is a more general convention for conveying data in HTTP connections.</t>
              <t>HTTP Datagrams and the Capsule Protocol are intended for use by HTTP extensions, not applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9297"/>
          <seriesInfo name="DOI" value="10.17487/RFC9297"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <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"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </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"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
        <reference anchor="RFC8441">
          <front>
            <title>Bootstrapping WebSockets with HTTP/2</title>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <date month="September" year="2018"/>
            <abstract>
              <t>This document defines a mechanism for running the WebSocket Protocol (RFC 6455) over a single stream of an HTTP/2 connection.</t>
            </abstract>
          </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"/>
            <abstract>
              <t>The mechanism for running the WebSocket Protocol over a single stream of an HTTP/2 connection is equally applicable to HTTP/3, but the HTTP-version-specific details need to be specified. This document describes how the mechanism is adapted for HTTP/3.</t>
            </abstract>
          </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"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="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"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="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"/>
            <abstract>
              <t>Using TLS early data creates an exposure to the possibility of a replay attack. This document defines mechanisms that allow clients to communicate with servers about HTTP requests that are sent in early data. Techniques are described that use these mechanisms to mitigate the risk of replay.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8470"/>
          <seriesInfo name="DOI" value="10.17487/RFC8470"/>
        </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"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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"/>
            <abstract>
              <t>This document defines the Proxy-Status HTTP response field to convey the details of an intermediary's response handling, including generated errors.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9209"/>
          <seriesInfo name="DOI" value="10.17487/RFC9209"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CAPABILITY" target="https://www.w3.org/TR/capability-urls/">
          <front>
            <title>Good Practices for Capability URLs</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="February"/>
          </front>
        </reference>
        <reference anchor="CLEAR-SITE-DATA" target="https://www.w3.org/TR/clear-site-data/">
          <front>
            <title>Clear Site Data</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="November"/>
          </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"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
        <reference anchor="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"/>
            <abstract>
              <t>This document describes how to proxy IP packets in HTTP. This protocol is similar to UDP proxying in HTTP but allows transmitting arbitrary IP packets. More specifically, this document defines a protocol that allows an HTTP client to create an IP tunnel through an HTTP server that acts as an IP proxy. This document updates RFC 9298.</t>
            </abstract>
          </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"/>
            <abstract>
              <t>This document specifies "Alternative Services" for HTTP, which allow an origin's resources to be authoritatively available at a separate network location, possibly accessed with a different protocol configuration.</t>
            </abstract>
          </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"/>
            <abstract>
              <t>This specification defines a mechanism enabling web sites to declare themselves accessible only via secure connections and/or for users to be able to direct their user agent(s) to interact with given sites only over secure connections. This overall policy is referred to as HTTP Strict Transport Security (HSTS). The policy is declared by web sites via the Strict-Transport-Security HTTP response header field and/or by other means, such as user agent configuration, for example. [STANDARDS-TRACK]</t>
            </abstract>
          </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"/>
            <abstract>
              <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>
          </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"/>
            <abstract>
              <t>This document defines a new HTTP header that allows web host operators to instruct user agents to remember ("pin") the hosts' cryptographic identities over a period of time. During that time, user agents (UAs) will require that the host presents a certificate chain including at least one Subject Public Key Info structure whose fingerprint matches one of the pinned fingerprints for that host. By effectively reducing the number of trusted authorities who can authenticate the domain during the lifetime of the pin, pinning may reduce the incidence of man-in-the-middle attacks due to compromised Certification Authorities.</t>
            </abstract>
          </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"/>
            <abstract>
              <t>HTTP defines proactive content negotiation to allow servers to select the appropriate response for a given request, based upon the user agent's characteristics, as expressed in request headers. In practice, user agents are often unwilling to send those request headers, because it is not clear whether they will be used, and sending them impacts both performance and privacy.</t>
              <t>This document defines an Accept-CH response header that servers can use to advertise their use of request headers for proactive content negotiation, along with a set of guidelines for the creation of such headers, colloquially known as "Client Hints."</t>
            </abstract>
          </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"/>
            <abstract>
              <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol. Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet. This document obsoletes RFC 2965. [STANDARDS-TRACK]</t>
            </abstract>
          </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"/>
            <abstract>
              <t>This document specifies a set of TCP extensions to improve performance over paths with a large bandwidth * delay product and to provide reliable operation over very high-speed paths. It defines the TCP Window Scale (WS) option and the TCP Timestamps (TS) option and their semantics. The Window Scale option is used to support larger receive windows, while the Timestamps option can be used for at least two distinct mechanisms, Protection Against Wrapped Sequences (PAWS) and Round-Trip Time Measurement (RTTM), that are also described herein.</t>
              <t>This document obsoletes RFC 1323 and describes changes from it.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7323"/>
          <seriesInfo name="DOI" value="10.17487/RFC7323"/>
        </reference>
      </references>
    </references>
    <?line 360?>

<section numbered="false" anchor="acknowledgments">
      <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>
  <!-- ##markdown-source:
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
9OhkRCHxFkHOTlSLBQuPuVhvEPwvq+9F4CtcAAA=

-->

</rfc>
