<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-15" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-15"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit</organization>
      <address>
        <email>ietf@mariuskleidl.net</email>
      </address>
    </author>
    <author initials="G." surname="Zhang" fullname="Guoye Zhang" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>guoye_zhang@apple.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Apple</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>HTTP, upload, resumable</keyword>
    <abstract>
      <?line 78?>

<t>HTTP data transfers can encounter interruption due to reasons such as canceled requests or dropped connections. If the intended recipient can indicate how much of the data was processed prior to interruption, a sender can resume data transfer at that point instead of attempting to transfer all of the data again. HTTP range requests support this concept of resumable downloads from server to client. This document describes a mechanism that supports resumable uploads from client to server using HTTP.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-resumable-upload/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/resumable-upload"/>.</t>
    </note>
  </front>
  <middle>
    <?line 82?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP data transfers can encounter interruption due to reasons such as canceled requests or dropped connections. If the intended recipient can indicate how much of the data was processed prior to interruption, a sender can resume data transfer at that point instead of attempting to transfer all of the data again. HTTP range requests (see <xref section="14" sectionFormat="of" target="HTTP"/>) support this concept of resumable data transfers for downloads from server to client. While partial PUT is one method for uploading a partial representation (via the <tt>Content-Range</tt> header field in the request), there are caveats that affect its deployability; see <xref section="14.5" sectionFormat="of" target="HTTP"/>.</t>
      <t>Upload requests can be canceled for various reasons, including but not limited to:</t>
      <dl>
        <dt>explicit client cancellation:</dt>
        <dd>
          <t>e.g., terminating a user-agent process</t>
        </dd>
        <dt>implicit client cancellation:</dt>
        <dd>
          <t>e.g., terminating a tab, garbage collecting a process, or an internal error</t>
        </dd>
        <dt>explicit server cancellation:</dt>
        <dd>
          <t>e.g., scheduled maintenance</t>
        </dd>
        <dt>implicit server cancellation:</dt>
        <dd>
          <t>e.g., denial-of-service mitigation or an internal error</t>
        </dd>
      </dl>
      <t>Connections can be dropped due to a variety of network or transport layer reasons triggered by endpoints or on-path elements.</t>
      <t>This specification defines a new mechanism for resumable uploads from client to server that can seamlessly fall back to conventional uploads. When an upload is interrupted, clients can send subsequent requests to query the server state and use this information to send the remaining representation data. Alternatively, they can cancel the upload entirely. Unlike ranged downloads, this protocol does not support transferring an upload as multiple requests in parallel.</t>
      <t>With resumable uploads, applications can recover from unintended interruptions. They can also interrupt an upload on purpose and resume it later, for example, when a user wants to pause the upload, the device's network connectivity changes, or bandwidth is needed for higher-priority tasks.</t>
      <t>This document introduces the concept of an upload resource to facilitate resumable uploads (<xref target="upload-resource"/>). It defines new header fields to communicate the state of the upload (<xref target="upload-offset-hdr"/>, <xref target="upload-complete-hdr"/>, <xref target="upload-length-hdr"/>, and <xref target="upload-limit-hdr"/>) and the <tt>104 (Upload Resumption Supported)</tt> status code to indicate the resource's support for resumable uploads (<xref target="status-code-104"/>). It also defines the <tt>application/partial-upload</tt> media type to label partial representation data when resuming an upload (<xref target="media-type-partial-upload"/>).</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Some examples in this document contain long lines that are folded, as described in <xref target="RFC8792"/>.</t>
      <t>This document uses the following terminology from <xref section="3" sectionFormat="of" target="STRUCTURED-FIELDS"/> to specify syntax and parsing: Item, Dictionary, Integer, and Boolean.</t>
      <t>This document uses the following terms from <xref section="3" sectionFormat="of" target="HTTP"/>: "representation", "representation data", "representation metadata", "content", "client", and "server".</t>
      <t>This document uses the term "URI" as defined in <xref target="URI"/>.</t>
      <t>This document uses the term "patch document" from <xref target="PATCH"/>.</t>
      <t>An <em>upload resource</em> is a temporary resource on the server that facilitates the resumable upload of one representation (<xref target="upload-resource"/>).</t>
      <t>A <em>104 interim response</em> is an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code (<xref target="status-code-104"/>).</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Resumable uploads are supported in HTTP by a temporary resource, an <em>upload resource</em> (<xref target="upload-resource"/>), that is separate from the resource being uploaded to and specific to that upload. By interacting with the upload resource, a client can retrieve the current offset of the upload (<xref target="offset-retrieving"/>), append to the upload (<xref target="upload-appending"/>), and cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>The remainder of this section uses examples to illustrate different interactions with the upload resource. HTTP message exchanges, and thereby resumable uploads, use representation data (see <xref section="8.1" sectionFormat="of" target="HTTP"/>). This means that resumable uploads can be used with many forms of content, such as static files, in-memory buffers, data from streaming sources, or on-demand generated data. Examples are purely illustrative and non-normative. Implementations follow the normative requirements in the other sections and the security considerations in <xref target="security-considerations"/>.</t>
      <section anchor="example-1">
        <name>Example 1: Complete Upload of Representation Data with Known Size</name>
        <t>In this example, the client first attempts to upload representation data with a known size in a single HTTP request to the resource at <tt>/project/123/files</tt>. An interruption occurs and the client then attempts to resume the upload using subsequent HTTP requests to the upload resource at <tt>/uploads/abc</tt>.</t>
        <t>1) The client notifies the server that it wants to begin an upload (<xref target="upload-creation"/>). The server reserves the required resources to accept the upload from the client and then sends an interim response to the client, signaling support for resumable uploads and the upload resource's URI via the <tt>Location</tt> header field (<xref section="10.2.2" sectionFormat="of" target="HTTP"/>). The client can start sending the representation data in the request content immediately after the request header section. Alternatively, it can wait for the interim response first.</t>
        <figure anchor="fig-upload-creation">
          <name>Upload Creation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="520" viewBox="0 0 520 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,304" fill="none" stroke="black"/>
                <path d="M 368,48 L 368,304" fill="none" stroke="black"/>
                <path d="M 512,192 L 512,224" fill="none" stroke="black"/>
                <path d="M 16,128 L 360,128" fill="none" stroke="black"/>
                <path d="M 376,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 376,224 L 512,224" fill="none" stroke="black"/>
                <path d="M 16,288 L 360,288" fill="none" stroke="black"/>
                <path d="M 16,320 L 120,320" fill="none" stroke="black"/>
                <path d="M 256,320 L 360,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,224 372,218.4 372,229.6" fill="black" transform="rotate(180,376,224)"/>
                <polygon class="arrowhead" points="368,128 356,122.4 356,133.6" fill="black" transform="rotate(0,360,128)"/>
                <polygon class="arrowhead" points="24,288 12,282.4 12,293.6" fill="black" transform="rotate(180,16,288)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="348" y="36">Server</text>
                  <text x="36" y="68">POST</text>
                  <text x="132" y="68">/project/123/files</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="84" y="116">[representation]</text>
                  <text x="408" y="164">Reserve</text>
                  <text x="480" y="164">resources</text>
                  <text x="392" y="180">for</text>
                  <text x="436" y="180">upload</text>
                  <text x="120" y="260">104</text>
                  <text x="164" y="260">Upload</text>
                  <text x="236" y="260">Resumption</text>
                  <text x="320" y="260">Supported</text>
                  <text x="144" y="276">Location:</text>
                  <text x="236" y="276">/uploads/abc</text>
                  <text x="8" y="324">X</text>
                  <text x="140" y="324">Flow</text>
                  <text x="208" y="324">Interrupted</text>
                  <text x="368" y="324">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                  Server
|                                            |
| POST /project/123/files                    |
| Upload-Complete: ?1                        |
|                                            |
| [representation]                           |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for upload
|                                            |-----------------.
|                                            |                 |
|                                            |<----------------'
|                                            |
|            104 Upload Resumption Supported |
|            Location: /uploads/abc          |
|<-------------------------------------------|
|                                            |
X--------------Flow Interrupted--------------X
]]></artwork>
          </artset>
        </figure>
        <t>2) If the connection to the server is interrupted, the client might want to resume the upload. However, before this is possible, the client needs to know the amount of representation data that the server processed before the interruption. It does so by retrieving the offset (<xref target="offset-retrieving"/>) from the upload resource.</t>
        <figure anchor="fig-offset-retrieving">
          <name>Offset Retrieval</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="416" viewBox="0 0 416 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,160" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,160" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">HEAD</text>
                  <text x="108" y="68">/uploads/abc</text>
                  <text x="280" y="116">204</text>
                  <text x="308" y="116">No</text>
                  <text x="352" y="116">Content</text>
                  <text x="324" y="132">Upload-Offset:</text>
                  <text x="392" y="132">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD /uploads/abc                               |
|------------------------------------------------>|
|                                                 |
|                                204 No Content   |
|                                Upload-Offset: X |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) The client can resume the upload by sending the remaining representation data to the upload resource (<xref target="upload-appending"/>), appending to the already stored representation data in the upload using the <tt>application/partial-upload</tt> media type. The <tt>Upload-Offset</tt> header field is included to ensure that the client and server agree on the offset that the upload resumes from. Once the remaining representation data is transferred, the server processes the entire representation and responds with whatever the initial request to <tt>/project/123/files</tt> would have produced if it had not been interrupted, e.g., a <tt>201 (Created)</tt> response.</t>
        <figure anchor="fig-upload-appending">
          <name>Upload Append</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="416" viewBox="0 0 416 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,240" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,240" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,224 L 400,224" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,224)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">X</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="80" y="148">[representation</text>
                  <text x="164" y="148">from</text>
                  <text x="212" y="148">offset</text>
                  <text x="252" y="148">X]</text>
                  <text x="320" y="196">201</text>
                  <text x="368" y="196">Created</text>
                  <text x="308" y="212">Upload-Complete:</text>
                  <text x="388" y="212">?1</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?1                             |
| Upload-Offset: X                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [representation from offset X]                  |
|------------------------------------------------>|
|                                                 |
|                                     201 Created |
|                             Upload-Complete: ?1 |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can cancel the upload (<xref target="upload-cancellation"/>). The server can then release the upload resource and any associated representation data.</t>
        <figure anchor="fig-upload-cancellation">
          <name>Upload Cancellation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="416" viewBox="0 0 416 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,144" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,144" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="44" y="68">DELETE</text>
                  <text x="124" y="68">/uploads/abc</text>
                  <text x="296" y="116">204</text>
                  <text x="324" y="116">No</text>
                  <text x="368" y="116">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| DELETE /uploads/abc                             |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="example-2">
        <name>Example 2: Upload as a Series of Parts</name>
        <t>In some cases, clients might prefer to upload a representation as a series of parts sent serially across multiple HTTP messages. One use case is to overcome server limits on HTTP message content size. Another use case is where the client does not know the final size of the representation data, such as when the data originates from a streaming source.</t>
        <t>This example shows how the client, communicating with a resource known to support resumable uploads, can upload parts of a representation incrementally.</t>
        <t>1) The client is aware that the target resource supports resumable uploads and therefore starts the upload with the <tt>Upload-Complete</tt> header field set to false and the first part of the representation.</t>
        <figure anchor="fig-upload-creation-incomplete">
          <name>Upload Creation with Partial Representation Data</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="416" viewBox="0 0 416 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,208" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,208" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <path d="M 16,192 L 400,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
                <polygon class="arrowhead" points="24,192 12,186.4 12,197.6" fill="black" transform="rotate(180,16,192)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">POST</text>
                  <text x="132" y="68">/project/123/files</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?0</text>
                  <text x="52" y="116">[partial</text>
                  <text x="152" y="116">representation]</text>
                  <text x="320" y="164">201</text>
                  <text x="368" y="164">Created</text>
                  <text x="256" y="180">Location:</text>
                  <text x="348" y="180">/uploads/abc</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| POST /project/123/files                         |
