<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-05" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-05"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit</organization>
      <address>
        <email>marius@transloadit.com</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>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>ART</area>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 67?>

<t>HTTP clients often encounter interrupted data transfers as a result of canceled requests or dropped connections. Prior to interruption, part of a representation may have been exchanged. To complete the data transfer of the entire representation, it is often desirable to issue subsequent requests that transfer only the remainder of the representation. 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 71?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP clients often encounter interrupted data transfers as a result of canceled requests or dropped connections. Prior to interruption, part of a representation (see <xref section="3.2" sectionFormat="of" target="HTTP"/>) might have been exchanged. To complete the data transfer of the entire representation, it is often desirable to issue subsequent requests that transfer only the remainder of the representation. HTTP range requests (see <xref section="14" sectionFormat="of" target="HTTP"/>) support this concept of resumable downloads from server to client.</t>
      <t>HTTP methods such as POST or PUT can be used by clients to request processing of representation data enclosed in the request message. The transfer of representation data from client to server is often referred to as an upload. Uploads are just as likely as downloads to suffer from the effects of data transfer interruption. Humans can play a role in upload interruptions through manual actions such as pausing an upload. Regardless of the cause of an interruption, servers may have received part of the representation before its occurrence and it is desirable if clients can complete the data transfer by sending only the remainder of the representation. The process of sending additional parts of a representation using subsequent HTTP requests from client to server is herein referred to as a resumable upload.</t>
      <t>Connection interruptions are common and the absence of a standard mechanism for resumable uploads has lead to a proliferation of custom solutions. Some of those use HTTP, while others rely on other transfer mechanisms entirely. An HTTP-based standard solution is desirable for such a common class of problem.</t>
      <t>This document defines an optional mechanism for HTTP that enables resumable uploads in a way that is backwards-compatible with conventional HTTP uploads. When an upload is interrupted, clients can send subsequent requests to query the server state and use this information to send the remaining data. Alternatively, they can cancel the upload entirely. Different from ranged downloads, this protocol does not support transferring different parts of the same representation in parallel.</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>The terms Byte Sequence, Item, String, Token, Integer, and Boolean are imported from
<xref target="STRUCTURED-FIELDS"/>.</t>
      <t>The terms "representation", "representation data", "representation metadata", "content", "client" and "server" are from <xref target="HTTP"/>.</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Resumable uploads are supported in HTTP through use of a temporary resource, an <em>upload resource</em>, that is separate from the resource being uploaded to (hereafter, the <em>target resource</em>) 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 an example of a file upload to illustrate different interactions with the upload resource. Note, however, that HTTP message exchanges use representation data (see <xref section="8.1" sectionFormat="of" target="HTTP"/>), which means that resumable uploads can be used with many forms of content -- not just static files.</t>
      <section anchor="example-1-complete-upload-of-file-with-known-size">
        <name>Example 1: Complete upload of file with known size</name>
        <t>In this example, the client first attempts to upload a file with a known size in a single HTTP request to the target resource. An interruption occurs and the client then attempts to resume the upload using subsequent HTTP requests to the upload resource.</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 the client begins transferring the entire file in the request content.</t>
        <t>An informational response can be sent to the client, which signals the server's support of resumable upload as well as the upload resource URL via the Location header field (<xref section="10.2.2" sectionFormat="of" target="HTTP"/>).</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="320" width="520" viewBox="0 0 520 320" 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,144 L 512,176" fill="none" stroke="black"/>
                <path d="M 16,80 L 360,80" fill="none" stroke="black"/>
                <path d="M 376,144 L 512,144" fill="none" stroke="black"/>
                <path d="M 376,176 L 512,176" fill="none" stroke="black"/>
                <path d="M 16,240 L 360,240" fill="none" stroke="black"/>
                <path d="M 16,288 L 360,288" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,176 372,170.4 372,181.6" fill="black" transform="rotate(180,376,176)"/>
                <polygon class="arrowhead" points="368,288 356,282.4 356,293.6" fill="black" transform="rotate(0,360,288)"/>
                <polygon class="arrowhead" points="368,80 356,74.4 356,85.6" fill="black" transform="rotate(0,360,80)"/>
                <polygon class="arrowhead" points="24,240 12,234.4 12,245.6" fill="black" transform="rotate(180,16,240)"/>
                <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="408" y="116">Reserve</text>
                  <text x="480" y="116">resources</text>
                  <text x="392" y="132">for</text>
                  <text x="436" y="132">upload</text>
                  <text x="120" y="212">104</text>
                  <text x="164" y="212">Upload</text>
                  <text x="236" y="212">Resumption</text>
                  <text x="320" y="212">Supported</text>
                  <text x="124" y="228">with</text>
                  <text x="172" y="228">upload</text>
                  <text x="236" y="228">resource</text>
                  <text x="288" y="228">URL</text>
                  <text x="36" y="276">Flow</text>
                  <text x="104" y="276">Interrupted</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                  Server
|                                            |
| POST                                       |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for upload
|                                            |-----------------.
|                                            |                 |
|                                            |<----------------'
|                                            |
|            104 Upload Resumption Supported |
|            with upload resource URL        |
|<-------------------------------------------|
|                                            |
| Flow Interrupted                           |
|------------------------------------------->|
|                                            |
]]></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 data that the server received 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="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="36" y="68">HEAD</text>
                  <text x="68" y="68">to</text>
                  <text x="108" y="68">upload</text>
                  <text x="172" y="68">resource</text>
                  <text x="224" y="68">URL</text>
                  <text x="144" y="116">204</text>
                  <text x="172" y="116">No</text>
                  <text x="216" y="116">Content</text>
                  <text x="268" y="116">with</text>
                  <text x="344" y="116">Upload-Offset</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD to upload resource URL                     |
|------------------------------------------------>|
|                                                 |
|               204 No Content with Upload-Offset |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) The client can resume the upload by sending the remaining file content to the upload resource (<xref target="upload-appending"/>), appending to the already stored data in the upload. The <tt>Upload-Offset</tt> value is included to ensure that the client and server agree on the offset that the upload resumes from.</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="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="40" y="68">PATCH</text>
                  <text x="76" y="68">to</text>
                  <text x="116" y="68">upload</text>
                  <text x="180" y="68">resource</text>
                  <text x="232" y="68">URL</text>
                  <text x="268" y="68">with</text>
                  <text x="344" y="68">Upload-Offset</text>
                  <text x="200" y="116">201</text>
                  <text x="248" y="116">Created</text>
                  <text x="292" y="116">on</text>
                  <text x="348" y="116">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH to upload resource URL with Upload-Offset |
