<?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-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Templated CONNECT-TCP">Template-Driven HTTP CONNECT Proxying for TCP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-connect-tcp-08"/>
    <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="11"/>
    <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.</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.</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>
        <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="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="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="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 358?>

<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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
Ne7ZToHbrz4wPTuATXJT8NRiQWfQJ0Jjx4ffzYuQkj6lMtqcOc0s2VHlpOPL
9hl3gbgzvr1jPT78YQ0E5QLwfDteP8MKG09CF4qLYJd1ivaWbKu5yIO7C2mx
dk3c+cbNcxQsvaI1TKcSFeT56DTwSBzVjNSFaax2bga6megu5HThDYkygG1C
pwvbh3XyaRXBz97xakQjYFHFChupDBrInYhXCrw9wS0f6D2gK+CaB5rerlpH
eG7IV7hztBMpuM2IMtNE5YcaxgtEGw++K2C5OQli2nZKexqILq9wV1dM0d7Z
VKDZgbmFAfC99NW/NWK0F8Qlafk7d7w84Tl4tvX6zp2xuA0HzUEI8FgxziV5
secF7Y0R34XP/N35V48QexDOWx2jmcyKcjM0Vx1gdKBSadon1uAXm+TbyL+p
ZNuVJ/sN8Qm3OwCHdI9JZCgH6IxkmH1CGuKFARjnGbZnctHJDPOEkYrWCS3K
K4fVsXiJINE7zfbx7F5dloQvb9d4aobROCKcvwXjDJ7I87SIKkJ37tYhPC9L
00RjK+JXPECDyqD7IhT47ZG5MGKAl/IMIZ6qwHJVeGmTa2a7f3DfHCHPEaOc
VDBz7bi2XT7xx42xuirWwOpoIFKZLEkrVmLHcLMBp9y1YTXEO5ftZmvKaNIN
QmtqpBc/queWbynhxdkNctRMpYfa5lLZQnfT10V2mbwzcn4sy/FCX6JKFn0C
NGVdHNobfmy2rd1VYxvWCNMANjn41DPFC5obd/yj/Zg3a87/YxosKyB6MSkL
b/ZvOaQEK1gbhz51wFYF8iuvIc0h1C2uwZaXyRwA6OMZio88StDh3ahplhly
q4z5zKf7uIuGeme8rBOSBQ3YGn0n4J6NIWfUK92HYVWv+SoaQ/MF6EGX/uD8
b6tbtn1wiVs8frV4OZnC9Ujgm0Yz+urBNqTwnLMhhW7RgkJpYiebY2IsuGMz
7lCgfwlPtzFlm/QYYtA1KJZPyalH2E/P0TCXbJZ6rpkSO9K0IdO5XHj/8uEu
OTNnTdPglj+DjaL2robmVOVbI0/b1RJYGhuTvJKMyac3aX6veBM2Z/8SCUZ9
k/lRSW26HH0lLBRfDdO+VMoFEmhyTpBKnes/bOSIuhkb/qyAYgK0wdGQNTir
PV97K1NHEimXkIY4aCm1NT9Uv6FADEgC+wJZOH9DfG5qJyhudLnAwsQhlT0i
kKjFAtMtxGDOL7Ha0FXCurkfUCBLQC6Vi3qPI+9SIpG6KinFr+YlxMxS2z5S
G5ip/G/maiBX3XbHgBvBwFs+LtsMbjuFfBkxe7LJb+MPetNcRiqlaJmYkwdR
9hhEyePOxZjE1TtzQ8Ek9j0XufRY3UXC7s4VF2d7DZyduZBrMQGVuKvCCE2U
+OLz1Vw64lS7uTcJOcemmsgXBDLnFSXVmgXYB0q2FEEBSsq1/BmseHrE3FdE
np/uNLfSPSeUCoHRddmUwOgN0JXdLq0hGU3r4LkY0lfVRhf1a1T2YH80Wz0q
sjXAaNOL2wc2rMuXYX7ceP7tW2BcjzLlm6NqFQLjsAeKKhVbJtutq+a4N9hS
Ox9TCwLhMnLZNv/2P+sTuaU4A4HZSLzXz+kn7Wd2mx5ve9UTZ03mXAnBXXNZ
x5IdU5ekYewMJ52jXnx/WMMw28G98cR3R94srn3Rpji6hy1vmRaHmOmIATl3
SObQXNtmmcDcVdGchyqM80+nMegymTnhgBSfzaG7ExcAq70Hjmo8LdjcEZ/W
pDiG9WF1W3nTyh5GlC510bqmi66ZYv41uRrSTMwaKLGd1Lk7+1E0XfIIkqEf
2brTyetJn5F7DUahdRNIEJz+ICbn5xdnfz45HvK4JslgbutLkk43NKoEd56I
9tK+XoRTGSXGRtfiz3Sa+FocmzAEef8aXrGJiWt4hzo9hPkbbn2jd9oIvm7u
fDVusbvR41rszPxbiXZhOFUJqNZONQKTpK4kp/RtFzld/mqpMOwIrD3eZxvV
t09Jh3uPBiOHZ3Np4LHJ5TSX6HyjojwKbSLg5ncgwcCshZmIKTi/6pOkSpJH
hfAW1G5/tfg+xxNzU7kkQ90mX4t+ts3mWgAK/CYcJIojUi9RDKb8i2AAPa17
XX4P7HBeyb9tpg85X8DKNoZ6/vW91DwjBFlRaG34WrBkM9K6eO1tbzriw3NH
7JJhHe2avoD2pHV2Zs+Pd5Fm2NTdDMMGpChncnaoMYRYt+Xj3tzAS3h/cXdt
RObz02lrHa+F/P9gHZLdbfn08n2kmjkR2kKtuULqw96ng72Dx8mjxd4HUrfN
g/0PaHZBN1vHikpr2hYvqWLOSmLoOmYk3VWkxQA3HO49NjdcNUjAZ+YW2jlE
llS/dLkA8v2Dz2N2F2XydLAAB5dSvDMg60dS7JOs0OI/5WJRkqs2Awd5AwJZ
Y2z00wa291p+LFX1y1AcgxOU4HXPdFkf++E/Rb/Uq0Kcfaw5oUcnI0qJl/Bx
dqJeLll4zL10o+B/AGlN8+ZqWwAA

-->

</rfc>