| Upload-Complete: ?0                             |
|                                                 |
| [partial representation]                        |
|------------------------------------------------>|
|                                                 |
|                                     201 Created |
|                          Location: /uploads/abc |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>2) Next, intermediate parts are appended (<xref target="upload-appending"/>) with the <tt>Upload-Complete</tt> header field set to false, indicating that they are not the last part of the representation data.</t>
        <figure anchor="fig-upload-appending-incomplete">
          <name>Appending Partial Representation Data to Upload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?0</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">X</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="52" y="148">[partial</text>
                  <text x="148" y="148">representation</text>
                  <text x="228" y="148">from</text>
                  <text x="276" y="148">offset</text>
                  <text x="316" y="148">X]</text>
                  <text x="296" y="196">204</text>
                  <text x="324" y="196">No</text>
                  <text x="368" y="196">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?0                             |
| Upload-Offset: X                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [partial representation from offset X]          |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) If the connection was interrupted, the client might want to resume the upload, similar to the previous example (<xref target="example-1"/>). The client retrieves the offset (<xref target="offset-retrieving"/>) to learn the amount of representation data processed by the server and then continues appending the remaining parts to the upload as in the previous step.</t>
        <figure anchor="fig-upload-resume-incomplete">
          <name>Resuming an Interrupted Upload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="416" viewBox="0 0 416 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,336" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,336" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <path d="M 16,272 L 400,272" fill="none" stroke="black"/>
                <path d="M 16,320 L 400,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,272 396,266.4 396,277.6" fill="black" transform="rotate(0,400,272)"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">HEAD</text>
                  <text x="108" y="68">/uploads/abc</text>
                  <text x="296" y="116">204</text>
                  <text x="324" y="116">No</text>
                  <text x="368" y="116">Content</text>
                  <text x="324" y="132">Upload-Offset:</text>
                  <text x="392" y="132">Y</text>
                  <text x="40" y="180">PATCH</text>
                  <text x="116" y="180">/uploads/abc</text>
                  <text x="84" y="196">Upload-Complete:</text>
                  <text x="164" y="196">?0</text>
                  <text x="76" y="212">Upload-Offset:</text>
                  <text x="144" y="212">Y</text>
                  <text x="72" y="228">Content-Type:</text>
                  <text x="236" y="228">application/partial-upload</text>
                  <text x="52" y="260">[partial</text>
                  <text x="148" y="260">representation</text>
                  <text x="228" y="260">from</text>
                  <text x="276" y="260">offset</text>
                  <text x="316" y="260">Y]</text>
                  <text x="296" y="308">204</text>
                  <text x="324" y="308">No</text>
                  <text x="368" y="308">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD /uploads/abc                               |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|                                Upload-Offset: Y |
|<------------------------------------------------|
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?0                             |
| Upload-Offset: Y                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [partial representation from offset Y]          |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) The request to append the last part of the representation data has the <tt>Upload-Complete</tt> header field set to true to indicate the complete transfer. Once the remaining representation data is transferred, the server processes the entire representation and responds with whatever the initial request to <tt>/project/123/files</tt> would have produced if its representation had been fully transferred and processed, e.g., a <tt>201 (Created)</tt> response.</t>
        <figure anchor="fig-upload-appending-last-chunk">
          <name>Appending Remaining Representation Data</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="416" viewBox="0 0 416 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,240" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,240" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,224 L 400,224" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,224)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">Z</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="60" y="148">[remaining</text>
                  <text x="164" y="148">representation</text>
                  <text x="244" y="148">from</text>
                  <text x="292" y="148">offset</text>
                  <text x="332" y="148">Z]</text>
                  <text x="320" y="196">201</text>
                  <text x="368" y="196">Created</text>
                  <text x="308" y="212">Upload-Complete:</text>
                  <text x="388" y="212">?1</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?1                             |