|------------------------------------------------>|
|                                                 |
|                      201 Created on completion  |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can instruct the upload resource to delete the upload and free all related resources (<xref target="upload-cancellation"/>).</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="84" y="68">to</text>
                  <text x="124" y="68">upload</text>
                  <text x="188" y="68">resource</text>
                  <text x="240" y="68">URL</text>
                  <text x="184" y="116">204</text>
                  <text x="212" y="116">No</text>
                  <text x="256" y="116">Content</text>
                  <text x="300" y="116">on</text>
                  <text x="356" y="116">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| DELETE to upload resource URL                   |
|------------------------------------------------>|
|                                                 |
|                    204 No Content on completion |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="example-2-upload-as-a-series-of-parts">
        <name>Example 2: Upload as a series of parts</name>
        <t>In some cases, clients might prefer to upload a file 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, such as when file data originates from a streaming source.</t>
        <t>This example shows how the client, with prior knowledge about the server's resumable upload support, can upload parts of a file incrementally.</t>
        <t>1) If the client is aware that the server supports resumable upload, it can start an upload with the <tt>Upload-Complete</tt> field value set to false and the first part of the file.</t>
        <figure anchor="fig-upload-creation-incomplete">
          <name>Incomplete Upload Creation</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">POST</text>
                  <text x="76" y="68">with</text>
                  <text x="164" y="68">Upload-Complete:</text>
                  <text x="244" y="68">?0</text>
                  <text x="120" y="116">201</text>
                  <text x="168" y="116">Created</text>
                  <text x="220" y="116">with</text>
                  <text x="308" y="116">Upload-Complete:</text>
                  <text x="388" y="116">?0</text>
                  <text x="120" y="132">and</text>
                  <text x="172" y="132">Location</text>
                  <text x="220" y="132">on</text>
                  <text x="276" y="132">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| POST with Upload-Complete: ?0                   |
|------------------------------------------------>|
|                                                 |
|            201 Created with Upload-Complete: ?0 |
|            and Location on completion           |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>2) Subsequently, parts are appended (<xref target="upload-appending"/>). The last part of the upload has a <tt>Upload-Complete</tt> field value set to true to indicate the complete transfer.</t>
        <figure anchor="fig-upload-appending-last-chunk">
          <name>Upload Append Last Chunk</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,96 L 400,96" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,96 396,90.4 396,101.6" fill="black" transform="rotate(0,400,96)"/>
                <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="40" y="68">PATCH</text>
                  <text x="76" y="68">to</text>
                  <text x="116" y="68">upload</text>
                  <text x="180" y="68">resource</text>
                  <text x="232" y="68">URL</text>
                  <text x="268" y="68">with</text>
                  <text x="72" y="84">Upload-Offset</text>
                  <text x="144" y="84">and</text>
                  <text x="228" y="84">Upload-Complete:</text>
                  <text x="308" y="84">?1</text>
                  <text x="208" y="132">201</text>
                  <text x="256" y="132">Created</text>
                  <text x="300" y="132">on</text>
                  <text x="356" y="132">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH to upload resource URL with               |
| Upload-Offset and Upload-Complete: ?1           |
|------------------------------------------------>|
|                                                 |
|                       201 Created on completion |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="upload-creation">
      <name>Upload Creation</name>
      <t>When a resource supports resumable uploads, the first step is creating the upload resource. To be compatible with the widest range of resources, this is accomplished by including the <tt>Upload-Complete</tt> header field in the request that initiates the upload.</t>
      <t>As a consequence, resumable uploads support all HTTP request methods that can carry content, such as <tt>POST</tt>, <tt>PUT</tt>, and <tt>PATCH</tt>. Similarly, the response to the upload request can have any status code. Both the method(s) and status code(s) supported are determined by the resource.</t>
      <t><tt>Upload-Complete</tt> <bcp14>MUST</bcp14> be set to false if the end of the request content is not the end of the upload. Otherwise, it <bcp14>MUST</bcp14> be set to true. This header field can be used for request identification by a server. The request <bcp14>MUST NOT</bcp14> include the <tt>Upload-Offset</tt> header field.</t>
      <t>If the request is valid, the server <bcp14>SHOULD</bcp14> create an upload resource. Then, the server <bcp14>MUST</bcp14> include the <tt>Location</tt> header field in the response and set its value to the URL of the upload resource. The client <bcp14>MAY</bcp14> use this URL for offset retrieval (<xref target="offset-retrieving"/>), upload append (<xref target="upload-appending"/>), and upload cancellation (<xref target="upload-cancellation"/>).</t>
      <t>Once the upload resource is available and while the request content is being uploaded, the target resource <bcp14>MAY</bcp14> send one or more informational responses with a <tt>104 (Upload Resumption Supported)</tt> status code to the client. In the first informational response, the <tt>Location</tt> header field <bcp14>MUST</bcp14> be set to the URL pointing to the upload resource. In subsequent informational responses, the <tt>Location</tt> header field <bcp14>MUST NOT</bcp14> be set. An informational response <bcp14>MAY</bcp14> contain the <tt>Upload-Offset</tt> header field with the current upload offset as the value to inform the client about the upload progress.</t>
      <t>The server <bcp14>MUST</bcp14> send the <tt>Upload-Offset</tt> header field in the response if it considers the upload active, either when the response is a success (e.g. <tt>201 (Created)</tt>), or when the response is a failure (e.g. <tt>409 (Conflict)</tt>). The <tt>Upload-Offset</tt> field value <bcp14>MUST</bcp14> be equal to the end offset of the entire upload, or the begin offset of the next chunk if the upload is still incomplete. The client <bcp14>SHOULD</bcp14> consider the upload failed if the response has a status code that indicates a success but the offset indicated in the <tt>Upload-Offset</tt> field value does not equal the total of begin offset plus the number of bytes uploaded in the request.</t>
      <t>If the request completes successfully and the entire upload is complete, the server <bcp14>MUST</bcp14> acknowledge it by responding with a 2xx (Successful) status code. Servers are <bcp14>RECOMMENDED</bcp14> to use <tt>201 (Created)</tt> unless otherwise specified. The response <bcp14>MUST NOT</bcp14> include the <tt>Upload-Complete</tt> header field with the value of false.</t>
      <t>If the request completes successfully but the entire upload is not yet complete, as indicated by an <tt>Upload-Complete</tt> field value of false in the request, the server <bcp14>MUST</bcp14> acknowledge it by responding with the <tt>201 (Created)</tt> status code and an <tt>Upload-Complete</tt> header value set to false.</t>
      <t>The request can indicate the upload's final size in two different ways. Both indicators may be present in the same request as long as they convey the same size. If the sizes are inconsistent, the server <bcp14>MUST</bcp14> reject the request by responding with a <tt>400 (Bad Request)</tt> status code.</t>
      <ul spacing="normal">
        <li>
          <t>If the request includes an <tt>Upload-Complete</tt> field value set to true and a valid <tt>Content-Length</tt> header field, the client attempts to upload a fixed-length resource in one request. In this case, the upload's final size is the <tt>Content-Length</tt> field value and the server <bcp14>MUST</bcp14> record it to ensure its consistency. The value can therefore not be used if the upload is split across multiple requests.</t>
        </li>
        <li>
          <t>If the request includes the <tt>Upload-Length</tt> header field, the server <bcp14>MUST</bcp14> record its value as the upload's final size. A client <bcp14>SHOULD</bcp14> provide this header field if the upload length is known at the time of upload creation.</t>
        </li>
      </ul>
      <t>The upload is not automatically completed if the offset reaches the upload's final size. Instead, a client <bcp14>MUST</bcp14> indicate the completion of an upload through the <tt>Upload-Complete</tt> header field. Indicating an upload's final size can help the server allocate necessary resources for the upload and provide early feedback if the size does not match the server's limits (<xref target="upload-limit"/>).</t>
      <t>The server <bcp14>MAY</bcp14> enforce a maximum size of an upload resource. This limit <bcp14>MAY</bcp14> be equal to the upload's final size, if available, or an arbitrary value. The limit's value or its existence <bcp14>MUST NOT</bcp14> change throughout the lifetime of the upload resource. The server <bcp14>MAY</bcp14> indicate such a limit to the client by including the <tt>Upload-Limit</tt> header field in the informational or final response to upload creation. If the client receives an <tt>Upload-Limit</tt> header field indicating that the maximum size is less than the amount of bytes it intends to upload to a resource, it <bcp14>SHOULD</bcp14> stop the current upload transfer immediately and cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>The request content <bcp14>MAY</bcp14> be empty. If the <tt>Upload-Complete</tt> header field is then set to true, the client intends to upload an empty resource representation. An <tt>Upload-Complete</tt> header field is set to false is also valid. This can be used to create an upload resource URL before transferring data, which can save client or server resources. Since informational responses are optional, this technique provides another mechanism to learn the URL, at the cost of an additional round-trip before data upload can commence.</t>
      <t>If the server does not receive the entire request content, for example because of canceled requests or dropped connections, it <bcp14>SHOULD</bcp14> append as much of the request content starting at its beginning and without discontinuities as possible. If the server did not append the entire request content, the upload <bcp14>MUST NOT</bcp14> be considered complete.</t>
      <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
