<?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.2 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-connect-tcp-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="Templated CONNECT-TCP">Template-Driven HTTP CONNECT Proxying for TCP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-connect-tcp-01"/>
    <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="2023" month="November" day="06"/>
    <area>art</area>
    <workgroup>httpbis</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 31?>

<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 35?>

<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="RFC9298"/>, and more generally IP datagrams <xref target="I-D.ietf-masque-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>Classic HTTP CONNECT proxies are identified by an origin.  The proxy does not have a path of its own.  This prevents any origin from hosting multiple distinct proxy services.</t>
        <t>Ordinarily, HTTP allows multiple origin hostnames to share a single server IP address and port number (i.e., virtual-hosting), by specifying the applicable hostname in the "Host" or ":authority" header field.  However, classic HTTP CONNECT proxies use these fields to indicate the CONNECT request's destination (<xref section="3.2.3" sectionFormat="comma" target="RFC9112"/>), leaving no way to determine the proxy's origin from the request.  As a result, classic HTTP CONNECT proxies cannot be deployed using virtual-hosting, nor can they apply the usual defenses against server port misdirection attacks (see <xref section="7.4" sectionFormat="of" target="RFC9110"/>).</t>
        <t>Classic HTTP CONNECT proxies can be used to reach a target host that is specified as a domain name or an IP address.  However, because only a single target host can be specified, proxy-driven Happy Eyeballs and cross-IP fallback can only be used when the host is a domain name.  For IP-targeted requests to succeed, the client must know which address families are supported by the proxy via some out-of-band mechanism, or open multiple independent CONNECT requests and abandon any that prove unnecessary.</t>
      </section>
      <section anchor="overview">
        <name>Overview</name>
        <t>This specification describes an alternative mechanism for proxying TCP in HTTP.  Like <xref target="RFC9298"/> and <xref target="I-D.ietf-masque-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 "tcp_port".  The client substitutes the destination host and port number into these variables to produce the request URI.</t>
      <t>The "target_host" variable <bcp14>MUST</bcp14> be a domain name, an IP address literal, or a list of IP addresses.  The "tcp_port" variable <bcp14>MUST</bcp14> be a single integer.  If "target_host" is a list (as in <xref section="2.4.2" sectionFormat="of" target="RFC6570"/>), the server <bcp14>SHOULD</bcp14> perform the same connection procedure as if these addresses had been returned in response to A and AAAA queries for a domain name.</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>
        <ul spacing="normal">
          <li>
            <t>The method <bcp14>SHALL</bcp14> be "GET".</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's target <bcp14>SHALL</bcp14> correspond to the URI derived from expansion of the proxy's URI Template.</t>
          </li>
        </ul>
        <t>If the request is well-formed and permissible, the proxy <bcp14>MUST</bcp14> attempt the TCP connection before returning its response header.  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>
        </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>
        <t>After a success response is returned, the connection <bcp14>SHALL</bcp14> conform to all the usual requirements for classic CONNECT proxies in HTTP/1.1 (<xref section="9.3.6" sectionFormat="comma" target="RFC9110"/>).  Additionally, if the proxy observes a connection error from the client (e.g., a TCP RST, TCP timeout, or TLS error), it <bcp14>SHOULD</bcp14> send a TCP RST to the target.  If the proxy observes a connection error from the target, it <bcp14>SHOULD</bcp14> send a TLS "internal_error" alert to the client, or set the TCP RST bit if TLS is not in use.</t>
        <figure>
          <name>Templated TCP proxy example in HTTP/1.1</name>
          <artwork><![CDATA[
Client                                                 Proxy

GET /proxy?target_host=192.0.2.1&tcp_port=443 HTTP/1.1
Host: example.com
Connection: Upgrade
Upgrade: connect-tcp

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

                            HTTP/1.1 101 Switching Protocols
                            Connection: Upgrade
                            Upgrade: connect-tcp
]]></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 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>From this point on, the request and response <bcp14>SHALL</bcp14> conform to all the usual requirements for classic CONNECT proxies in this HTTP version (see <xref section="8.5" sectionFormat="of" target="RFC9113"/> and <xref section="4.4" sectionFormat="of" target="RFC9114"/>).</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=192.0.2.1,2001:db8::1&tcp_port=443
:protocol = connect-tcp
...
]]></artwork>
        </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="comma" target="RFC9113"/>)(<xref section="4.1" sectionFormat="comma" target="RFC9000"/>).  Proxies <bcp14>MUST</bcp14> buffer this "optimistic" content until the TCP stream becomes writable, and discard it if the TCP connection fails.  (This "optimistic" behavior is not permitted in HTTP/1.1 because it would prevent reuse of the connection after an error response such as "407 (Proxy Authentication Required)".)</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.  Implementation of "100 (Continue)" support is <bcp14>OPTIONAL</bcp14> for clients and <bcp14>REQUIRED</bcp14> for proxies.</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>
      </section>
      <section anchor="multi-purpose-proxies">
        <name>Multi-purpose proxies</name>
        <t>The names of the variables in the URI Template uniquely identify the capabilities of the proxy.  Undefined variables are permitted in URI Templates, so a single template can be used for multiple purposes.</t>
        <t>Multipurpose templates can be useful when a single client may benefit from access to multiple complementary services (e.g., TCP and UDP), or when the proxy is used by a variety of clients with different needs.</t>
        <figure>
          <name>Example multipurpose template for a combined TCP, UDP, and IP proxy and DoH server</name>
          <artwork><![CDATA[
https://proxy.example/{?target_host,tcp_port,target_port,
                        target,ipproto,dns}
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</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.</t>
        </li>
        <li>
          <t>convert HTTP/1.1 Upgrade requests into Extended CONNECT.</t>
        </li>
        <li>
          <t>allow the Extended CONNECT method to pass through to the origin.</t>
        </li>
        <li>
          <t>forward Proxy-* request headers to the origin.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IF APPROVED, IANA is requested to add the following entry to the HTTP Upgrade Token Registry:</t>
      <ul spacing="normal">
        <li>
          <t>Value: "connect-tcp"</t>
        </li>
        <li>
          <t>Description: Proxying of TCP payloads</t>
        </li>
        <li>
          <t>Reference: (This document)</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <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="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="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="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="I-D.ietf-masque-connect-ip">
          <front>
            <title>Proxying IP in HTTP</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="David Schinazi" initials="D." surname="Schinazi">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Alex Chernyakhovsky" initials="A." surname="Chernyakhovsky">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Magnus Westerlund" initials="M." surname="Westerlund">
              <organization>Ericsson</organization>
            </author>
            <date day="28" month="April" 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="Internet-Draft" value="draft-ietf-masque-connect-ip-13"/>
        </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="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
      </references>
    </references>
    <?line 204?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Amos Jeffries, Tommy Pauly, and Kyle Nekritz for close review and suggested changes.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61b/XIbN5L/f54Cy626k1IkLcpybLPWm1Mkea0929Ja8p5T
W1sOOAOSWA9nuAOMGCblPMs9yz3Z/bobmA+Kli9353IszQzQaPTHrz+AjEaj
xFufm6ka3JrVOtfejM4re2cK9er29lqdXb19e3F2q66r8qetLRZqXlbq9ux6
kOjZrDJ3nXlZHDzi7yleLcpqO1XOZ0mSlWmhV1gnq/Tcj6zx89HS+/XMulFa
FoVJ/cin69HRJLHraqp8VTt/fHT0/Og40ZXRU6Urn7h6trLO2bLw2zWIXV7c
vkw2ZfVpUZX1eqoCxeST2eJthgGFN1VhPDaFZZPEeV1kH3VeFpi9NS5xK9D9
+M+69MZNVVEmaztVf/NlOlSurHxl5g6/bVf0y9+TRNd+WVbTRI0ShT+ype9N
8Q+9soV6M1Y36XIDij/z57Ja6ML+rD0Ynqo3xmt1DVFBhitQvSzSMQ8zK23z
qSKZ/NsMDy4dg+UkKTAOc+/MNElsMW+flDo7vT79/vL15e0PUyYRlPinssyg
K516mxrHyjrTaz2zufVb9f7da8ejM+hmqibP1Eszq2pdbdXx0eRECOlqYbxI
0k0fPdpsNuPN4zF28uj23aO0ITaqq9w9SpLRaKT0zHlaM0mgebWOplI7+rdn
RkvtFGS/UDMDC1tDUKqcK780Ki0rI2Pd2qR2blOW2lipV+XG3JlqiGHWtdTn
dZHSCM1bI8KOhulc2dUamtOFV5kBHWsK/OcU9LMqM1iDLGOKO1uVxcoU3mGV
WyLeW5pnF5ioC6VzMiOWvsxmNrBidQdBg/libhd1JfOCi6hg1njVLNAfiBeZ
cWllZ3Ce2VZpaOhSRX+C2dmVzXWlfMkiiu71/vwaPLXudsnswGTL3I1FIyub
ZblJkt+TA1RlVjMbeP69emWdh1smCe+D5FY7LN9ZQK0MjDzjfTTi3tkQeCtS
kcWjyXiC/f3HEhoVlQc6QyZamX/WxvlgWFHEJFa1LPGedkL6UkW9mpGa6QVN
FBGDCfhT5piBtd7mpcbDzPgNWRBbTg4N+zBNROptIRI++OWX7969PHs+mRwN
1Y3wrp6PH4+//fz5kJRSsi8E28JfIlgW+RYySJfwXbcKZrBHHCXMjSUAQpeF
kOhZUEsW6GGqisRcKk1bH6S5Bo6lffdg8oOx6ObRY9IMDSaFw8EKR3IiXFLW
q1QXRekhiSgiUBfxi/DMyPxkSRKLjl7DnmTnptCzvJne7g0eKeuLAt+c3vzl
/YUy8zlpiQwmSkQ01FAl6WkoAo7MOAHaINWQpV1A2HpRaQwNijl+/uzzZ9H5
ihBgYQryYSjgcmf05eh8zFED+AiLaoKGXX/+zO5leprfZ1vqwM6VXq9z6Afc
HTKrQIeSZGeL4Gaskcq4sq5g4Wvtl8KfKbKRL0f40WGMKGwq0IwUePb5/W0+
/fwZhtUx2JFIj+iP2TERYsHUyiXJ2Zdsg90GK9oMBMiLBDYKBBq7sEUQgxDO
SgwmC1lqgJbmhUgf1jtVboqISDCUO4JAUNkGMmpelSsWIKltVeferqHLjK0p
9X3sI8S5qjKIvbL5dig8Q4HlxrVTA10iSRHTkRu4Je1EE5AsMITIQUPQus4y
SN/tUd7YjIcKqO1rnY8Cf4dDEoG43TZaf6vjZk2Cf/o0eIUXA3CkBlMJ5ggf
A7U0GqFBQaR51o05X3RTUgXck2jiX57H27JFRt5veoAaMPBfvwROxy04PR4f
jx8DnIYqN/qONlSUaqO3RDsziELIM0yLjyDZVVoHcLGLUwIPyBJq+MpOWjDJ
zDovtw2W7Eh7CG4qGk0rbVnOW160dhhFwGAKxqyFtgUcMGiV1YjELbNV2Kb2
XqefnDpwxsBJ4u6fjk/IRiNmE0h/xR2Il5kJMazEbnW6xK5DtGEUYFRqsRkD
GYKzEmlXwSkcmQPotMbXNYGZSTVpmsNCY6/dBQIPDf2h6GaUhUQaYtqqi62Z
wS/ErtOqdI4C9xyvZpAE0+AV4mY2yxDfeAm7wzEYfFmSu4yEEUwIehfnqtPU
ECOdALlCQq0+FeUGpC0JKfjZHKlrHpHF1WtSlgBLG4XvLDZekqBqPyrnoxkD
dgT+IcmvXIPfxuPhBgYvCKd2vUAkoIkEGUKxFQVhIeBUTaAOrpCTCipe3RHO
mA1yy30ZmmRP93K0Nnrfi9q2iDH7tf1kenGIGftKqBl2pBLTP4rxfUTuJXJY
issnChCGc3NKoCpDRsX1CEVfNu60ROpaBDjOQH+FLNamqBX0XWkz2gLtayEI
2k+bYwpIYlNnZUGozgsRpXOK2JafSZBGoUBSVCE5NXjz/uZ2MJSf6u0V//7u
4i/vL99dnNPvN69OX79ufknCiJtXV+9fn7e/tTPPrt68uXh7LpPxVvVeJYM3
pz8MJKIOrq5vL6/enr4eCDpT8lam9YrTOewLe5wZkRrClGfHTdqMGXO+P7v+
r/+cnEBpv4MWjyeT59CiPDybPD3BA7mRrMbeJY8EXgkFbSTXliwnp4zFep2T
qGFlS0RIxITKQJrf/I0k8/ep+sMsXU9O/hhe0IZ7L6PMei9ZZvff3JssQtzz
as8yjTR773ck3ef39Ifec5R75+UfvsspsIwmz777Y0ImdNP1tCQ5VT72BwKs
kTM1WWmbrYs1fsUlgo6+ffIUGE91hQewcbxBGkFx2zHKwUQE3j4uOWqz0fh0
/ZGWHIR0J8Cbq1GFWl97I1n8V5PBmPDBC9tV8WrN9ZLpFS/gfSyO02coTlRs
ETPTB+lhP6goVKqU3DJcajw5rn7bAcaFLbV73LdCiEDkFwtTUfEx32GLowXT
P9Bc+LYR9nh8Mj6mZVv5HwqmhVgdzG5tKmo4yBcKkW3xRxJKTVZT+gbq8yDE
ZhPIODMp8OG0dVWIq+IbsM2xV5+yMk7xR0G+lQ2tin6EY/i/LJoaM0k6D73I
xmVSC8uwNutcTeakGw1qWoLT0ilcmqUcylxxSEh28KeLWxRf8jHOk6/Ie/M6
6wifsshe0tg1Yi4iJSsL3Q1m7Gukz1oJ9yhvLDJ3onKn8xpsvl+jtsgM2f/B
25JTTe0FPok0cixGUGo3aGdGSMSQlFmOi5ACFNtLuL4dT6I5SMo1PnyYz6Ll
4GE+O229XbEibQ0JlBBHGBP7yGJgI7QAaTCdSWprfloDa4jnrkxBqBdqYSTz
nudCChuT5yMyZgogBAKURCOjhFd1ozk7GPJSkPL8ut/ygIXMKdiKTZOaqZJq
rFokIc64ZzKlLpSTOTev89gYCVMbA9xjo9IR89rX1DzKOoMnRxN1cAOZp0ti
5jp2gA5bUffo/x/s7GsEg0+E8b/FKPZoa6XzoCsggl09pCxRBRg4+fBBmaqi
0gQyEiXoXRVstNTDWAeAat0y5scdihREHcu0bamRRfbYbltUAX8QXkM650OT
L67JqJZlVhqVsbUgaTB2fzpHQCABimm0EmZXFuwMSNfSjB5TCD6XnL60NVgH
AgRVY+G3WznZFk2pFP3dQ32y02YPVOPbjgOqcsaBgyJOh0nRRlOTBkEdmPEC
Jbyo5t3N7VCSCLsyqCs4LN6+vpG5CErWx2DkqOnSzIoQIQjSutxv4Eem7lsC
6w8448ReP/IspB25QdoQM27eCjPrTAsUxNcM5CAbomHF1iy1RAmVfv31V9Sx
LITf+odrhyRBcFKPeIvfdWL9i8nz4/HR+Hg8+ZeYM7w4OXncBk0KVFOApwZA
mjEKjKR1/2l02ST8nKqOnQOCvgmFS+sy7r5fQS4NE1Na+5tvkuShDTVWRxC2
B8EenLyP+4fG790ZaeOXqRyavOgcYDXHF1FgXScZfO5lJMeMAtIobVOT7tv/
aY6CgGp+8lQsNz39wUN5yzQkLmtn6qwc9eC2TWYipYje0whoX5m3L2q3nbIH
JocESBpwzfh9CdCUe5EkqKlLl4CqfVTdHrLNvDCt7EePeznDA2nCS/lOHdAS
/q6kW9/SolV2At7/C+TykhwHkGxzOrPTAns2ftLJxx43XYn4/URaZOH7ibTI
yKBfXZyeX7y7SaJ5vIjLJ1HKL+RUL+mo80XcsLSjx8HuE1HRiwcRZ3h8dDSZ
ZrNn02kffZLW1l70/G48Hv8vfO+YPa8Tg7oZzA3C5Fp9b5b6zpaVi22i8DWz
Lq25JuHu1SwOa08qOL/wXtKNygAgV+KJlLxXZI2eTkqWugglYSiM+JlCSu8Y
EorpIKMj3qSOeY09FikGrBHtwokwmO0cmt0/PmoFoEJZTZgieOI46QAsV55D
V+xuOV8ZvWKnIdSR5VAIpxK5UST/A8zRnubAFB5XQU05RoFmmwY8btOAJ+Nj
GFn8dHTUyRBOxhPJD66DgUuRWs/nJDfa0KDlYNBwVRfe5k3kDCzPSPYgsYFd
as72yO5JgdQek8i6J7Gea5tT2Xxwe2+5qO0YjFtVd1Of2N7FCpuyzrN4IhIy
uuZ4ullRS9IWc4oGJJDELQmuBydHT9WBBM5TOBp1QYJC3wlQZIcDFFnJDRfc
wRalRRE8oC6yKMC+RZDSS5ZuaNTKYTMlTbrKt3wwxR2tFBVVxjbKCXhoiZ1Q
uQ9hnXVtiBKfHuq3jVpQaumKQmhKzPx70g56YQX35qkDuyc4clYZ0iewn+st
9dojUPIqiwL11hDckMlK0wRpcijOfuQFPtICPyoOny6cqchOT77tminQ6ihk
sr495NuzKLc2nOsXJYCEzMKByYOammNwcvwEVleW6oI4ORy0lnDQinvXjXgb
mcHKoZ9ecSwJy4bT1+7ira8AgjK31J8Mt4lz47ldRKcAATCHjf2wztmnueT1
dlSZNa3ZHNCs7GLpVbosS+nIxHbP+dsbPvvMa98ptX/s4P+PcjLR6axUFHHv
Gcus9mGje7y2gwBQ/r6dMWpyG5s794hpmujuPQYIviBaG1z8hI/IeSdHR9S5
97aoTZtPhRRj78WAydF4wojGLlRse3E6tuZAVh2cBbrQerc45+sd1YqKt9TY
Nbf3OoLynQSQVISiB1Wp9fFeVfN11G1ekuhaCbWHOxx9gH7xJFdUOjN8rcam
dc7KWJp8Pa/z9jjpXl80oGPov/Ahn3b9VeWYjU4emM940WYFEVC7NXRGiBlM
p4KMtEjpkI5WdF9sAb+weuxGh9TJNucfsaPeHOJYNowYbGxc5QvhM1R2bZ+C
MXl0Iwrb6dwEiHx+fERHCEH/sS4Pkq6rThMkHEd31O+ooBmq4w8fhtSRYFd/
8uHDoehMtquzO0LlLJYFbUYi0U4D9AhPndwpuR/+u2ClO1V5LGB7e/QVuOZW
N6te4hrZJHlgmhv8dMvaZ3QfgFOscG7ON7zYA0OMQr7MeucOcQmw0B48D/ee
CXQvKvRMkTpA3MoGO876WpIgskyM3DloZquEkVP/AyvLmOZ0MS7BR5rhIkHn
EkQPE1uXiw5SmDmCPRcINDfUYOzrC+yFD9vjiaQltZ6flzcROocRKl3j107T
0drP4coPrU11QioXBKpYC8n3cIpAxUiUHfuWzh0fdiEZqlNEGDnNltswGLIE
6yNDudp6u3ujD5bb3gakA0pXCv9yYB1W5xN9yjZoNcqq+PbSvbPMgLvihEkS
EwWmF214ViK6PHidgPtjD5gGG6/EciZGlzkdHzI3zcT+TTmIJSBLk47d+xqP
4WFzLp7x986cdjr0oWrL2tMf7gfx2cmXmN+ChStMrjaWTEGGr+mKxSreP6An
PsD8sojC0fYbMufRuq7WFISDbMQ+5JZMiL7t6VTw496u6sLCDKHpcN4m8ba5
qGlbOnED74t4gaul3C+FsE53Dcc21V596BpuvK5AEN36p+yJwJo3GfcYZ3av
bTTBqVV9uK+gt31n1QLGkHKzkOQLHGmq9kpS7DOS1sgU359fH0YYKTo2b8Pd
Rz6eJFmYUMIFq+c0KrOUbxNDhEcuFNvxemyvan70S7dQHsaSeBhe8u9fbFaF
lqRdc+08zAr3eadWvgh18WqfSMMBGgQyY9Vi70PauGTtl7G25ssA5asA5VJY
I/2puRmA8OxgRVWsTm+vzq9owNU6vJPSuz/mXgEfb+WsKF0JJVT/mkNA2XDF
S/vlqEIqxH6JWltTMdZPIPjCCDXBGnqE+WSn80o3kNm7t1VXrLNmKQF/UiHd
Am6SBNcNzm0LorncxhclZ2JomCB1aRMmKP5wWy5SuNjp41HHK6UkFt+aijOe
k3TKLDCxb6rsmQx292s8vKTUXXO9AhEulrFJHUIhSMTbnZIXfLOTB7vdCXRj
+PTt6T01X75Up9fX767+enE+lBG2CYDhWmsmZyLSrSRlUrzaxgVY8XHnt+Un
Q9XwArVjtWUJ/pWOh6b9QhSvz/m2x1r6vc3/hAAL6F4Hxrh3hp00BQnpBMSL
JIdyIZruWHGGk9INqNxkC+7WwbvkNoDJXgzmCMKGXOIWme4nFs3pqnTqz2Y+
pzNqAEq5Wm3Vta6pEiSj/Pct/PGt+QT3+Tmkr+SUlaErS9KprBcLkVG4uTNO
/hslgC6bdTEAAA==

-->

</rfc>