| Upload-Offset: Z                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [remaining representation from offset Z]        |
|------------------------------------------------>|
|                                                 |
|                                     201 Created |
|                             Upload-Complete: ?1 |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="upload-resource">
      <name>Upload Resource</name>
      <t>A resumable upload is enabled through interaction with an upload resource. When a resumable upload begins, the server is asked to create an upload resource through a request to another resource (<xref target="upload-creation"/>). Using this upload resource, the client can query the upload progress (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>). The server is responsible for persisting the state of the upload resource (see below) and updating it as the upload progresses. Limits (<xref target="upload-limits"/>) can also apply to the upload resource.</t>
      <t>An upload resource is specific to the upload of one representation. For uploading multiple representations, multiple upload resources have to be used.</t>
      <t>Server implementations need to decide how long to retain an upload resource after the upload is complete. The server can clean up the upload resource and make it inaccessible immediately. Keeping it longer lets a client that missed the final response verify the upload's state, at a cost to the server.</t>
      <t>An upload resource <bcp14>SHOULD</bcp14> be unique. Reuse of a URI for a different upload resource <bcp14>SHOULD</bcp14> be avoided in order to reduce the chance of misdirected or corrupted upload resources, as well as the potential security issues described in <xref target="security-uri"/>.</t>
      <t>If the client receives a <tt>3xx (Redirection)</tt> response to a request to the upload resource, and the response does not complete the upload (<xref target="origin"/>), the client is not expected to follow the redirect, because this protocol does not define how an upload continues at a different URI.</t>
      <t>The state of an upload includes the following properties that are tracked by the server.</t>
      <section anchor="upload-offset">
        <name>Offset</name>
        <t>The offset is the number of bytes from the representation data that have been processed, either during the creation of the upload resource (<xref target="upload-creation"/>) or by appending to it (<xref target="upload-appending"/>). The offset is required when appending representation data to synchronize the client and resource regarding the amount of transferred representation data.</t>
        <t>The offset reflects application-level processing for the upload. Data might have been delivered and acknowledged at the transport layer without yet being reflected in the offset.</t>
        <t>Representation data processed by the upload resource cannot be removed again and, therefore, the offset as seen by the client <bcp14>MUST NOT</bcp14> decrease. Clients can use this guarantee to free resources associated with transferred representation data, as no retransmission of it will be necessary. If the server loses any part of the state, it <bcp14>MUST</bcp14> deactivate the upload resource and reject further interaction with it.</t>
        <section anchor="upload-offset-hdr">
          <name>Upload-Offset</name>
          <t>The <tt>Upload-Offset</tt> request and response header field is an Item Structured Header Field of type Integer (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>). Its value is a non-negative Integer and indicates the current offset, as viewed by the message sender. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored. This document does not define parameters for <tt>Upload-Offset</tt>; unknown parameters <bcp14>MUST</bcp14> be ignored.</t>
          <t>The client can learn the current offset in three ways:</t>
          <ul spacing="normal">
            <li>
              <t>The offset can be explicitly retrieved from the upload resource (<xref target="offset-retrieving"/>).</t>
            </li>
            <li>
              <t>Interim responses for creating the upload (<xref target="upload-creation"/>) or appending (<xref target="upload-appending"/>), and their final responses with a non-<tt>2xx</tt> status code and the <tt>Upload-Complete: ?0</tt> header field, can include the <tt>Upload-Offset</tt> header field.</t>
            </li>
            <li>
              <t>Final responses for appending representation data (<xref target="upload-appending"/>) with a <tt>2xx (Successful)</tt> status code and the <tt>Upload-Complete: ?0</tt> header field acknowledge that the entire request content was received and the offset increased by the length of the appended representation data. If present, the <tt>Upload-Offset</tt> header field value <bcp14>MUST</bcp14> match this inferred offset.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="upload-complete">
        <name>Completeness</name>
        <t>An upload is incomplete until it is explicitly marked as complete by the client or the server. After this point, no more representation data can be appended.</t>
        <section anchor="upload-complete-hdr">
          <name>Upload-Complete</name>
          <t>The <tt>Upload-Complete</tt> request and response header field is an Item Structured Header Field of type Boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>). Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored. This document does not define parameters for <tt>Upload-Complete</tt>; unknown parameters <bcp14>MUST</bcp14> be ignored.</t>
          <t>An upload is marked as complete either when a request for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>) includes the <tt>Upload-Complete</tt> header field set to true and the request content was fully processed, or when a response includes the field set to true.</t>
          <t>In an upload creation response (<xref target="upload-creation"/>) or an upload append response (<xref target="upload-appending"/>), the <tt>Upload-Complete</tt> header field indicates where the response comes from: true means the target resource of the initial request, and false means the resumable upload protocol. After a response with the <tt>Upload-Complete</tt> header field set to true, the client <bcp14>SHOULD NOT</bcp14> resume the upload.</t>
          <t>Note that the <tt>Upload-Complete</tt> header field can be true even when the full representation data was not transmitted, because the target resource can generate an early response. Also note that it can be false in response to an invalid request to a completed upload.</t>
        </section>
      </section>
      <section anchor="upload-length">
        <name>Length</name>
        <t>The length is the number of bytes of the representation data. It might not be known when starting the transfer, for example, because the representation is taken from a streaming source. The length will, however, be known at the latest when the client completes the upload (<xref target="upload-complete"/>).</t>
        <t>A client <bcp14>SHOULD</bcp14> communicate the representation's length to the server as soon as it becomes known, without waiting for the upload to complete. This aids resource management and allows early validation. A request that creates the upload resource (<xref target="upload-creation"/>) or appends to it (<xref target="upload-appending"/>) has two possible indicators of the length:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the request includes the <tt>Upload-Complete</tt> header field set to true, the request content is the remaining representation data. The representation's length is then the sum of the current offset (<xref target="upload-offset"/>) and the request content's length, which might be announced in the <tt>Content-Length</tt> header field.</t>
          </li>
          <li>
            <t>The request can include the <tt>Upload-Length</tt> header field defined below.</t>
          </li>
        </ol>
        <t>If indicators (1) and (2) are both present in the same request, their indicated lengths <bcp14>MUST</bcp14> match. The representation's length, if known, <bcp14>MUST</bcp14> stay consistent across subsequent requests. A server <bcp14>SHOULD</bcp14> respond to a request with inconsistent length indicators with a <tt>400 (Bad Request)</tt> status code, and can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#inconsistent-upload-length" (<xref target="inconsistent-length"/>) to indicate why.</t>
        <t>Note that the length and offset values do not determine whether an upload is complete. Instead, the client uses the <tt>Upload-Complete</tt> header field (<xref target="upload-complete-hdr"/>) to indicate that a request completes the upload. The offset could match the length, but the upload can still be incomplete.</t>
        <section anchor="upload-length-hdr">
          <name>Upload-Length</name>
          <t>The <tt>Upload-Length</tt> request and response header field is an Item Structured Header Field of type Integer (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>). Its value is a non-negative Integer and indicates the representation's length. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored. This document does not define parameters for <tt>Upload-Length</tt>; unknown parameters <bcp14>MUST</bcp14> be ignored.</t>
          <t>The <tt>Upload-Length</tt> field can be used in response to an offset retrieval; see <xref target="offset-retrieving-server"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="upload-limits">
      <name>Upload Limits</name>
      <t>A server can limit an upload, for example, in its total size, in the size of each request, or in how long the upload resource remains available. The server announces these limits to the client in the <tt>Upload-Limit</tt> header field (<xref target="upload-limit-hdr"/>), so the client can adhere to them.</t>
      <t>A client usually learns the limits when the upload resource is created (<xref target="upload-creation"/>). It can learn them before that through an <tt>OPTIONS</tt> request (<xref target="upload-limits-options"/>).</t>
      <section anchor="upload-limit-hdr">
        <name>Upload-Limit</name>
        <t>The <tt>Upload-Limit</tt> response header field is a Dictionary Structured Header Field (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>). Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored. Receivers of the <tt>Upload-Limit</tt> header field parse the Dictionary as described in <xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>. Where the Dictionary is successfully parsed, this document places the following additional requirements on Dictionary members.</t>
        <t>A member with an unknown key <bcp14>MUST</bcp14> be ignored. A member with a known key is only valid if it has the expected type and its value is within the permitted range. Some members are related and their values can specify a combined range, which has its own definition of validity.</t>
        <t>Receiving an invalid member or members that specify an invalid combined range is an error. It <bcp14>MUST</bcp14> cause the entire <tt>Upload-Limit</tt> header field to be ignored, or alternatively the complete HTTP message <bcp14>MUST</bcp14> be treated as malformed.</t>
        <t>This document does not define parameters for Dictionary member values; unknown parameters <bcp14>MUST</bcp14> be ignored.</t>
        <t>The following key-value pairs are defined.</t>
        <section anchor="upload-limit-max-size">
          <name>max-size</name>
          <t>The <tt>max-size</tt> limit specifies a maximum size, in bytes, for the representation data. The value is an Integer greater than zero; a value of zero would only permit empty uploads.</t>
          <t>The server might not create an upload resource if the representation's length (<xref target="upload-length"/>) deduced from the upload creation request is larger than the maximum size. The server might also deactivate the upload resource if the offset (<xref target="upload-offset"/>) exceeds the maximum size.</t>
        </section>
        <section anchor="upload-limit-min-size">
          <name>min-size</name>
          <t>The <tt>min-size</tt> limit specifies a minimum size, in bytes, for the representation data. The value is a non-negative Integer. It <bcp14>MUST NOT</bcp14> be greater than the <tt>max-size</tt> value, if present.</t>
          <t>The server might not create an upload resource if the representation's length (<xref target="upload-length"/>) deduced from the upload creation request is smaller than the minimum size or no length can be deduced at all. Resumable uploads impose additional overhead on the server, which might not be acceptable for small representations. Requests with representation data below this value might still be accepted by the server, although without the ability to resume them.</t>
        </section>
        <section anchor="upload-limit-max-append-size">
          <name>max-append-size</name>
          <t>The <tt>max-append-size</tt> limit specifies a maximum size, in bytes, for the request content in a single upload append (<xref target="upload-appending"/>) or upload creation (<xref target="upload-creation"/>) request. The value is an Integer greater than zero; a value of zero would only permit requests with no content.</t>
          <t>The server might reject requests exceeding this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send larger upload append or upload creation requests.</t>
        </section>
        <section anchor="upload-limit-min-append-size">
          <name>min-append-size</name>
          <t>The <tt>min-append-size</tt> limit specifies a minimum size, in bytes, for the request content in a single upload append (<xref target="upload-appending"/>) or upload creation (<xref target="upload-creation"/>) request. The value is a non-negative Integer. It <bcp14>MUST NOT</bcp14> be greater than the <tt>max-append-size</tt> or <tt>max-size</tt> values, if present. This limit does not apply to upload creation requests with no content, or to requests completing the upload by including the <tt>Upload-Complete: ?1</tt> header field.</t>
          <t>The server might reject requests below this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send smaller upload append or upload creation requests.</t>
        </section>
        <section anchor="upload-limit-max-age">
          <name>max-age</name>
          <t>The <tt>max-age</tt> limit specifies the remaining lifetime, in seconds, of the upload resource, counted from the generation of the response. The value is a non-negative Integer.</t>
          <t>After the resource's lifetime is reached, the server might make the upload resource inaccessible.</t>
        </section>
      </section>
      <section anchor="upload-limits-options">
        <name>Use with OPTIONS</name>
        <t>Before creating an upload resource, a client can send an <tt>OPTIONS</tt> request to discover whether the resource supports resumable uploads and to learn potential limits. The request does not include the <tt>Upload-Complete</tt> header field; otherwise, it would be a request to create an upload resource (<xref target="upload-creation"/>).</t>
        <t>When responding to such a request, if the target resource supports the creation of a resumable upload resource (<xref target="upload-creation"/>), the server <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits in the response. If a server is configured such that all of its resources support the creation of upload resources with identical limits, it <bcp14>SHOULD</bcp14> include the <tt>Upload-Limit</tt> header field in response to an <tt>OPTIONS</tt> request for the target <tt>*</tt> (if this target is supported).</t>
        <t>In an <tt>OPTIONS</tt> response, the presence of the <tt>Upload-Limit</tt> header field signals support for resumable uploads, even when the server applies no limits. An empty Dictionary is equivalent to omitting the field (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>), so it cannot carry this signal. If the server does not apply any limits, it <bcp14>MUST</bcp14> send <tt>min-size=0</tt>.</t>
        <t>To reduce the likelihood of failing requests, the limits announced in an <tt>OPTIONS</tt> response <bcp14>SHOULD NOT</bcp14> be less restrictive than the limits applied to an upload once the upload resource has been created, unless the request to create an upload resource included additional information that warrants different limits. For example, a server might announce a general maximum size limit of 1 GB, but reduce it to 100 MB when the media type indicates an image.</t>
      </section>
      <section anchor="upload-limits-changes">
        <name>Limit Changes</name>
        <t>Throughout the lifetime of the upload resource, limits <bcp14>SHOULD NOT</bcp14> change in a way that causes failures for clients adhering to the initially discovered limits. If the client discovers that it cannot continue the upload while adhering to the limits, it <bcp14>SHOULD</bcp14> stop the current request immediately (<xref target="request-cancellation"/>) and cancel the upload (<xref target="upload-cancellation"/>).</t>
        <t>The following recommendations for limit changes can minimize the risk of causing upload failures:</t>
        <ul spacing="normal">
          <li>
            <t><tt>max-size</tt> and <tt>max-append-size</tt> <bcp14>SHOULD NOT</bcp14> decrease.</t>
          </li>
          <li>
            <t><tt>min-size</tt> and <tt>min-append-size</tt> <bcp14>SHOULD NOT</bcp14> increase.</t>
          </li>
          <li>
            <t>Between subsequent responses, the end of the upload resource's lifetime as implied by <tt>max-age</tt> <bcp14>SHOULD NOT</bcp14> decrease.</t>
          </li>
        </ul>
      </section>
      <section anchor="upload-limits-violations">
        <name>Limit Violations</name>
        <t>When a request is rejected because limits were violated, the response <bcp14>SHOULD</bcp14> include the <tt>Upload-Limit</tt> header field carrying all limits of the corresponding upload if possible. This might not be possible if intermediaries enforce limits.</t>
        <t>Servers, including intermediaries, can (and often do) apply restrictions on the size of individual request message content. There is no standard mechanism to communicate such existing size restriction. A server that implements one can respond with a <tt>413 (Content Too Large)</tt> status code; see <xref section="15.5.14" sectionFormat="of" target="HTTP"/>. Appending to an upload resource, as a series of appends, can be used to upload data up to the <tt>max-size</tt> limit (<xref target="upload-limit-max-size"/>) without encountering per-message limits. Servers might apply restrictions that are smaller than the append limits, which would also result in a failed request.</t>
        <t>When a client receives a response with a <tt>413 (Content Too Large)</tt> status code during upload creation (<xref target="upload-creation"/>) or append (<xref target="upload-appending"/>), it <bcp14>SHOULD</bcp14> retry the request with a smaller size residing between <tt>min-append-size</tt> (<xref target="upload-limit-min-append-size"/>) and <tt>max-append-size</tt> (<xref target="upload-limit-max-append-size"/>). If these limits are unknown at the time of receiving such a response, the client can attempt to discover them through an <tt>OPTIONS</tt> request (<xref target="upload-limits-options"/>). Retrying with the same request content size will likely yield the same error response. Cases where the request content size matches the <tt>min-append-size</tt> limit yet fails with a <tt>413 (Content Too Large)</tt> response might indicate a deployment mismatch that cannot be recovered from.</t>
      </section>
    </section>
    <section anchor="upload-creation">
      <name>Upload Creation</name>
      <section anchor="client-behavior">
        <name>Client Behavior</name>
        <t>A client can start a resumable upload from any request that can carry content by including the <tt>Upload-Complete</tt> header field (<xref target="upload-complete-hdr"/>). Any method that allows content can be used, such as <tt>POST</tt>, <tt>PUT</tt>, and <tt>PATCH</tt>. The request can benefit from incremental delivery; see <xref target="incremental"/>.</t>
        <t>The <tt>Upload-Complete</tt> header field is set to true if the request content includes the entire representation data that the client intends to upload. This is also a requirement for transparently upgrading to resumable uploads from conventional uploads (<xref target="upgrading-uploads"/>).</t>
        <t>If the client knows the representation's length, it <bcp14>SHOULD</bcp14> indicate the length in the request to help the server allocate necessary resources for the upload and provide early feedback if the representation violates a limit (<xref target="upload-limits"/>), as described in <xref target="upload-length"/>.</t>
        <t>Clients are not required to discover limits (<xref target="upload-limits"/>) before starting the upload and might therefore be initially unaware of limits enforced by the server. However, the client <bcp14>SHOULD</bcp14> respect any limits announced during the upload process in the <tt>Upload-Limit</tt> header field in interim or final responses. In particular, if the allowed maximum size is less than the amount of representation data the client intends to upload, the client <bcp14>SHOULD</bcp14> stop the current request immediately (<xref target="request-cancellation"/>) and cancel the upload (<xref target="upload-cancellation"/>). If the client knows that the representation data is smaller than <tt>min-size</tt> (<xref target="upload-limit-min-size"/>), it cannot expect resumability to be offered. The client might still attempt to transfer the representation in a single request, either in a request with the <tt>Upload-Complete</tt> header field set to true (see <xref target="upgrading-uploads"/>) or via a conventional upload.</t>
        <t>The request content can be empty. If the <tt>Upload-Complete</tt> header field is then set to true, the client intends to upload an empty representation. An <tt>Upload-Complete</tt> header field set to false is also valid. This can be used to retrieve the upload resource's URI before transferring any representation data. Since interim responses are optional, this technique provides another mechanism to learn the URI, at the cost of an additional round trip before data upload can commence.</t>
        <t>Representation metadata included in the initial request (see <xref section="8" sectionFormat="of" target="HTTP"/>) can affect how servers act on the uploaded representation data. The <tt>Content-Type</tt> header field indicates the media type of the representation. The <tt>Content-Encoding</tt> header field names the content codings applied to the representation.</t>
        <t>If the client receives a final response that marks the upload as complete, the response comes from the target resource of the initial request (<xref target="upload-complete-hdr"/>). Note that this does not necessarily indicate success. <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> status codes indicate in this case an error occurred while processing the representation, and therefore, resuming the upload would not resolve this error.</t>
        <t>If the client sent the <tt>Upload-Complete</tt> header field set to false and receives a <tt>2xx (Successful)</tt> final response that does not mark the upload as complete, the <tt>Location</tt> header field points the client to the created upload resource. The client can continue appending representation data to it (<xref target="upload-appending"/>).</t>
        <t>If the client receives a <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> final response that does not mark the upload as complete, or if it did not receive a final response, it can apply the heuristics described in <xref target="retry"/> to retry or resume the upload.</t>
      </section>
      <section anchor="server-behavior">
        <name>Server Behavior</name>
        <t>Upon receiving a request with the <tt>Upload-Complete</tt> header field, the server can choose to offer resumption support for this request by creating an upload resource. If so, the server <bcp14>SHOULD</bcp14> announce the upload resource by sending an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code unless the server is not capable of sending interim responses. The interim response allows the client to resume the upload even if the message exchange gets later interrupted. When sent, it <bcp14>MUST</bcp14> include <tt>Location</tt> header field pointing to the upload resource and <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits (<xref target="upload-limits"/>) if any.</t>
        <t>The target resource of the initial request is responsible for processing the representation data transferred in the resumable upload according to the method and header fields in the initial request. The upload resource, on the other hand, enables resuming the transfer.</t>
        <t>If the <tt>Upload-Complete</tt> request header field is set to true, the client intends to transfer the entire representation data in one request. If the request content was fully processed, no resumable upload is needed and the server proceeds to process the request and generate a response. Any <tt>2xx (Successful)</tt> response that the server generates for such a request <bcp14>MUST</bcp14> mark the upload as complete.</t>
        <t>If the <tt>Upload-Complete</tt> request header field is set to false, the client intends to transfer the representation over multiple requests. If the request content was fully processed, the server <bcp14>MUST</bcp14> include the <tt>Location</tt> header field pointing to the upload resource and <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits if any. Servers are <bcp14>RECOMMENDED</bcp14> to use the <tt>201 (Created)</tt> status code.</t>
        <t>The server <bcp14>MUST</bcp14> record the representation's length according to <xref target="upload-length"/> if the <tt>Upload-Length</tt> or <tt>Upload-Complete: ?1</tt> header fields are included in the request.</t>
        <t>While the request content is being processed, the server <bcp14>SHOULD</bcp14> send interim responses with a <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Upload-Offset</tt> header field set to the current offset to inform the client about the upload progress.</t>
        <t>Every response to the same request that identifies the upload resource in the <tt>Location</tt> header field <bcp14>MUST</bcp14> use the same URI. A final response with <tt>Upload-Complete: ?1</tt> is the result of processing the representation, so its <tt>Location</tt> header field can identify a different resource. Clients <bcp14>SHOULD</bcp14> check that the upload resource URI does not change, and <bcp14>SHOULD</bcp14> stop the current request immediately (<xref target="request-cancellation"/>) and cancel the upload (<xref target="upload-cancellation"/>) if it does.</t>
        <t>The server <bcp14>SHOULD</bcp14> include the <tt>Upload-Complete</tt> header field (<xref target="upload-complete-hdr"/>) in the response to indicate whether it is the result of processing the uploaded representation.</t>
        <t>The server <bcp14>SHOULD NOT</bcp14> generate a response with a <tt>3xx (Redirection)</tt> status code and the <tt>Upload-Complete: ?0</tt> header field because the upload resource's URI is expected to remain the same for the lifetime of the upload. See <xref target="origin"/> for redirecting a response that completes the upload.</t>
        <t>The server might not process the entire request content when the upload is interrupted, for example, because of a dropped connection or a canceled request. In this case, the server <bcp14>SHOULD</bcp14> append as much of the request content as possible to the upload resource, allowing the client to resume the upload from where it was interrupted. The upload resource <bcp14>MUST NOT</bcp14> be considered complete in this case.</t>
      </section>
      <section anchor="upload-creation-example">
        <name>Examples</name>
        <t>A) The following example shows an upload creation, where all 123456789 bytes are transferred in the initial request. The server sends multiple interim responses and one final response from processing the uploaded representation.</t>
        <sourcecode type="http-message"><![CDATA[
POST /project/123/files HTTP/1.1
Host: example.com
Content-Length: 123456789
Upload-Length: 123456789
Upload-Complete: ?1

[content (123456789 bytes)]
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/b530ce8ff
Upload-Limit: max-size=1234567890

HTTP/1.1 104 Upload Resumption Supported
Upload-Offset: 23456789

HTTP/1.1 201 Created
Upload-Complete: ?1
Location: https://example.com/project/123/files/b530ce8ff
Content-Type: application/json

{"attachmentId": "b530ce8ff"}
]]></sourcecode>
        <t>B) The following example shows an upload creation, where only the first 23456789 bytes of a 123456789-byte upload are transferred. The server acknowledges the processed representation data and that the upload is not complete yet. The client can continue appending data.</t>
        <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Complete: ?0