Upload-Complete: ?1
Content-Length: 100
Upload-Length: 100

[content (100 bytes)]
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Upload-Draft-Interop-Version: 6
Location: https://example.com/upload/b530ce8ff

HTTP/1.1 104 Upload Resumption Supported
Upload-Draft-Interop-Version: 6
Upload-Offset: 50
Upload-Limit: max-size=1000000000

HTTP/1.1 201 Created
Location: https://example.com/upload/b530ce8ff
Upload-Offset: 100
Upload-Limit: max-size=1000000000
]]></sourcecode>
      <t>The next example shows an upload creation, where only the first 25 bytes of a 100 bytes upload are transferred. The server acknowledges the received data and that the upload is not complete yet:</t>
      <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
Upload-Complete: ?0
Content-Length: 25
Upload-Length: 100

[partial content (25 bytes)]
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Location: https://example.com/upload/b530ce8ff
Upload-Complete: ?0
Upload-Offset: 25
Upload-Limit: max-size=1000000000
]]></sourcecode>
      <t>If the client received an informational response with the upload URL in the Location field value, it <bcp14>MAY</bcp14> automatically attempt upload resumption when the connection is terminated unexpectedly, or if a 5xx status is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if it receives a 4xx status code.</t>
      <t>File metadata can affect how servers might act on the uploaded file. Clients can send representation metadata (see <xref section="8.3" sectionFormat="of" target="HTTP"/>) in the request that starts an upload. Servers <bcp14>MAY</bcp14> interpret this metadata or <bcp14>MAY</bcp14> ignore it. The <tt>Content-Type</tt> header field (<xref section="8.3" sectionFormat="of" target="HTTP"/>) can be used to indicate the media type of the file. The applied content codings are specified using the <tt>Content-Encoding</tt> header field and are retained throughout the entire upload. When resuming an interrupted upload, the same content codings are used for appending to the upload, producing a representation of the upload resource. The <tt>Content-Disposition</tt> header field (<xref target="RFC6266"/>) can be used to transmit a filename; if included, the parameters <bcp14>SHOULD</bcp14> be either <tt>filename</tt>, <tt>filename*</tt> or <tt>boundary</tt>.</t>
      <section anchor="feature-detection">
        <name>Feature Detection</name>
        <t>If the client has no knowledge of whether the resource supports resumable uploads, a resumable request can be used with some additional constraints. In particular, the <tt>Upload-Complete</tt> field value (<xref target="upload-complete"/>) <bcp14>MUST NOT</bcp14> be false if the server support is unclear. This allows the upload to function as if it is a regular upload.</t>
        <t>Servers <bcp14>SHOULD</bcp14> use the <tt>104 (Upload Resumption Supported)</tt> informational response to indicate their support for a resumable upload request.</t>
        <t>Clients <bcp14>MUST NOT</bcp14> attempt to resume an upload unless they receive <tt>104 (Upload Resumption Supported)</tt> informational response, or have other out-of-band methods to determine server support for resumable uploads.</t>
      </section>
      <section anchor="draft-version-identification">
        <name>Draft Version Identification</name>
        <ul empty="true">
          <li>
            <t><strong>RFC Editor's Note:</strong>  Please remove this section and <tt>Upload-Draft-Interop-Version</tt> from all examples prior to publication of a final version of this document.</t>
          </li>
        </ul>
        <t>The current interop version is 6.</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> informational 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> informational response.</t>
        <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> ignore a <tt>104 (Upload Resumption Supported)</tt> informational 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>
    <section anchor="offset-retrieving">
      <name>Offset Retrieval</name>
      <t>If an upload is interrupted, the client <bcp14>MAY</bcp14> attempt to fetch the offset of the incomplete upload by sending a <tt>HEAD</tt> request to the upload resource.</t>
      <t>The request <bcp14>MUST NOT</bcp14> include an <tt>Upload-Offset</tt>, <tt>Upload-Complete</tt>, or <tt>Upload-Length</tt> header field. The server <bcp14>MUST</bcp14> reject requests with either of these fields by responding with a <tt>400 (Bad Request)</tt> status code.</t>
      <t>If the server considers the upload resource to be active, it <bcp14>MUST</bcp14> respond with a <tt>204 (No Content)</tt> or <tt>200 (OK)</tt> status code. The response <bcp14>MUST</bcp14> include the <tt>Upload-Offset</tt> header field, with the value set to the current resumption offset for the target resource. The response <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field; the value is set to true only if the upload is complete. The response <bcp14>MUST</bcp14> include the <tt>Upload-Length</tt> header field set to the upload's final size if one was recorded during the upload creation (<xref target="upload-creation"/>). The response <bcp14>MAY</bcp14> include the <tt>Upload-Limit</tt> header field if corresponding limits on the upload resource exist.</t>
      <t>An upload is considered complete only if the server completely and successfully received a corresponding creation request (<xref target="upload-creation"/>) or append request (<xref target="upload-appending"/>) with the <tt>Upload-Complete</tt> header value set to true.</t>
      <t>The client <bcp14>MUST NOT</bcp14> perform offset retrieval while creation (<xref target="upload-creation"/>) or append (<xref target="upload-appending"/>) is in progress.</t>
      <t>The offset <bcp14>MUST</bcp14> be accepted by a subsequent append (<xref target="upload-appending"/>). Due to network delay and reordering, the server might still be receiving data from an ongoing transfer for the same upload resource, which in the client's perspective has failed. The server <bcp14>MAY</bcp14> terminate any transfers for the same upload resource before sending the response by abruptly terminating the HTTP connection or stream. Alternatively, the server <bcp14>MAY</bcp14> keep the ongoing transfer alive but ignore further bytes received past the offset.</t>
      <t>The client <bcp14>MUST NOT</bcp14> start more than one append (<xref target="upload-appending"/>) based on the resumption offset from a single offset retrieving request.</t>
      <t>In order to prevent HTTP caching (<xref target="CACHING"/>), the response <bcp14>SHOULD</bcp14> include a <tt>Cache-Control</tt> header field with the value <tt>no-store</tt>.</t>
      <t>If the server does not consider the upload resource to be active, it <bcp14>MUST</bcp14> respond with a <tt>404 (Not Found)</tt> status code.</t>
      <t>The resumption offset can be less than or equal to the number of bytes the client has already sent. The client <bcp14>MAY</bcp14> reject an offset which is greater than the number of bytes it has already sent during this upload. The client is expected to handle backtracking of a reasonable length. If the offset is invalid for this upload, or if the client cannot backtrack to the offset and reproduce the same content it has already sent, the upload <bcp14>MUST</bcp14> be considered a failure. The client <bcp14>MAY</bcp14> cancel the upload (<xref target="upload-cancellation"/>) after rejecting the offset.</t>
      <t>The following example shows an offset retrieval request. The server indicates the new offset and that the upload is not complete yet:</t>
      <sourcecode type="http-message"><![CDATA[
HEAD /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Offset: 100
Upload-Complete: ?0
Cache-Control: no-store
]]></sourcecode>
      <t>The client <bcp14>SHOULD NOT</bcp14> automatically retry if a 4xx (Client Error) status code is received.</t>
    </section>
    <section anchor="upload-appending">
      <name>Upload Append</name>
      <t>Upload appending is used for resuming an existing upload.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>PATCH</tt> method with the <tt>application/partial-upload</tt> media type and <bcp14>MUST</bcp14> be sent to the upload resource. The <tt>Upload-Offset</tt> field value (<xref target="upload-offset"/>) <bcp14>MUST</bcp14> be set to the resumption offset.</t>
      <t>If the end of the request content is not the end of the upload, the <tt>Upload-Complete</tt> field value (<xref target="upload-complete"/>) <bcp14>MUST</bcp14> be set to false.</t>
      <t>The server <bcp14>SHOULD</bcp14> respect representation metadata received during creation (<xref target="upload-creation"/>). An upload append request continues uploading the same representation as used in the upload creation (<xref target="upload-creation"/>) and thus uses the same content codings, if they were applied. For example, if the initial upload creation included the <tt>Content-Encoding: gzip</tt> header field, the upload append request resumes the transfer of the gzipped data without indicating again that the gzip coding is applied.</t>
      <t>If the server does not consider the upload associated with the upload resource active, it <bcp14>MUST</bcp14> respond with a <tt>404 (Not Found)</tt> status code.</t>
      <t>The client <bcp14>MUST NOT</bcp14> perform multiple upload transfers for the same upload resource in parallel. This helps avoid race conditions, and data loss or corruption. The server is <bcp14>RECOMMENDED</bcp14> to take measures to avoid parallel upload transfers: The server <bcp14>MAY</bcp14> terminate any creation (<xref target="upload-creation"/>) or append for the same upload URL. Since the client is not allowed to perform multiple transfers 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>If the offset indicated by the <tt>Upload-Offset</tt> field value does not match the offset provided by the immediate previous offset retrieval (<xref target="offset-retrieving"/>), or the end offset of the immediate previous incomplete successful transfer, the server <bcp14>MUST</bcp14> respond with a <tt>409 (Conflict)</tt> status code. The server <bcp14>MAY</bcp14> use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" in the response; see <xref target="mismatching-offset"/>.</t>
      <t>The server applies the patch document of the <tt>application/partial-upload</tt> media type by appending the request content to the targeted upload resource. If the server does not receive the entire patch document, for example because of canceled requests or dropped connections, it <bcp14>SHOULD</bcp14> append as much of the patch document starting at its beginning and without discontinuities as possible. Appending a continuous section starting at the patch document's beginning constitutes a successful PATCH as defined in <xref section="2" sectionFormat="of" target="RFC5789"/>. If the server did not receive and apply the entire patch document, the upload <bcp14>MUST NOT</bcp14> be considered complete.</t>
      <t>While the request content is being uploaded, the target resource <bcp14>MAY</bcp14> send one or more informational responses with a <tt>104 (Upload Resumption Supported)</tt> status code to the client. These informational responses <bcp14>MUST NOT</bcp14> contain the <tt>Location</tt> header field. They <bcp14>MAY</bcp14> include the <tt>Upload-Offset</tt> header field with the current upload offset as the value to inform the client about the upload progress.</t>
      <t>The server <bcp14>MUST</bcp14> send the <tt>Upload-Offset</tt> header field in the response if it considers the upload active, either when the response is a success (e.g. <tt>201 (Created)</tt>), or when the response is a failure (e.g. <tt>409 (Conflict)</tt>). The value <bcp14>MUST</bcp14> be equal to the end offset of the entire upload, or the begin offset of the next chunk if the upload is still incomplete. The client <bcp14>SHOULD</bcp14> consider the upload failed if the status code indicates a success but the offset indicated by the <tt>Upload-Offset</tt> field value does not equal the total of begin offset plus the number of bytes uploaded in the request.</t>
      <t>If the upload is already complete, the server <bcp14>MUST NOT</bcp14> modify the upload resource and <bcp14>MUST</bcp14> respond with a <tt>400 (Bad Request)</tt> status code. The server <bcp14>MAY</bcp14> use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#completed-upload" in the response; see <xref target="completed-upload"/>.</t>
      <t>If the request completes successfully and the entire upload is complete, the server <bcp14>MUST</bcp14> acknowledge it by responding with a 2xx (Successful) status code. Servers are <bcp14>RECOMMENDED</bcp14> to use a <tt>201 (Created)</tt> response if not otherwise specified. The response <bcp14>MUST NOT</bcp14> include the <tt>Upload-Complete</tt> header field with the value set to false.</t>
      <t>If the request completes successfully but the entire upload is not yet complete indicated by the <tt>Upload-Complete</tt> field value set to false, the server <bcp14>MUST</bcp14> acknowledge it by responding with a <tt>201 (Created)</tt> status code and the <tt>Upload-Complete</tt> field value set to true.</t>
      <t>If the request includes the <tt>Upload-Complete</tt> field value set to true and a valid <tt>Content-Length</tt> header field, the client attempts to upload the remaining resource in one request. In this case, the upload's final size is the sum of the upload's offset and the <tt>Content-Length</tt> header field. If the server does not have a record of the upload's final size from creation or the previous append, the server <bcp14>MUST</bcp14> record the upload's final size to ensure its consistency. If the server does have a previous record, that value <bcp14>MUST</bcp14> match the upload's final size. If they do not match, the server <bcp14>MUST</bcp14> reject the request with a <tt>400 (Bad Request)</tt> status code.</t>
      <t>The server <bcp14>MUST</bcp14> prevent that the offset exceeds the upload's final size when appending. If a final size has been recorded and the upload append request exceeds this value, the server <bcp14>MUST</bcp14> stop appending bytes to the upload once the offset reaches the final size and reject the request with a <tt>400 (Bad Request)</tt> status code. It is not sufficient to rely on the <tt>Content-Length</tt> header field for enforcement because the header field might not be present.</t>
      <t>The request content <bcp14>MAY</bcp14> be empty. If the <tt>Upload-Complete</tt> field is then set to true, the client wants to complete the upload without appending additional data.</t>
      <t>The following example shows an upload append. The client transfers the next 100 bytes at an offset of 100 and does not indicate that the upload is then completed. The server acknowledges the new offset:</t>
      <sourcecode type="http-message"><![CDATA[
PATCH /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Offset: 100
Upload-Draft-Interop-Version: 6
Content-Length: 100
Content-Type: application/partial-upload

[content (100 bytes)]
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Upload-Offset: 200
]]></sourcecode>
      <t>The client <bcp14>MAY</bcp14> automatically attempt upload resumption when the connection is terminated unexpectedly, or if a 5xx (Server Error) status code is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if a 4xx (Client Error) status code is received.</t>
    </section>
    <section anchor="upload-cancellation">
      <name>Upload Cancellation</name>
      <t>If the client wants to terminate the transfer without the ability to resume, 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>
      <t>The client <bcp14>MUST NOT</bcp14> initiate cancellation without the knowledge of server support.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>DELETE</tt> method. The request <bcp14>MUST NOT</bcp14> include an <tt>Upload-Offset</tt> or <tt>Upload-Complete</tt> header field. The server <bcp14>MUST</bcp14> reject the request with a <tt>Upload-Offset</tt> or <tt>Upload-Complete</tt> header field with a <tt>400 (Bad Request)</tt> status code.</t>
      <t>If the server successfully deactivates the upload resource, it <bcp14>MUST</bcp14> respond with a <tt>204 (No Content)</tt> status code.</t>
      <t>The server <bcp14>MAY</bcp14> terminate any in-flight requests to the upload resource before sending the response by abruptly terminating their HTTP connection(s) or stream(s).</t>
      <t>If the server does not consider the upload resource to be active, it <bcp14>MUST</bcp14> respond with a <tt>404 (Not Found)</tt> status code.</t>
      <t>If the server does not support cancellation, it <bcp14>MUST</bcp14> respond with a <tt>405 (Method Not Allowed)</tt> status code.</t>
      <t>The following example shows an upload cancellation:</t>
      <sourcecode type="http-message"><![CDATA[
DELETE /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
]]></sourcecode>
    </section>
    <section anchor="header-fields">
      <name>Header Fields</name>
      <section anchor="upload-offset">
        <name>Upload-Offset</name>
        <t>The <tt>Upload-Offset</tt> request and response header field indicates the resumption offset of corresponding upload, counted in bytes. The <tt>Upload-Offset</tt> field value is an Integer.</t>
      </section>
      <section anchor="upload-limit">
        <name>Upload-Limit</name>
        <t>The <tt>Upload-Limit</tt> response header field indicates limits applying the upload resource. The <tt>Upload-Limit</tt> field value is a Dictionary. The following limits are defined:</t>
        <ul spacing="normal">
          <li>
            <t>The <tt>max-size</tt> key specifies a maximum size that an upload resource is allowed to reach, counted in bytes. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>min-size</tt> key specifies a minimum size for a resumable upload, counted in bytes. The server <bcp14>MAY</bcp14> NOT create an upload resource if the client indicates that the uploaded data is smaller than the minimum size by including the <tt>Content-Length</tt> and <tt>Upload-Complete: ?1</tt> fields, but the server <bcp14>MAY</bcp14> still accept the uploaded data. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>max-append-size</tt> key specifies a maximum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server <bcp14>MAY</bcp14> reject requests exceeding this limit and a client <bcp14>SHOULD NOT</bcp14> send larger upload append requests. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>min-append-size</tt> key specifies a minimum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>) that does not complete the upload by setting the <tt>Upload-Complete: ?1</tt> field. The server <bcp14>MAY</bcp14> reject non-completing requests below this limit and a client <bcp14>SHOULD NOT</bcp14> send smaller non-completing upload append requests. A server <bcp14>MUST NOT</bcp14> reject an upload append request due to smaller size if the request includes the <tt>Upload-Complete: ?1</tt> field. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>expires</tt> key specifies the remaining lifetime of the upload resource in seconds counted from the generation of the response by the server. After the resource's lifetime is reached, the server <bcp14>MAY</bcp14> make the upload resource inaccessible and a client <bcp14>SHOULD NOT</bcp14> attempt to access the upload resource. The lifetime <bcp14>MAY</bcp14> be extended but <bcp14>SHOULD NOT</bcp14> be reduced once the upload resource is created. The value is an Integer.</t>
          </li>
        </ul>
        <t>When parsing this header field, unrecognized keys <bcp14>MUST</bcp14> be ignored and <bcp14>MUST NOT</bcp14> fail the parsing to facilitate the addition of new limits in the future.</t>
        <t>A server that supports the creation of a resumable upload resource (<xref target="upload-creation"/>) under a target URI <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits in a response to an <tt>OPTIONS</tt> request sent to this target URI. If a server supports the creation of upload resources for any target URI, it <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits in a response to an <tt>OPTIONS</tt> request with the <tt>*</tt> target. 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. If the server does not apply any limits, it <bcp14>MUST</bcp14> use <tt>min-size=0</tt> instead of an empty header value. A client can use an <tt>OPTIONS</tt> request to discover support for resumable uploads and potential limits before creating an upload resource.</t>
      </section>
      <section anchor="upload-complete">
        <name>Upload-Complete</name>
        <t>The <tt>Upload-Complete</tt> request and response header field indicates whether the corresponding upload is considered complete. The <tt>Upload-Complete</tt> field value is a Boolean.</t>
        <t>The <tt>Upload-Complete</tt> header field <bcp14>MUST</bcp14> only be used if support by the resource is known to the client (<xref target="feature-detection"/>).</t>
      </section>
      <section anchor="upload-length">
        <name>Upload-Length</name>
        <t>The <tt>Upload-Length</tt> request and response header field indicates the number of bytes to be uploaded for the corresponding upload resource, counted in bytes. The <tt>Upload-Length</tt> field value is an Integer.</t>
      </section>
    </section>
    <section anchor="media-type-applicationpartial-upload">
      <name>Media Type <tt>application/partial-upload</tt></name>
      <t>The <tt>application/partial-upload</tt> media type describes a contiguous block of data that should be uploaded to a resource. There is no minimum block size and the block might be empty. The start and end of the block might align with the start and end of the file that should be uploaded, but they are not required to be aligned.</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 <bcp14>MAY</bcp14> 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. 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 an example response, where the resource's offset was 100, but the client attempted to append at offset 200:</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 409 Conflict
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 100,
  "provided-offset": 200
}
]]></sourcecode>
      </section>
      <section anchor="completed-upload">
        <name>Completed Upload</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#completed-upload" problem type <xref target="PROBLEM"/>. A server <bcp14>MAY</bcp14> use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the upload has already been completed and cannot be modified.</t>
        <t>The following example shows an example response:</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#completed-upload",
  "title": "upload is already completed"
}

]]></sourcecode>
      </section>
    </section>
    <section anchor="offset-values">
      <name>Offset values</name>
      <t>The offset of an upload resource is the number of bytes that have been appended to the upload resource. Appended data cannot be removed from an upload and, therefore, the upload offset <bcp14>MUST NOT</bcp14> decrease. A server <bcp14>MUST NOT</bcp14> generate responses containing an <tt>Upload-Offset</tt> header field with a value that is smaller than was included in previous responses for the same upload resource. This includes informational and final responses for upload creation (<xref target="upload-creation"/>), upload appending (<xref target="upload-appending"/>), and offset retrieval (<xref target="offset-retrieving"/>).</t>
      <t>If a server loses data that has been appended to an upload, it <bcp14>MUST</bcp14> consider the upload resource invalid and reject further use of the upload resource. The <tt>Upload-Offset</tt> header field in responses serves as an acknowledgement of the append operation and as a guarantee that no retransmission of the data will be necessary. Client can use this guarantee to free resources associated to already uploaded data while the upload is still ongoing.</t>
    </section>
    <section anchor="redirection">
      <name>Redirection</name>
      <t>The <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes <bcp14>MUST NOT</bcp14> be used in offset retrieval (<xref target="offset-retrieving"/>) and upload cancellation (<xref target="upload-cancellation"/>) responses. For other responses, the upload resource <bcp14>MAY</bcp14> return a <tt>308 (Permanent Redirect)</tt> status code and clients <bcp14>SHOULD</bcp14> use the new permanent URI for subsequent requests. If the client receives a <tt>307 (Temporary Redirect)</tt> response to an offset retrieval (<xref target="offset-retrieving"/>) request, it <bcp14>MAY</bcp14> apply the redirection directly in an immediate subsequent upload append (<xref target="upload-appending"/>).</t>
    </section>
    <section anchor="content-codings">
      <name>Content Codings</name>
      <t>Since the codings listed in <tt>Content-Encoding</tt> 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 <tt>Upload-Offset</tt> and optionally <tt>Upload-Length</tt> 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. See <xref section="A" sectionFormat="of" target="DIGEST-FIELDS"/> for more information.</t>
    </section>
    <section anchor="transfer-codings">
      <name>Transfer Codings</name>
      <t>Unlike <tt>Content-Encoding</tt> (see <xref section="8.4.1" sectionFormat="of" target="HTTP"/>), <tt>Transfer-Encoding</tt> (see <xref section="6.1" sectionFormat="of" target="RFC9112"/>) is 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 value of <tt>Upload-Length</tt>. Please note that the <tt>Content-Length</tt> header field cannot be used in conjunction with the <tt>Transfer-Encoding</tt> header field.</t>
    </section>
    <section anchor="integrity-digests">
      <name>Integrity Digests</name>
      <t>The integrity of an entire upload or individual upload requests can be verifying using digests from <xref target="DIGEST-FIELDS"/>.</t>
      <section anchor="representation-digests">
        <name>Representation Digests</name>
        <t>Representation digests help verify the integrity of the entire data that has been uploaded so far, which might strech across multiple requests.</t>
        <t>If the client knows the integrity digest of the entire data before creating an upload resource, it <bcp14>MAY</bcp14> include the <tt>Repr-Digest</tt> header field when creating an upload (<xref target="upload-creation"/>). Once the upload is completed, the server can compute the integrity digest of the received upload representation and compare it to the provided digest. If the digests don't match the server <bcp14>SHOULD</bcp14> consider the transfer failed and not process the uploaded data further. This way, the integrity of the entire uploaded data can be protected.</t>
        <t>Alternatively, when creating an upload (<xref target="upload-creation"/>), the client <bcp14>MAY</bcp14> ask the server to compute and return the integrity digests using a <tt>Want-Repr-Digest</tt> field conveying the preferred algorithms.
The response <bcp14>SHOULD</bcp14> include at least one of the requested digests, but <bcp14>MAY</bcp14> not include it.
The server <bcp14>SHOULD</bcp14> compute the representation digests using the preferred algorithms once the upload is complete and include the corresponding <tt>Repr-Digest</tt> header field in the response.
Alternatively, the server <bcp14>MAY</bcp14> compute the digest continuously during the upload and include the <tt>Repr-Digest</tt> header field in responses to upload creation (<xref target="upload-creation"/>) and upload appending requests (<xref target="upload-appending"/>) even when the upload is not completed yet.
This allows the client to simultaneously compute the digest of the transmitted upload data, compare its digest to the server's digest, and spot data integrity issues.
If an upload is spread across multiple requests, data integrity issues can be found even before the upload is fully completed.</t>
      </section>
      <section anchor="content-digests">
        <name>Content Digests</name>
        <t>Content digests help verify the integrity of the content in an individual request.</t>
        <t>If the client knows the integrity digest of the content from an upload creation (<xref target="upload-creation"/>) or upload appending (<xref target="upload-appending"/>) request, it <bcp14>MAY</bcp14> include the <tt>Content-Digest</tt> header field in the request. Once the content has been received, the server can compute the integrity digest of the received content and compare it to the provided digest. If the digests don't match the server <bcp14>SHOULD</bcp14> consider the transfer failed and not append the content to the upload resource. This way, the integrity of an individual request can be protected.</t>
      </section>
    </section>
    <section anchor="subsequent-resources">
      <name>Subsequent Resources</name>
      <t>The server might process the uploaded data and make its results available in another resource during or after the upload. This subsequent resource is different from the upload resource created by the upload creation request (<xref target="upload-creation"/>). The subsequent resource does not handle the upload process itself, but instead facilitates further interaction with the uploaded data. The server <bcp14>MAY</bcp14> indicate the location of this subsequent resource by including the <tt>Content-Location</tt> header field in the informational or final responses generated while creating (<xref target="upload-creation"/>), appending to (<xref target="upload-appending"/>), or retrieving the offset (<xref target="offset-retrieving"/>) of an upload. For example, a subsequent resource could allow the client to fetch information extracted from the uploaded data.</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 file is fully or partially transferred in the first request, or if no file data is included at all. Which behavior is best largely depends on the client's capabilities, its intention to avoid data re-transmission, and its knowledge about the server's support for resumable uploads.</t>
      <t>The following subsections describe two typical upload strategies that are suited for common environments. Note that these modes are never explicitly communicated to the server and clients are not required to stick to 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 independent of the client's knowledge about the server's support for resumable uploads. However, the client must be capable of handling and processing interim responses. An upload creation request then includes the full file because the client anticipates that the file will be transferred without interruptions or resumed if an interruption occurs.</t>
        <t>The benefit of this method is that if the upload creation request succeeds, the file was 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 received a <tt>104 (Upload Resumption Supported)</tt> intermediate response with the upload URL, the client cannot resume that upload due to the missing upload URL. The intermediate response might not be received if the interruption happens too early in the message exchange, the server does not support resumable uploads at all, the server does not support sending the <tt>104 (Upload Resumption Supported)</tt> intermediate response, or an intermediary dropped the intermediate response. Without a 104 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>
        <section anchor="upgrading-to-resumable-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 file is transferred in a single request, usually <tt>POST</tt> or <tt>PUT</tt>, without any ability to resume from interruptions. The client can offer the server to upgrade such a request to a resumable upload (see <xref target="feature-detection"/>) 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 upload's final size is known upfront. The request is not changed otherwise.</t>
          <t>A server that supports resumable uploads at the target URI can create a resumable upload resource and send its upload URL in a <tt>104 (Upload Resumption Supported)</tt> intermediate response for the client to resume the upload after interruptions. A server 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. The transfer then falls back to a non-resumable upload without additional cost.</t>
          <t>This upgrade can also be performed transparently by the client without the user taking an active role. When a user asks the client to send a non-resumable request, the client can perform the upgrade 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 file upload and should be presented 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 server supports resumable uploads and sends an empty upload creation request without including any file data. Upon successful response reception, the client can use the included upload URL to transmit the file data (<xref target="upload-appending"/>) and resume the upload at any stage if an interruption occurs. The client should inspect the response for the <tt>Upload-Limit</tt> header field, which would indicate limits applying to the remaining upload procedure.</t>
        <t>The retransmission of file 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 file data.</t>
        <t>This approach best suited if the client cannot receive intermediate responses, e.g. due to a limitation in the provided HTTP interface, or if large files are transferred where the cost of the additional request is miniscule compared to the effort of transferring the large file itself.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The upload resource URL is the identifier used for modifying the upload. Without further protection of this URL, an attacker may obtain information about an upload, append data to it, or cancel it. To prevent this, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can access the upload resource. In addition, the upload resource URL <bcp14>SHOULD</bcp14> be generated in such a way that makes it hard to be guessed by unauthorized clients.</t>
      <t>Some servers or intermediaries provide scanning of content uploaded by clients. Any scanning mechanism that relies on receiving a complete file 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 a full file, or disabling resumable uploads.</t>
      <t>Resumable uploads are vulnerable to Slowloris-style attacks <xref target="SLOWLORIS"/>. A malicious client may 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.</t>
      <t>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="iana-considerations">
      <name>IANA Considerations</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">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Upload-Complete</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-complete"/> of this document</td>
          </tr>
          <tr>
            <td align="left">Upload-Offset</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-offset"/> of this document</td>
          </tr>
          <tr>
            <td align="left">Upload-Limit</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-limit"/> of this document</td>
          </tr>
          <tr>
            <td align="left">Upload-Length</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-length"/> of this document</td>
          </tr>
        </tbody>
      </table>
      <t>IANA is asked to register the following entry in the "HTTP Status Codes" 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>This document</t>
        </dd>
      </dl>
      <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 this document</t>
        </dd>
        <dt>Interoperability considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Published specification:</dt>
        <dd>
          <t>This document</t>
        </dd>
        <dt>Applications that use this media type:</dt>
        <dd>
          <t>Applications that transfer files over unreliable networks or want pause- 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>
      <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