Content-Length: 23456789
Upload-Length: 123456789

[partial content (23456789 bytes)]
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/3fd4994ad
Upload-Limit: max-size=1234567890

HTTP/1.1 201 Created
Location: https://example.com/upload/3fd4994ad
Upload-Complete: ?0
Upload-Limit: max-size=1234567890
]]></sourcecode>
        <t>C) The following example shows an upload creation, where the server responds with a <tt>5xx (Server Error)</tt> status code. Thanks to the interim response containing the upload resource URI, the client can resume the upload.</t>
        <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Complete: ?1
Content-Length: 123456789
Upload-Length: 123456789

[content (123456789 bytes)]
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/0587fa44b

HTTP/1.1 500 Internal Server Error
]]></sourcecode>
        <t>D) The following example shows an upload creation being rejected by the server because the request content cannot be decoded. The <tt>Upload-Complete</tt> header field in the response is set to true because, after the decoding failure, the server does not want the rest of the representation and considers the upload complete. The client cannot continue the upload.</t>
        <sourcecode type="http-message"><![CDATA[
POST /upload-gzip HTTP/1.1
Host: example.com
Upload-Complete: ?0
Content-Length: 23456789
Upload-Length: 123456789
Content-Encoding: gzip

[corrupted gzip content]
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/6723cdf37

HTTP/1.1 400 Bad Request
Upload-Complete: ?1
]]></sourcecode>
      </section>
    </section>
    <section anchor="offset-retrieving">
      <name>Offset Retrieval</name>
      <section anchor="client-behavior-1">
        <name>Client Behavior</name>
        <t>If the client wants to resume the upload after an interruption, it has to know the amount of representation data processed by the upload resource so far. It can fetch the offset by sending a <tt>HEAD</tt> or <tt>GET</tt> request to the upload resource. Using <tt>HEAD</tt> is <bcp14>RECOMMENDED</bcp14>, since response content is not required for resumption. In a successful response, the <tt>Upload-Offset</tt> header field indicates the offset from which the client can continue the upload by appending representation data (<xref target="upload-appending"/>).</t>
        <t>The offset can be less than or equal to the number of bytes of representation data that the client has already sent. The client is expected to handle backtracking of a reasonable length. On the other hand, the offset can be greater than the amount of sent representation data, for example, if the server already has data from an earlier attempt to upload the same representation. If the client is not able to provide the representation data at the given offset, the upload <bcp14>MUST</bcp14> be considered a failure. The client then <bcp14>MUST NOT</bcp14> continue the upload and <bcp14>SHOULD</bcp14> cancel the upload (<xref target="upload-cancellation"/>).</t>
        <t>The client <bcp14>MUST NOT</bcp14> retrieve the offset while it is still creating (<xref target="upload-creation"/>) or appending to (<xref target="upload-appending"/>) the same upload resource, because the server might terminate the in-progress request (<xref target="concurrency"/>).</t>
        <t>If the client receives a <tt>2xx (Successful)</tt> response with a valid <tt>Upload-Offset</tt> header field, the client can continue appending representation data to it (<xref target="upload-appending"/>).</t>
        <t>If the client receives a <tt>2xx (Successful)</tt> response without a valid <tt>Upload-Offset</tt> header field, a <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> response, or if it did not receive a response, the client <bcp14>MAY</bcp14> retry retrieving the offset. Otherwise, the upload is considered a failure.</t>
      </section>
      <section anchor="offset-retrieving-server">
        <name>Server Behavior</name>
        <t>A successful response to a <tt>HEAD</tt> or <tt>GET</tt> request to an upload resource</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> include the offset in the <tt>Upload-Offset</tt> header field (<xref target="upload-offset-hdr"/>),</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> indicate the limits in the <tt>Upload-Limit</tt> header field (<xref target="upload-limits"/>) if any, and</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> include the <tt>Cache-Control</tt> header field with the value <tt>no-store</tt> to prevent HTTP caching (<xref target="HTTP-CACHING"/>).</t>
          </li>
        </ul>
        <t>The server <bcp14>SHOULD NOT</bcp14> generate a response with a <tt>3xx (Redirection)</tt> status code because the upload resource's URI is expected to remain the same for the lifetime of the upload.</t>
        <t>A client does not require response content for an offset retrieval request in order to successfully resume an upload. Therefore, serving response content for a <tt>GET</tt> request is unexpected. Its meaning is not defined by this protocol.</t>
      </section>
      <section anchor="offset-retrieving-example">
        <name>Examples</name>
        <t>The following example shows an offset retrieval request. The server indicates the current offset and that the upload is not complete yet. The client can continue to append representation data.</t>
        <sourcecode type="http-message"><![CDATA[
HEAD /upload/c35e2cd29 HTTP/1.1
Host: example.com
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Complete: ?0
Upload-Offset: 25000000
Upload-Length: 100000000
Upload-Limit: max-age=3600
Cache-Control: no-store
]]></sourcecode>
      </section>
    </section>
    <section anchor="upload-appending">
      <name>Upload Append</name>
      <section anchor="client-behavior-2">
        <name>Client Behavior</name>
        <t>A client can continue the upload and append representation data by sending a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) to the upload resource. The request content is the representation data to append. The request can benefit from incremental delivery; see <xref target="incremental"/>.</t>
        <t>The client <bcp14>MUST</bcp14> indicate the offset of the request content inside the representation data by including the <tt>Upload-Offset</tt> header field. To ensure that the upload resource accepts the request, the client <bcp14>SHOULD</bcp14> take the offset from the most recent offset retrieval (<xref target="offset-retrieving"/>), upload creation (<xref target="upload-creation"/>), or upload append response.</t>
        <t>The request content is the representation data to append, so the patch document has no content coding of its own. A content coding would make the request content differ from the representation data that the offset (<xref target="upload-offset"/>) and length (<xref target="upload-length"/>) count. Therefore, the request <bcp14>MUST NOT</bcp14> include a <tt>Content-Encoding</tt> header field (see <xref section="8.4" sectionFormat="of" target="HTTP"/>). Content codings of the representation, if any, are announced only in the upload creation request (<xref target="upload-creation"/>).</t>
        <t>The request <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field. Its value is true in two cases:</t>
        <ul spacing="normal">
          <li>
            <t>the request has content that is the end of the representation data. Once the content is fully processed by the server, the upload is complete.</t>
          </li>
          <li>
            <t>the request has no content. Once the request is processed by the server, the upload is complete. This usage requires the full representation data to have been processed during prior requests.</t>
          </li>
        </ul>
        <t>If the client receives a final response that marks the upload as complete, the response comes from the target resource of the initial request (<xref target="upload-complete-hdr"/>). Note that this does not necessarily indicate success. <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> status codes indicate in this case an error occurred while processing the representation, and therefore, resuming the upload would not resolve this error.</t>
        <t>If the client receives a <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> final response that does not mark the upload as complete, or if it did not receive a final response, it can apply the heuristics described in <xref target="retry"/> to retry or resume the upload. Otherwise, the upload is considered a failure.</t>
      </section>
      <section anchor="server-behavior-1">
        <name>Server Behavior</name>
        <t>A server applies a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) to an upload resource by appending the patch document in the request content.</t>
        <t>The server might not process the entire patch document when the upload is interrupted, for example, because of a dropped connection or a canceled request. In this case, the server <bcp14>SHOULD</bcp14> append as much of the patch document as possible to the upload resource, starting at its beginning and without discontinuities. Appending a continuous section starting at the patch document's beginning constitutes a successful PATCH as defined in <xref section="2" sectionFormat="of" target="PATCH"/>. Saving the processed data allows the client to resume the upload from where it was interrupted. The upload resource <bcp14>MUST NOT</bcp14> be considered complete in this case.</t>
        <t>If the <tt>Upload-Offset</tt> request header field value does not match the current offset (<xref target="upload-offset"/>), the server <bcp14>MUST</bcp14> reject the request with a <tt>409 (Conflict)</tt> status code and the <tt>Upload-Complete</tt> header field set to false. The response <bcp14>MUST</bcp14> include the correct offset in the <tt>Upload-Offset</tt> header field. The response can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" (<xref target="mismatching-offset"/>).</t>
        <t>If an upload append request is missing a valid <tt>Upload-Offset</tt> header field, a valid <tt>Upload-Complete</tt> header field, or both, the server <bcp14>SHOULD</bcp14> respond with a <tt>400 (Bad Request)</tt> status code.</t>
        <t>The patch document cannot have a content coding of its own. A content coding would make the request content differ from the representation data that the offset (<xref target="upload-offset"/>) and length (<xref target="upload-length"/>) count. Therefore, if the request includes a <tt>Content-Encoding</tt> header field, the server <bcp14>SHOULD</bcp14> respond with a <tt>415 (Unsupported Media Type)</tt> status code and the <tt>Upload-Complete</tt> header field set to false.</t>
        <t>If the <tt>Upload-Complete</tt> request header field is set to true, the client intends to transfer the remaining representation data in one request. If the request content was fully processed, the upload is marked as complete and the server <bcp14>SHOULD</bcp14> generate the response that matches what the target resource of the initial upload creation request (<xref target="upload-creation"/>) would have generated if it had processed the entire representation in the initial request. However, the response <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field set to true, allowing clients to identify whether a response, in particular error responses, is related to the resumable upload itself or the processing of the uploaded representation. Any <tt>2xx (Successful)</tt> response that the server generates for such a request <bcp14>MUST</bcp14> mark the upload as complete.</t>
        <t>If the <tt>Upload-Complete</tt> request header field is set to false, the client intends to transfer the remaining representation data over multiple requests. If the request content was fully processed, the server acknowledges the appended data by sending a <tt>2xx (Successful)</tt> response with the <tt>Upload-Complete</tt> header field set to false.</t>
        <t>Even if the upload is complete (<xref target="upload-complete"/>) from the server's perspective and the final response from the target resource of the initial request has already been sent, the client might still perform an upload append after an offset retrieval (<xref target="offset-retrieving"/>) due to the response being lost during transmission. The server can choose to replay the final response to the client if the request to append to the completed upload is valid.</t>
        <t>The server <bcp14>MUST</bcp14> record the representation's length according to <xref target="upload-length"/> if the <tt>Upload-Length</tt> or <tt>Upload-Complete: ?1</tt> header fields are included in the request. If the representation's length is known, the server <bcp14>MUST NOT</bcp14> let the offset exceed it: if appending a request's content would take the offset past the length, the server <bcp14>MUST</bcp14> reject the request, deactivate the upload resource, and reject any further interaction with it. It is not sufficient to rely on the <tt>Content-Length</tt> header field for enforcement because this header field might not be present.</t>
        <t>While the request content is being processed, the server <bcp14>SHOULD</bcp14> send interim responses with a <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Upload-Offset</tt> header field set to the current offset to inform the client about the upload progress. These interim responses <bcp14>MUST NOT</bcp14> include the <tt>Location</tt> header field.</t>
        <t>The server <bcp14>SHOULD</bcp14> include the <tt>Upload-Complete</tt> header field (<xref target="upload-complete-hdr"/>) in the response to indicate whether it is the result of processing the uploaded representation.</t>
        <t>The server <bcp14>SHOULD NOT</bcp14> generate a response with a <tt>3xx (Redirection)</tt> status code and the <tt>Upload-Complete: ?0</tt> header field because the upload resource's URI is expected to remain the same for the lifetime of the upload. See <xref target="origin"/> for redirecting a response that completes the upload.</t>
      </section>
      <section anchor="upload-appending-example">
        <name>Examples</name>
        <t>A) The following example shows an upload append request. The client transfers the next 3456789 bytes at an offset of 20000000 and does not indicate that the upload is then completed. The server generates one interim response, when the offset reached 21728394 bytes, and finally acknowledges the new offset:</t>
        <sourcecode type="http-message"><![CDATA[
PATCH /upload/37a504d87 HTTP/1.1
Host: example.com
Upload-Complete: ?0
Upload-Offset: 20000000
Content-Length: 3456789
Content-Type: application/partial-upload

[content (3456789 bytes)]
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Upload-Offset: 21728394

HTTP/1.1 204 No Content
Upload-Complete: ?0
]]></sourcecode>
        <t>B) The following example shows an upload append, where the client transfers the remaining 4567890 bytes and completes the upload with a length of 1234567890 bytes. The server processes the uploaded representation and generates the corresponding response, in this example containing extracted metadata:</t>
        <sourcecode type="http-message"><![CDATA[
PATCH /upload/d38d6ffe8 HTTP/1.1
Host: example.com
Upload-Complete: ?1
Upload-Offset: 1230000000
Content-Length: 4567890
Content-Type: application/partial-upload

[content (4567890 bytes)]
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Upload-Complete: ?1
Content-Type: application/json

{
  "metadata": {
    [...]
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="upload-cancellation">
      <name>Upload Cancellation</name>
      <section anchor="client-behavior-3">
        <name>Client Behavior</name>
        <t>If the client wants to cancel the upload, it can send a <tt>DELETE</tt> request to the upload resource. Doing so is an indication that the client is no longer interested in continuing the upload, and that the server can release any resources associated with it.</t>
      </section>
      <section anchor="server-behavior-2">
        <name>Server Behavior</name>
        <t>Upon receiving a <tt>DELETE</tt> request, the server <bcp14>SHOULD</bcp14> deactivate the upload resource.</t>
        <t>The server <bcp14>SHOULD</bcp14> terminate any in-flight requests to the upload resource before sending the response by abruptly terminating their HTTP connection(s) or stream(s), as described in <xref target="concurrency"/>.</t>
        <t>The server <bcp14>SHOULD NOT</bcp14> generate a response with a <tt>3xx (Redirection)</tt> status code because the upload resource's URI is expected to remain the same for the lifetime of the upload.</t>
      </section>
      <section anchor="upload-cancellation-example">
        <name>Example</name>
        <t>The following example shows an upload cancellation:</t>
        <sourcecode type="http-message"><![CDATA[
DELETE /upload/5688a431c HTTP/1.1
Host: example.com
]]></sourcecode>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
]]></sourcecode>
      </section>
    </section>
    <section anchor="concurrency">
      <name>Concurrency</name>
      <t>This document does not support parallel requests that transfer representation data to the same upload resource. The client <bcp14>MUST NOT</bcp14> send an upload append request (<xref target="upload-appending"/>) while an upload creation request (<xref target="upload-creation"/>) or another upload append request for the same upload resource is still in progress.</t>
      <t>Even if the client is well-behaved and does not send concurrent requests, network interruptions can occur in such a way that the client considers a request as failed while the server is unaware of the problem and considers the request still ongoing. The client might then try to resume the upload with the best intentions, resulting in concurrent requests from the server's perspective. Therefore, the server <bcp14>MUST</bcp14> take measures to prevent race conditions, data loss, and corruption from concurrent append (<xref target="upload-appending"/>) or cancellation (<xref target="upload-cancellation"/>) requests to the same upload resource. In addition, the server <bcp14>MUST NOT</bcp14> send outdated information in responses. This means that if a client appends at an offset from a final response (<xref target="upload-offset-hdr"/>), the server <bcp14>MUST NOT</bcp14> reject that request for having the wrong offset, unless another append or a cancellation arrived in between.</t>
      <t>The <bcp14>RECOMMENDED</bcp14> approach is as follows: If a server receives a new request to retrieve the offset (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>) while a previous request for creating the upload (<xref target="upload-creation"/>) or appending representation data to the same upload resource is still ongoing, the server <bcp14>SHOULD</bcp14> prevent race conditions, data loss, and corruption by terminating the previous request before processing the new request. Due to network delay and reordering, the server might still be receiving representation data from an ongoing transfer for the same upload resource, which from the client's perspective has failed. Since the client is not allowed to perform multiple transfers for the same upload resource in parallel, the server can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
      <t>Since implementing this approach is not always technically possible or feasible, other measures can be considered as well. A simpler approach is that the server only processes a new request to retrieve the offset (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>) once all previous requests have been processed. This effectively implements exclusive access to the upload resource through an access lock. However, since network interruptions can occur in ways that cause the request to hang from the server's perspective, it might take the server significant time to realize the interruption and time out the request. During this period, the client will be unable to access the resource and resume the upload, causing friction for the end users. Therefore, the recommended approach is to terminate previous requests to enable quick resumption of uploads.</t>
    </section>
    <section anchor="retry">
      <name>Retry</name>
      <t>If the client receives a <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> response that does not mark the upload as complete (<xref target="upload-complete-hdr"/>) when creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>), it can apply the heuristics described below to retry or resume the upload.</t>
      <ul spacing="normal">
        <li>
          <t><tt>409 (Conflict)</tt> with the <tt>Upload-Complete</tt> header field set to false: the upload can be resumed with the correct offset (<xref target="upload-offset"/>). If no <tt>Upload-Offset</tt> header field is provided, the client <bcp14>SHOULD</bcp14> retrieve the offset (<xref target="offset-retrieving"/>) before resuming.</t>
        </li>
        <li>
          <t><tt>413 (Content Too Large)</tt>: the upload can be resumed after applying appropriate limits (<xref target="upload-limits"/>).</t>
        </li>
        <li>
          <t><tt>429 (Too Many Requests)</tt>: the request can be retried after an appropriate delay.</t>
        </li>
        <li>
          <t><tt>5xx (Server Error)</tt>: the request can be retried.</t>
        </li>
      </ul>
      <t>If no final response was received at all due to connectivity issues, the client <bcp14>MAY</bcp14> automatically attempt upload resumption by retrieving the current offset (<xref target="offset-retrieving"/>).</t>
      <t>The client <bcp14>SHOULD</bcp14> limit the number of retries it performs before considering the upload a failure, and <bcp14>SHOULD</bcp14> then cancel the upload (<xref target="upload-cancellation"/>) if it can still reach the upload resource.</t>
    </section>
    <section anchor="status-code-104">
      <name>Status Code <tt>104 (Upload Resumption Supported)</tt></name>
      <t>The <tt>104 (Upload Resumption Supported)</tt> status code can be used for two purposes:</t>
      <ul spacing="normal">
        <li>
          <t>When responding to requests to create uploads, a 104 interim response can be sent to indicate the resource's support for resumable uploads, as well as the URI and limits of the corresponding upload resource in the <tt>Location</tt> and <tt>Upload-Limit</tt> header fields, respectively (see <xref target="upload-creation"/>). This notifies the client early about the ability to resume the upload in case of network interruptions.</t>
        </li>
        <li>
          <t>While processing the content of a request to append representation data or create an upload, the server can regularly send 104 interim responses to indicate the current upload progress in the <tt>Upload-Offset</tt> header field (see <xref target="upload-creation"/> and <xref target="upload-appending"/>). This allows the client to show more accurate progress information about the amount of data processed by the server. In addition, clients can use this information to release representation data that was buffered, knowing that it does not have to be retransmitted.</t>
        </li>
      </ul>
      <t>When creating or appending resumable uploads, the client can generate a <tt>100-continue</tt> expectation because it wants an indication that the resource is willing to accept the upload. The client <bcp14>MAY</bcp14> treat a 104 interim response as fulfilling the <tt>100-continue</tt> expectation and start sending the request content. However, the server <bcp14>MUST NOT</bcp14> omit the <tt>100 (Continue)</tt> response because it has sent a 104 interim response.</t>
    </section>
    <section anchor="media-type-partial-upload">
      <name>Media Type <tt>application/partial-upload</tt></name>
      <t>The <tt>application/partial-upload</tt> media type describes a contiguous block from the representation data to be uploaded to a resource. There is no minimum block size and the block might be empty. The block can be a subset of the representation data, where the start and/or end of the block do not line up with the start and/or end of the representation data respectively.</t>
    </section>
    <section anchor="problem-types">
      <name>Problem Types</name>
      <section anchor="mismatching-offset">
        <name>Mismatching Offset</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the <tt>Upload-Offset</tt> header field in the request does not match the upload resource's offset.</t>
        <t>Two problem type extension members are defined: the <tt>expected-offset</tt> and <tt>provided-offset</tt> members. Both are non-negative integers. A response using this problem type <bcp14>SHOULD</bcp14> populate both members, with the value of <tt>expected-offset</tt> taken from the upload resource and the value of <tt>provided-offset</tt> taken from the upload append request.</t>
        <t>The following example shows a response, where the resource's offset was 12500000, but the client attempted to append at offset 25000000:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 409 Conflict
Content-Type: application/problem+json
Upload-Offset: 12500000
Upload-Complete: ?0

{
  "type":"https://iana.org/assignments/http-problem-types#\
    mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 12500000,
  "provided-offset": 25000000
}
]]></sourcecode>
      </section>
      <section anchor="inconsistent-length">
        <name>Inconsistent Length</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#inconsistent-upload-length" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload creation (<xref target="upload-creation"/>) or upload append request (<xref target="upload-appending"/>) to indicate that the request includes inconsistent length values, as described in <xref target="upload-length"/>.</t>
        <t>The following example shows a response:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