Title:</t>
        </dd>
        <dt/>
        <dd>
          <t>Mismatching Upload Offset
Recommended HTTP status code:</t>
        </dd>
        <dt/>
        <dd>
          <t>409
Reference:</t>
        </dd>
        <dt/>
        <dd>
          <t>This document</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#completed-upload
Title:</t>
        </dd>
        <dt/>
        <dd>
          <t>Upload Is Completed
Recommended HTTP status code:</t>
        </dd>
        <dt/>
        <dd>
          <t>400
Reference:</t>
        </dd>
        <dt/>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <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="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="RFC5789">
          <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="DIGEST-FIELDS">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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="February" year="2021"/>
            <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 that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="RFC6266">
          <front>
            <title>Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)</title>
            <author fullname="J. Reschke" initials="J." surname="Reschke"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>RFC 2616 defines the Content-Disposition response header field, but points out that it is not part of the HTTP/1.1 Standard. This specification takes over the definition and registration of Content-Disposition, as used in HTTP, and clarifies internationalization aspects. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6266"/>
          <seriesInfo name="DOI" value="10.17487/RFC6266"/>
        </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>
      </references>
    </references>
    <?line 715?>

<section anchor="informational-response">
      <name>Informational Response</name>
      <t>The server is allowed to respond to upload creation (<xref target="upload-creation"/>) requests with a <tt>104 (Upload Resumption Supported)</tt> intermediate response as soon as the server has validated the request. This way, the client knows that the server supports resumable uploads before the complete response is received. The benefit is the clients can defer starting the actual data transfer until the server indicates full support (i.e. resumable are supported, the provided upload URL is active etc).</t>
      <t>On the contrary, support for intermediate responses (the <tt>1XX</tt> range) in existing software is limited or not at all present. Such software includes proxies, firewalls, browsers, and HTTP libraries for clients and server. Therefore, the <tt>104 (Upload Resumption Supported)</tt> status code is optional and not mandatory for the successful completion of an upload. Otherwise, it might be impossible in some cases to implement resumable upload servers using existing software packages. Furthermore, as parts of the current internet infrastructure currently have limited support for intermediate responses, a successful delivery of a <tt>104 (Upload Resumption Supported)</tt> from the server to the client should be assumed.</t>
      <t>We hope that support for intermediate responses increases in the near future, to allow a wider usage of <tt>104 (Upload Resumption Supported)</tt>.</t>
    </section>
    <section anchor="changes-feature-detection">
      <name>Feature Detection</name>
      <t>This specification includes a section about feature detection (it was called service discovery in earlier discussions, but this name is probably ill-suited). The idea is to allow resumable uploads to be transparently implemented by HTTP clients. This means that application developers just keep using the same API of their HTTP library as they have done in the past with traditional, non-resumable uploads. Once the HTTP library gets updated (e.g. because mobile OS or browsers start implementing resumable uploads), the HTTP library can transparently decide to use resumable uploads without explicit configuration by the application developer. Of course, in order to use resumable uploads, the HTTP library needs to know whether the server supports resumable uploads. If no support is detected, the HTTP library should use the traditional, non-resumable upload technique. We call this process feature detection.</t>
      <t>Ideally, the technique used for feature detection meets following <strong>criteria</strong> (there might not be one approach which fits all requirements, so we have to prioritize them):</t>
      <ol spacing="normal" type="1"><li>
          <t>Avoid additional roundtrips by the client, if possible (i.e. an additional HTTP request by the client should be avoided).</t>
        </li>
        <li>
          <t>Be backwards compatible to HTTP/1.1 and existing network infrastructure: This means to avoid using new features in HTTP/2, or features which might require changes to existing network infrastructure (e.g. nginx or HTTP libraries)</t>
        </li>
        <li>
          <t>Conserve the user's privacy (i.e. the feature detection should not leak information to other third-parties about which URLs have been connected to)</t>
        </li>
      </ol>
      <t>Following <strong>approaches</strong> have already been considered in the past. All except the last approaches have not been deemed acceptable and are therefore not included in the specification. This follow list is a reference for the advantages and disadvantages of some approaches:</t>
      <t><strong>Include a support statement in the SETTINGS frame.</strong> The SETTINGS frame is a HTTP/2 feature and is sent by the server to the client to exchange information about the current connection. The idea was to include an additional statement in this frame, so the client can detect support for resumable uploads without an additional roundtrip. The problem is that this is not compatible with HTTP/1.1. Furthermore, the SETTINGS frame is intended for information about the current connection (not bound to a request/response) and might not be persisted when transmitted through a proxy.</t>
      <t><strong>Include a support statement in the DNS record.</strong> The client can detect support when resolving a domain name. Of course, DNS is not semantically the correct layer. Also, DNS might not be involved if the record is cached or retrieved from a hosts files.</t>
      <t><strong>Send a HTTP request to ask for support.</strong> This is the easiest approach where the client sends an OPTIONS request and uses the response to determine if the server indicates support for resumable uploads. An alternative is that the client sends the request to a well-known URL to obtain this response, e.g. <tt>/.well-known/resumable-uploads</tt>. Of course, while being fully backwards-compatible, it requires an additional roundtrip.</t>
      <t><strong>Include a support statement in previous responses.</strong> In many cases, the file upload is not the first time that the client connects to the server. Often additional requests are sent beforehand for authentication, data retrieval etc. The responses for those requests can also include a header field which indicates support for resumable uploads. There are two options:
- Use the standardized <tt>Alt-Svc</tt> response header field. However, it has been indicated to us that this header field might be reworked in the future and could also be semantically different from our intended usage.
- Use a new response header field <tt>Resumable-Uploads: https://example.org/files/*</tt> to indicate under which endpoints support for resumable uploads is available.</t>
      <t><strong>Send a 104 intermediate response to indicate support.</strong> The clients normally starts a traditional upload and includes a header field indicate that it supports resumable uploads (e.g. <tt>Upload-Offset: 0</tt>). If the server also supports resumable uploads, it will immediately respond with a 104 intermediate response to indicate its support, before further processing the request. This way the client is informed during the upload whether it can resume from possible connection errors or not. While an additional roundtrip is avoided, the problem with that solution is that many HTTP server libraries do not support sending custom 1XX responses and that some proxies may not be able to handle new 1XX status codes correctly.</t>
      <t><strong>Send a 103 Early Hint response to indicate support.</strong> This approach is the similar to the above one, with one exception: Instead of a new <tt>104 (Upload Resumption Supported)</tt> status code, the existing <tt>103 (Early Hint)</tt> status code is used in the intermediate response. The 103 code would then be accompanied by a header field indicating support for resumable uploads (e.g. <tt>Resumable-Uploads: 1</tt>). It is unclear whether the Early Hints code is appropriate for that, as it is currently only used to indicate resources for prefetching them.</t>
    </section>
    <section anchor="upload-metadata">
      <name>Upload Metadata</name>
      <t>When an upload is created (<xref target="upload-creation"/>), the <tt>Content-Type</tt> and <tt>Content-Disposition</tt> header fields are allowed to be included. They are intended to be a standardized way of communicating the file name and file type, if available. However, this is not without controversy. Some argue that since these header fields are already defined in other specifications, it is not necessary to include them here again. Furthermore, the <tt>Content-Disposition</tt> header field's format is not clearly enough defined. For example, it is left open which disposition value should be used in the header field. There needs to be more discussion whether this approach is suited or not.</t>
      <t>However, from experience with the tus project, users are often asking for a way to communicate the file name and file type. Therefore, we believe it is help to explicitly include an approach for doing so.</t>
    </section>
    <section anchor="faq">
      <name>FAQ</name>
      <ul spacing="normal">
        <li>
          <t><strong>Are multipart requests supported?</strong> Yes, requests whose content is encoded using the <tt>multipart/form-data</tt> are implicitly supported. The entire encoded content can be considered as a single file, which is then uploaded using the resumable protocol. The server, of course, must store the delimiter ("boundary") separating each part and must be able to parse the multipart format once the upload is completed.</t>
        </li>
      </ul>
    </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.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <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>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