Upload-Complete: ?0

{
  "type":"https://iana.org/assignments/http-problem-types#\
    inconsistent-upload-length",
  "title": "inconsistent length values for upload"
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="content-codings">
      <name>Content Codings</name>
      <t>Since the codings listed in the <tt>Content-Encoding</tt> header field are a characteristic of the representation (see <xref section="8.4" sectionFormat="of" target="HTTP"/>), both the client and the server always compute the values for the <tt>Upload-Offset</tt> and optionally <tt>Upload-Length</tt> header fields on the content coded data (that is, the representation data). Moreover, the content codings are retained throughout the entire upload, meaning that the server is not required to decode the representation data to support resumable uploads. The content codings, if any, are announced in the upload creation request (<xref target="upload-creation"/>) and not repeated when appending representation data (<xref target="upload-appending"/>).</t>
    </section>
    <section anchor="transfer-codings">
      <name>Transfer Codings</name>
      <t>Unlike content codings (see <xref section="8.4.1" sectionFormat="of" target="HTTP"/>), transfer codings (see <xref section="6.1" sectionFormat="of" target="RFC9112"/>) are a property of the message, not of the representation. Moreover, transfer codings can be applied in transit (e.g., by proxies). This means that a client does not have to consider the transfer codings to compute the upload offset, while a server is responsible for transfer decoding the message before computing the upload offset. The same applies to the <tt>Upload-Length</tt> header field value. See <xref section="6.2" sectionFormat="of" target="RFC9112"/> for how the <tt>Content-Length</tt> and <tt>Transfer-Encoding</tt> header fields interact.</t>
    </section>
    <section anchor="upload-strategies">
      <name>Upload Strategies</name>
      <t>The definition of the upload creation request (<xref target="upload-creation"/>) provides the client with flexibility to choose whether the representation data is fully or partially transferred in the first request, or if no representation data is included at all. Which behavior is best largely depends on the client's capabilities, its desire to avoid data retransmission, and its knowledge about the resource's support for resumable uploads.</t>
      <t>The following subsections describe two typical upload strategies that are suited for common environments. Note that these strategies are never explicitly communicated to the server, and clients are not required to use only one strategy but can mix and adapt them to their needs.</t>
      <section anchor="optimistic-upload-creation">
        <name>Optimistic Upload Creation</name>
        <t>An "optimistic upload creation" can be used regardless of the client's knowledge about the resource's support for resumable uploads. However, the client needs to be able to process interim responses. An upload creation request then includes the full representation data because the client anticipates that it will be transferred without interruptions or resumed if an interruption occurs.</t>
        <t>The benefit of this strategy is that if the upload creation request succeeds, the representation data is transferred in a single request without additional round trips.</t>
        <t>A possible drawback is that the client might be unable to resume an upload. If an upload is interrupted before the client receives a <tt>104 (Upload Resumption Supported)</tt> interim response with the upload resource's URI, the client cannot resume that upload due to the missing URI. The interim response might not be received if the interruption happens too early in the message exchange, the target resource of the initial request does not support resumable uploads, the server is not capable of sending the 104 interim response, or an intermediary dropped the interim response. Without a 104 interim response, the client needs to either treat the upload as failed or retry the entire upload creation request if this is allowed by the application.</t>
        <t>A client might wait for a limited duration to receive a 104 interim response before starting to transmit the request content. This way, the client can learn about the resource's support for resumable uploads and/or the upload resource's URI. This is conceptually similar to how a client might wait for a <tt>100 (Continue)</tt> interim response (see <xref section="10.1.1" sectionFormat="of" target="HTTP"/>) before committing to work.</t>
        <section anchor="upgrading-uploads">
          <name>Upgrading to Resumable Uploads</name>
          <t>Optimistic upload creation allows clients and servers to automatically upgrade non-resumable uploads to resumable ones. In a non-resumable upload, the representation is transferred in a single request, usually <tt>POST</tt> or <tt>PUT</tt>, without any ability to resume from interruptions. The client can invite the server to upgrade such a request to a resumable upload by adding the <tt>Upload-Complete: ?1</tt> header field to the original request. The <tt>Upload-Length</tt> header field <bcp14>SHOULD</bcp14> be added if the representation's length is known upfront. The request is not changed otherwise.</t>
          <t>If the target resource of the initial request supports resumable uploads, the server can create an upload resource and send its URI in a 104 interim response for the client to resume the upload after interruptions. A resource that does not support resumable uploads or does not want to upgrade to a resumable upload for this request ignores the <tt>Upload-Complete: ?1</tt> header field. The transfer then falls back to a non-resumable upload without additional cost.</t>
          <t>This upgrade can also be performed transparently by a library or program that acts as an HTTP client by sending requests on behalf of a user. When the user instructs the client to send a non-resumable request, the client can perform the upgrade transparently and handle potential interruptions and resumptions under the hood without involving the user. The last response received by the client is considered the response for the entire upload and needs to be provided to the user.</t>
        </section>
      </section>
      <section anchor="careful-upload-creation">
        <name>Careful Upload Creation</name>
        <t>For a "careful upload creation" the client knows that the target resource of the initial request supports resumable uploads and sends an empty upload creation request without including any representation data. Upon successful response reception, the client can use the included upload resource URI to transmit the representation data (<xref target="upload-appending"/>) and resume the upload at any stage if an interruption occurs. The response can include the <tt>Upload-Limit</tt> header field, which indicates limits for the rest of the upload (<xref target="upload-limits"/>).</t>
        <t>The retransmission of representation data or the ultimate upload failure that can happen with an "optimistic upload creation" is therefore avoided at the expense of an additional request that does not carry representation data.</t>
        <t>This approach is best suited if the client cannot receive interim responses, e.g., due to a limitation in the provided HTTP interface, or if large representations are transferred where the cost of the additional request is minuscule compared to the effort of transferring the representation itself.</t>
      </section>
    </section>
    <section anchor="incremental">
      <name>Incremental Transfer, Processing, and Forwarding</name>
      <t>The resumable upload design is most effective when a server processes request message portions as they arrive, which ensures the greatest chance that data is processed before a possible transfer interruption.</t>
      <t>To support incremental processing, it is <bcp14>RECOMMENDED</bcp14> that clients send request content incrementally and minimize buffering.</t>
      <t>As described in <xref target="INCREMENTAL"/>, intermediaries might interfere with the incremental delivery of data to a server. Clients can use the <tt>Incremental</tt> header field defined in <xref section="3" sectionFormat="of" target="INCREMENTAL"/> to signal their preference for incremental forwarding by intermediaries.</t>
    </section>
    <section anchor="request-cancellation">
      <name>Request Cancellation</name>
      <t>A client or server might want to interrupt an in-flight message transfer intentionally for various reasons (see <xref target="introduction"/>). The mechanism to do so depends on the HTTP version in use:</t>
      <dl>
        <dt>HTTP/1.1:</dt>
        <dd>
          <t>close the underlying transport connection (<xref section="9.5" sectionFormat="of" target="RFC9112"/>)</t>
        </dd>
        <dt>HTTP/2:</dt>
        <dd>
          <t>reset the stream (<xref section="6.4" sectionFormat="of" target="RFC9113"/>)</t>
        </dd>
        <dt>HTTP/3:</dt>
        <dd>
          <t>abruptly terminate the request stream (<xref section="4.1.1" sectionFormat="of" target="RFC9114"/>)</t>
        </dd>
      </dl>
      <t>Version-specific mechanisms place requirements on clients or servers for carrying out the cancellation. However, for all versions of HTTP, resumable uploads allow the server to process received representation data and expose the upload offset via the upload resource, enabling continuation of the upload after interruption.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="security-uri">
        <name>Upload Resource URIs</name>
        <t>The upload resource URI is the identifier used for modifying the upload. Without further protection of this URI, an attacker can perform any operation on the upload resource: obtain information about it, append data to it, or cancel it. Each of these requests can also cause a server to terminate an in-flight request from a legitimate client (<xref target="concurrency"/>).</t>
        <t>To mitigate these risks, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can access the upload resource. It is also <bcp14>RECOMMENDED</bcp14> that upload resource URIs be hard to guess.</t>
        <t>Servers might embed information in the upload resource URI, such as a storage or processing location, to make request routing more efficient. Because the URI is visible to the client and to anyone else who obtains it, servers <bcp14>MUST NOT</bcp14> include information in it that is not intended to be exposed. Routing information could, for instance, be encoded so that only the server can interpret it.</t>
        <t>If knowing the upload resource URI is enough to access the upload, the URI is in effect a credential. Like other credentials, it needs to be protected in transit (see <xref section="17.16.1" sectionFormat="of" target="HTTP"/>). URIs are also often logged or displayed by servers, proxies, and user agents, so the URI can be disclosed to third parties (see <xref section="17.9" sectionFormat="of" target="HTTP"/>).</t>
      </section>
      <section anchor="untrusted-input">
        <name>Untrusted Input</name>
        <t>Upload creation and upload append requests carry untrusted input; see <xref section="17.3" sectionFormat="of" target="HTTP"/> and <xref section="17.4" sectionFormat="of" target="HTTP"/>.</t>
      </section>
      <section anchor="content-scanning">
        <name>Content Scanning</name>
        <t>Some servers or intermediaries provide scanning of content uploaded by clients. Any scanning mechanism that relies on receiving a complete representation in a single request message can be defeated by resumable uploads because content can be split across multiple messages. Servers or intermediaries wishing to perform content scanning <bcp14>SHOULD</bcp14> consider how resumable uploads can circumvent scanning and take appropriate measures. Possible strategies include waiting for the upload to complete before scanning the entire representation, or disabling resumable uploads.</t>
      </section>
      <section anchor="time-of-check-to-time-of-use">
        <name>Time-of-Check to Time-of-Use</name>
        <t>There can be a significant delay between the creation of an upload resource and its completion. Policy decisions or authorization checks performed on the initial request might become outdated or invalid by the time the upload completes. To mitigate vulnerabilities arising from time-of-check to time-of-use (TOCTOU) conditions, the server <bcp14>SHOULD</bcp14> validate that the user is still allowed to perform the requested action before finalizing the upload. This includes, for example, validating access privileges and quota policies associated with the upload resource.</t>
      </section>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Resumable uploads are vulnerable to Slowloris-style attacks <xref target="SLOWLORIS"/>. A malicious client can create upload resources and keep them alive by regularly sending <tt>PATCH</tt> requests with no or small content to the upload resources. This could be abused to exhaust server resources by creating and holding open uploads indefinitely with minimal work. Servers <bcp14>SHOULD</bcp14> provide mitigations for Slowloris attacks, such as increasing the maximum number of clients the server will allow, limiting the number of uploads a single client is allowed to make, imposing restrictions on the minimum transfer speed an upload is allowed to have, and restricting the length of time an upload resource can exist.</t>
      </section>
      <section anchor="message-size-limits">
        <name>Message Size Limits</name>
        <t>Uploads performed as a series of appends can be used to upload data up to the <tt>max-size</tt> limit (<xref target="upload-limit-max-size"/>), which could be a larger size than a server or intermediary might normally permit in conventional single upload request message content. Servers or intermediaries need to consider that relying solely on message content limits to constrain resources allocated to uploads might not be an effective strategy when using resumable uploads.</t>
      </section>
      <section anchor="origin">
        <name>Different Origins</name>
        <t>The target resource of the initial request (<xref target="upload-creation"/>) and the upload resource might have different origins (<xref target="ORIGIN"/>). For example, the initial request might be sent to an application server, while the upload resource is hosted by a dedicated storage service.</t>
        <t>Clients have to consider this change of origin when following the <tt>Location</tt> header field to the upload resource. Credentials and other per-origin state associated with the target resource of the initial request are not necessarily applicable to the upload resource, and remain scoped to their respective origins. Clients also have to consider that disclosing an upload resource URI to a different origin can leak the capability to read, append to, or cancel the upload.</t>
        <t>Because the upload can be completed either by the initial request or by an upload append request, the final response might come from a different origin depending on whether the upload was resumed. To avoid this, the server <bcp14>MAY</bcp14> respond to the request that completes the upload with a <tt>303 (See Other)</tt> status code, redirecting the user agent to the origin of the target resource of the initial request.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-fields">
        <name>HTTP Fields</name>
        <t>IANA is asked to register the following entries in the "Hypertext Transfer Protocol (HTTP) Field Name Registry":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Status</th>
              <th align="left">Structured Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Upload-Offset</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-offset-hdr"/> of RFC nnnn</td>
            </tr>
            <tr>
              <td align="left">Upload-Complete</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-complete-hdr"/> of RFC nnnn</td>
            </tr>
            <tr>
              <td align="left">Upload-Length</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-length-hdr"/> of RFC nnnn</td>
            </tr>
            <tr>
              <td align="left">Upload-Limit</td>
              <td align="left">permanent</td>
              <td align="left">Dictionary</td>
              <td align="left">
                <xref target="upload-limit-hdr"/> of RFC nnnn</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="http-status-code">
        <name>HTTP Status Code</name>
        <t>IANA is asked to register the following entry in the "Hypertext Transfer Protocol (HTTP) Status Code Registry":</t>
        <dl>
          <dt>Value:</dt>
          <dd>
            <t>104 (suggested value)</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Upload Resumption Supported</t>
          </dd>
          <dt>Specification:</dt>
          <dd>
            <t><xref target="status-code-104"/> of RFC nnnn</t>
          </dd>
        </dl>
      </section>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is asked to register the following entry in the "Media Types" registry:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>partial-upload</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security-considerations"/> of RFC nnnn</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type-partial-upload"/> of RFC nnnn</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Applications that transfer files over unreliable networks or want pausable and resumable uploads.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
        </dl>
        <t>Additional information:</t>
        <ul spacing="normal">
          <li>
            <t>Deprecated alias names for this type: N/A</t>
          </li>
          <li>
            <t>Magic number(s): N/A</t>
          </li>
          <li>
            <t>File extension(s): N/A</t>
          </li>
          <li>
            <t>Macintosh file type code(s): N/A</t>
          </li>
          <li>
            <t>Windows Clipboard Name: N/A</t>
          </li>
        </ul>
        <dl>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See the Authors' Addresses section of this document.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See the Authors' Addresses section of this document.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
      <section anchor="http-problem-types">
        <name>HTTP Problem Types</name>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#mismatching-upload-offset</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Mismatching Upload Offset</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>409</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="mismatching-offset"/> of RFC nnnn</t>
          </dd>
        </dl>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#inconsistent-upload-length</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Inconsistent Upload Length Values</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>400</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="inconsistent-length"/> of RFC nnnn</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <displayreference target="RFC9114" to="HTTP/3"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <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="HTTP-CACHING">
          <front>
            <title>HTTP Caching</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 defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </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>
        <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="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="PATCH">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification. The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
        <reference anchor="PROBLEM">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="SLOWLORIS" target="https://web.archive.org/web/20150315054838/http://ha.ckers.org/slowloris/">
          <front>
            <title>Welcome to Slowloris - the low bandwidth, yet greedy and poisonous HTTP client!</title>
            <author initials="R." surname="&quot;RSnake&quot; Hansen">
              <organization/>
            </author>
            <date year="2009" month="June"/>
          </front>
        </reference>
        <reference anchor="RFC8792">
          <front>
            <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="E. Auerswald" initials="E." surname="Auerswald"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document defines two strategies for handling long lines in width-bounded text content. One strategy, called the "single backslash" strategy, is based on the historical use of a single backslash ('\') character to indicate where line-folding has occurred, with the continuation occurring with the first character that is not a space character (' ') on the next line. The second strategy, called the "double backslash" strategy, extends the first strategy by adding a second backslash character to identify where the continuation begins and is thereby able to handle cases not supported by the first strategy. Both strategies use a self-describing header enabling automated reconstitution of the original content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8792"/>
          <seriesInfo name="DOI" value="10.17487/RFC8792"/>
        </reference>
        <reference anchor="INCREMENTAL">
          <front>
            <title>Incremental Forwarding of HTTP Messages</title>
            <author fullname="K. Oku" initials="K." surname="Oku"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="August" year="2026"/>
            <abstract>
              <t>This document specifies the "Incremental" HTTP header field, which
 instructs HTTP intermediaries to forward the HTTP message
 incrementally.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="10036"/>
          <seriesInfo name="DOI" value="10.17487/RFC10036"/>
        </reference>
        <reference anchor="ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
      </references>
    </references>
    <?line 1067?>

<section removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-14">
        <name>Since draft-ietf-httpbis-resumable-upload-14</name>
        <ul spacing="normal">
          <li>
            <t>State that unknown Structured Fields parameters <bcp14>MUST</bcp14> be ignored.</t>
          </li>
          <li>
            <t>Discourage change of upload URLs.</t>
          </li>
          <li>
            <t>Append request cannot use different content codings.</t>
          </li>
          <li>
            <t>Define ranges for integer values in <tt>Upload-Limit</tt> and problem type members.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-13">
        <name>Since draft-ietf-httpbis-resumable-upload-13</name>
        <t>Editorial changes only.</t>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-12">
        <name>Since draft-ietf-httpbis-resumable-upload-12</name>
        <ul spacing="normal">
          <li>
            <t>Upload-Complete and Upload-Length are no longer required on offset retrieval responses.</t>
          </li>
          <li>
            <t>Remove discouragement against sending requests after expiration.</t>
          </li>
          <li>
            <t>Clarify how upload offset is inferred from responses.</t>
          </li>
          <li>
            <t>Disallow successful responses indicating an incomplete upload when the request indicated completion.</t>
          </li>
          <li>
            <t>Describe considerations for the initially targeted resource and the upload resource having different origins.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-11">
        <name>Since draft-ietf-httpbis-resumable-upload-11</name>
        <ul spacing="normal">
          <li>
            <t>Clear up different responsibilities of server and upload resource.</t>
          </li>
          <li>
            <t>Relax recommendations on client handling greater offsets.</t>
          </li>
          <li>
            <t>Clarify client behavior for 413 responses.</t>
          </li>
          <li>
            <t>Remove Accept-Patch from OPTIONS responses.</t>
          </li>
          <li>
            <t>Allow upload creation requests with no content regardless of the <tt>min-append-size</tt> limit.</t>
          </li>
          <li>
            <t>Remove nominative languages addressing the lost final response.</t>
          </li>
          <li>
            <t>Allow <tt>max-age</tt> limit to decrease as expected.</t>
          </li>
          <li>
            <t>Redefine Upload-Complete on the server side.</t>
          </li>
          <li>
            <t>Recommend incremental delivery.</t>
          </li>
          <li>
            <t>Clarify <tt>min-size</tt> limit and its client behavior.</t>
          </li>
          <li>
            <t>Describe <tt>GET</tt> requests against upload resource.</t>
          </li>
          <li>
            <t>Replace uses of term "upload length" with "representation's length".</t>
          </li>
          <li>
            <t>Include <tt>Upload-Limit</tt> in response to limit violation.</t>
          </li>
          <li>
            <t>Clarify that clients might not know limits when starting upload.</t>
          </li>
          <li>
            <t>Remove section covering integrity digests.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Add version-specific details on cancelling in-flight transfers.</t>
          </li>
          <li>
            <t>Clarify client retry strategies.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-10">
        <name>Since draft-ietf-httpbis-resumable-upload-10</name>
        <ul spacing="normal">
          <li>
            <t>Add recommended disposition type for file name indication.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-09">
        <name>Since draft-ietf-httpbis-resumable-upload-09</name>
        <ul spacing="normal">
          <li>
            <t>Requires Accept-Patch in OPTIONS.</t>
          </li>
          <li>
            <t>Add security consideration regarding time-of-check to time-of-use.</t>
          </li>
          <li>
            <t>Lift requirement on Upload-Complete for all final responses.</t>
          </li>
          <li>
            <t>Relax requirements on limit changes.</t>
          </li>
          <li>
            <t>Describe the interaction between 100 and 104 responses.</t>
          </li>
          <li>
            <t>Numerous editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-08">
        <name>Since draft-ietf-httpbis-resumable-upload-08</name>
        <ul spacing="normal">
          <li>
            <t>Clarify definitions of new header fields.</t>
          </li>
          <li>
            <t>Make handling of OPTIONS * optional.</t>
          </li>
          <li>
            <t>Require server to announce limits using Upload-Limit.</t>
          </li>
          <li>
            <t>Require clients to adhere to known limits.</t>
          </li>
          <li>
            <t>Rephrase requirements for concurrency handling, focusing on the outcome.</t>
          </li>
          <li>
            <t>Remove requirement for 204 status code for DELETE responses.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Add section about 104 status code.</t>
          </li>
          <li>
            <t>Rephrase recommendation for sending information back to client.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-07">
        <name>Since draft-ietf-httpbis-resumable-upload-07</name>
        <ul spacing="normal">
          <li>
            <t>Clarify server handling when upload length is exceeded.</t>
          </li>
          <li>
            <t>Extend security considerations about upload resource URIs, representation metadata, and untrusted inputs.</t>
          </li>
          <li>
            <t>Allow clients to retry for appropriate 4xx responses.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-06">
        <name>Since draft-ietf-httpbis-resumable-upload-06</name>
        <ul spacing="normal">
          <li>
            <t>Minor editorial improvements to introduction and examples.</t>
          </li>
          <li>
            <t>Define structured types for new header fields.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-05">
        <name>Since draft-ietf-httpbis-resumable-upload-05</name>
        <ul spacing="normal">
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Numerous editorial changes.</t>
          </li>
          <li>
            <t>Rename <tt>expires</tt> limit to <tt>max-age</tt>.</t>
          </li>
          <li>
            <t>Require <tt>Upload-Complete</tt>, but not <tt>Upload-Offset</tt> or <tt>Upload-Limit</tt>, for append responses.</t>
          </li>
          <li>
            <t>Add problem type for inconsistent length values.</t>
          </li>
          <li>
            <t>Reduce use of "file" in favor of "representation".</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-04">
        <name>Since draft-ietf-httpbis-resumable-upload-04</name>
        <ul spacing="normal">
          <li>
            <t>Clarify implications of <tt>Upload-Limit</tt> header.</t>
          </li>
          <li>
            <t>Allow client to fetch upload limits upfront via <tt>OPTIONS</tt>.</t>
          </li>
          <li>
            <t>Add guidance on upload creation strategy.</t>
          </li>
          <li>
            <t>Add <tt>Upload-Length</tt> header to indicate length during creation.</t>
          </li>
          <li>
            <t>Describe possible usage of <tt>Want-Repr-Digest</tt>.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-03">
        <name>Since draft-ietf-httpbis-resumable-upload-03</name>
        <ul spacing="normal">
          <li>
            <t>Add note about <tt>Content-Location</tt> for referring to subsequent resources.</t>
          </li>
          <li>
            <t>Require <tt>application/partial-upload</tt> for appending to uploads.</t>
          </li>
          <li>
            <t>Explain handling of content and transfer codings.</t>
          </li>
          <li>
            <t>Add problem types for mismatching offsets and completed uploads.</t>
          </li>
          <li>
            <t>Clarify that completed uploads must not be appended to.</t>
          </li>
          <li>
            <t>Describe interaction with Digest Fields from RFC9530.</t>
          </li>
          <li>
            <t>Require that upload offset does not decrease over time.</t>
          </li>
          <li>
            <t>Add Upload-Limit header field.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-02">
        <name>Since draft-ietf-httpbis-resumable-upload-02</name>
        <ul spacing="normal">
          <li>
            <t>Add upload progress notifications via informational responses.</t>
          </li>
          <li>
            <t>Add security consideration regarding request filtering.</t>
          </li>
          <li>
            <t>Explain the use of empty requests for creation uploads and appending.</t>
          </li>
          <li>
            <t>Extend security consideration to include resource exhaustion attacks.</t>
          </li>
          <li>
            <t>Allow 200 status codes for offset retrieval.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-01">
        <name>Since draft-ietf-httpbis-resumable-upload-01</name>
        <ul spacing="normal">
          <li>
            <t>Replace Upload-Incomplete header with Upload-Complete.</t>
          </li>
          <li>
            <t>Replace terminology about procedures with HTTP resources.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-00">
        <name>Since draft-ietf-httpbis-resumable-upload-00</name>
        <ul spacing="normal">
          <li>
            <t>Remove Upload-Token and instead use Server-generated upload URL for upload identification.</t>
          </li>
          <li>
            <t>Require the Upload-Incomplete header field in Upload Creation Procedure.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-02">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-02</name>
        <t>None</t>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-01">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-01</name>
        <ul spacing="normal">
          <li>
            <t>Clarifying backtracking and preventing skipping ahead during the Offset Receiving Procedure.</t>
          </li>
          <li>
            <t>Clients auto-retry 404 is no longer allowed.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-00">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-00</name>
        <ul spacing="normal">
          <li>
            <t>Split the Upload Transfer Procedure into the Upload Creation Procedure and the Upload Appending Procedure.</t>
          </li>
        </ul>
      </section>
    </section>
    <section removeInRFC="true" anchor="draft-version-identification">
      <name>Draft Version Identification</name>
      <t>To assist the development of implementations and interoperability testing while this document is still a draft, an interop version is defined. Implementations of this draft use the interop version to identify the iteration of the draft that they implement. The interop version is bumped for breaking changes.</t>
      <t>The current interop version is 10.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to its requests. The <tt>Upload-Draft-Interop-Version</tt> field value is an Integer.</t>
      <t>Server implementations of draft versions of the protocol <bcp14>MUST NOT</bcp14> send a <tt>104 (Upload Resumption Supported)</tt> interim response when the interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field in the request is missing or mismatching.</t>
      <t>Server implementations of draft versions of the protocol <bcp14>MUST</bcp14> also send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to the <tt>104 (Upload Resumption Supported)</tt> interim response.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> ignore a <tt>104 (Upload Resumption Supported)</tt> interim response with missing or mismatching interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
      <t>The reason both the client and the server are sending and checking the draft version is to ensure that implementations of the final RFC will not accidentally interop with draft implementations, as they will not check the existence of the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document is based on an Internet-Draft specification written by Jiten Mehta, Stefan Matsson, and the authors of this document.</t>
      <t>The <eref target="https://tus.io/">tus v1 protocol</eref> is a specification for a resumable file upload protocol over HTTP. It inspired the early design of this protocol. Members of the tus community helped significantly in the process of bringing this work to the IETF.</t>
      <t>The authors would like to thank Mark Nottingham for substantive contributions to the text, along with the following in alphabetical order for their thorough reviews of the document:</t>
      <ul spacing="normal">
        <li>
          <t>Daniel Resnick</t>
        </li>
        <li>
          <t>Glenn Strauss</t>
        </li>
        <li>
          <t>Grant Gryczan</t>
        </li>
        <li>
          <t>Julian Reschke</t>
        </li>
        <li>
          <t>Mert Alev</t>
        </li>
        <li>
          <t>Mike Bishop</t>
        </li>
        <li>
          <t>Roy T. Fielding</t>
        </li>
        <li>
          <t>Willy Tarreau</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
57jVTaNXalS8Wsig1AlMkz74IzaFbCenU/ONCIeUewj3AYAxMI4DgMfdEcvp
Q8p0MvWKPOa0oqsCVILTdzpU9jwVW7zL9+nk3omjGs+uoWDNa1slIPBXEtzQ
ohiuY2Gm9CUrFPoqIZx+uR4r8n5/3ZXp2wZCfIaftrez9aAiK1Lo0g2pCXYK
7Ol15S8h+wh3F5Msgc5R1eP0QqkaYn33TCNxsmki6tV6MJ/KAOPk2wqjgNQb
sByV2TwlJxne4Tl9f2Cv/Kqxlrc7LXVFVssV5lVT1Ya+YBgijgDpdeeIvoLS
XspQf9E7ZUforCc+QpBddEv80M/uqTuKmsImAbvbE4gHbmDviBRR+oVtSNqt
0esVGCIWlLyHnPdoP/nqP77iG3xdw/M5Nz1OTl4eJs++ef7IA6l7nqgNuy5d
go/qf1HiQicP46mHR+Hlz3CSA57wzv7Wt/g/KCGi/y4Paey8LTLEuXVDID13
xaZ56YnwGAEt7dhF0dcBoew44Byao3EPlBqyihrSJDkR5UtytNwZXreB84F+
TpZ2ewfpn877OqVG7lI154lubbNZs9LN7ucXuj4+xuN2N+hL35Q1NOJflf4d
JgOSH92xCUjq1jlkRAf1+LPtxCAPRa55PCRBbkGQIMwH7NlA2WPshOtRKNaC
TQxZTri80y+TkpADehtXYmE5C42JXsJgl+aPYLqFKft+Zr4klDu1fVpncl9A
IYZ9ShLYXq/BuKpsw9qwnyF52DDTjqqoyD2vlpYUVKnhqahOYdwjRL7Ebr2E
WrtObVVXQsfsEXvDn2YfjsddIDxo73nCS+6XR8zpjvCY95JTDfgZuv1QYif1
zlZ3aQzutktlJnTY88TX/HvgEM/39h7RUmqO/FbAOdobpW1hNENaZU8XTIcq
wreqvi+dLnGP8Sfo887G8/EQDW145cc8ax50swdM6kDHHlZ/Hs2n81b6gb0/
cqQa/tcgtyW5OmhOZgY0mMbOVliXIr4hcCgqAuCpBkgVPUGCWOsuJ99zTVq3
B/XIOyhObRDg205dCKm9SkU9vKwxdShu//r3LfoD5jlaOzh7kv25xma2vxmm
66wXpgLWNyuyj7n1ikmhlNYy9F1zAzqDvePY/MWYSLedBSP9m5RIxuGgJmfR
QU2VEvu9sSsfBtPPFYeRCmBgwAJjA/DGacZJLMpHNdZOPQZxUTlVW7Yk9ZHj
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

-->

</rfc>
