<?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.6.11 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-tus-httpbis-resumable-uploads-protocol-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.10 -->
  <front>
    <title abbrev="Resumable Uploads">tus - Resumable Uploads Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-tus-httpbis-resumable-uploads-protocol-01"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl">
      <organization>Transloadit Ltd</organization>
      <address>
        <email>marius@transloadit.com</email>
      </address>
    </author>
    <author initials="J." surname="Mehta" fullname="Jiten Mehta">
      <organization>Apple Inc.</organization>
      <address>
        <email>jmehta@apple.com</email>
      </address>
    </author>
    <author initials="G." surname="Zhang" fullname="Guoye Zhang">
      <organization>Apple Inc.</organization>
      <address>
        <email>guoye_zhang@apple.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue">
      <organization>Cloudflare</organization>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <author initials="S." surname="Matsson" fullname="Stefan Matsson">
      <organization>JellyHive</organization>
      <address>
        <email>s.matsson@gmail.com</email>
      </address>
    </author>
    <date year="2022" month="June" day="16"/>
    <area>ART</area>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <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>Discussion Venues</name>
      <t>Discussion of this document takes place on the
  tus-v2 GitHub repository at
  <eref target="https://github.com/tus/tus-v2"/>.</t>
    </note>
  </front>
  <middle>
    <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 the Resumable Uploads Protocol, an optional mechanism for resumable uploads using HTTP 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 the send remaining data. Alternatively, they can cancel the upload entirely.</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>
      <t>The terms byte sequence, Item, string, sf-binary, sf-boolean, sf-integer, sf-string, and sf-token are imported from
<xref target="STRUCTURED-FIELDS"/>.</t>
      <t>The terms client and server are imported from <xref target="HTTP"/>.</t>
      <t>Upload: A sequence of one or more procedures, uniquely identified by a token chosen by a client.</t>
      <t>Procedure: An HTTP message exchange for that can be used for resumable uploads.</t>
    </section>
    <section anchor="uploading-overview">
      <name>Uploading Overview</name>
      <t>The Resumable Uploads Protocol consists of several procedures that rely on HTTP message exchanges. The following procedures are defined:</t>
      <ul spacing="normal">
        <li>Upload Creation Procedure (<xref target="upload-creation"/>)</li>
        <li>Offset Retrieving Procedure (<xref target="offset-retrieving"/>)</li>
        <li>Upload Appending Procedure (<xref target="upload-appending"/>)</li>
        <li>Upload Cancellation Procedure (<xref target="upload-cancellation"/>)</li>
      </ul>
      <t>A single upload is a sequence of one or more procedures. Each upload is uniquely
identified by a token chosen by a client. The token is carried in the Upload-Token header field; see <xref target="upload-token"/>.</t>
      <t>The remainder of this section uses examples of a file upload to illustrate permutations of procedure sequence. Note, however, that HTTP message exchanges use representation data (see <xref section="8.1" sectionFormat="of" target="HTTP"/>), which means that procedures can apply to many forms of content.</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. An interruption occurs and the client then attempts to resume the upload using subsequent HTTP requests.</t>
        <t>1) The Upload Creation Procedure (<xref target="upload-creation"/>) can be used to notify the server that the client wants to begin an upload. The server should then reserve the required resources to accept the upload from the client. The client also begins transferring the entire file in the request body. The request includes the Upload-Token header, which is used for identifying future requests related to this upload. An informational response can be sent to the client to signal the support of resumable upload on the server.</t>
        <figure anchor="fig-upload-creation-procedure">
          <name>Upload Creation Procedure</name>
          <artwork><![CDATA[
Client                                  Server
|                                            |
| POST with Upload-Token                     |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for Upload-Token
|                                            |------------------
|                                            |                 |
|                                            |<-----------------
|                                            |
|            104 Upload Resumption Supported |
|<-------------------------------------------|
|                                            |
| Flow Interrupted                           |
|------------------------------------------->|
|                                            |
]]></artwork>
        </figure>
        <t>2) If the connection to the server gets interrupted during the Upload Creation Procedure, the client may want to resume the upload. Before this is possible, the client must know the amount of data that the server was able to receive before the connection got interrupted. To achieve this, the client uses the Offset Retrieving Procedure (<xref target="offset-retrieving"/>) to obtain the upload's offset.</t>
        <figure anchor="fig-offset-retrieving-procedure">
          <name>Offset Retrieving Procedure</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| HEAD with Upload-Token                         |
|----------------------------------------------->|
|                                                |
|              204 No Content with Upload-Offset |
|<-----------------------------------------------|
|                                                |
]]></artwork>
        </figure>
        <t>3) After the Offset Retrieving Procedure (<xref target="offset-retrieving"/>) completes, the client can resume the upload by sending the remaining file content to the server using the Upload Appending Procedure (<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-procedure">
          <name>Upload Appending Procedure</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| PATCH with Upload-Token and Upload-Offset      |
|----------------------------------------------->|
|                                                |
|                      201 Created on completion |
|<-----------------------------------------------|
|                                                |
]]></artwork>
        </figure>
        <t>4) If the client is not interested in completing the upload anymore, it can instruct the server to delete the upload and free all related resources using the Upload Cancellation Procedure (<xref target="upload-cancellation"/>).</t>
        <figure anchor="fig-upload-cancellation-procedure">
          <name>Upload Cancellation Procedure</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| DELETE with Upload-Token                       |
|----------------------------------------------->|
|                                                |
|                   204 No Content on completion |
|<-----------------------------------------------|
|                                                |
]]></artwork>
        </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 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 over a sequence of procedures.</t>
        <t>1) If the client is aware that the server supports resumable upload, it can use the Upload Creation Procedure with the <tt>Upload-Incomplete</tt> header to start an upload.</t>
        <figure anchor="fig-upload-creation-procedure-incomplete">
          <name>Upload Creation Procedure Incomplete</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| POST with Upload-Token, Upload-Offset,         |
| and Upload-Incomplete                          |
|----------------------------------------------->|
|                                                |
|             201 Created with Upload-Incomplete |
|              on completion                     |
|<-----------------------------------------------|
|                                                |
]]></artwork>
        </figure>
        <t>2) After creation, the following parts are sent using the Upload Appending Procedure (<xref target="upload-appending"/>), and the last part of the upload does not have the <tt>Upload-Incomplete</tt> header.</t>
        <figure anchor="fig-upload-appending-procedure-last-chunk">
          <name>Upload Appending Procedure Last Chunk</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| PATCH with Upload-Token and Upload-Offset      |
|----------------------------------------------->|
|                                                |
|                      201 Created on completion |
|<-----------------------------------------------|
|                                                |
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="upload-creation">
      <name>Upload Creation Procedure</name>
      <t>The Upload Creation Procedure is intended for starting a new upload. A limited form of this procedure <bcp14>MAY</bcp14> be used by the client without the knowledge of server support of the Resumable Uploads Protocol.</t>
      <t>This procedure is designed to be compatible with a regular upload. Therefore all methods are allowed with the exception of <tt>GET</tt>, <tt>HEAD</tt>, <tt>DELETE</tt>, and <tt>OPTIONS</tt>. All response status codes are allowed. The client is <bcp14>RECOMMENDED</bcp14> to use the <tt>POST</tt> method if not otherwise intended. The server <bcp14>MAY</bcp14> only support a limited number of methods.</t>
      <t>The request <bcp14>MUST</bcp14> include the <tt>Upload-Token</tt> header field (<xref target="upload-token"/>) which uniquely identifies an upload. The client <bcp14>MUST NOT</bcp14> reuse the token for a different upload. The request <bcp14>MUST NOT</bcp14> include the <tt>Upload-Offset</tt> header.</t>
      <t>If the end of the request body is not the end of the upload, the <tt>Upload-Incomplete</tt> header field (<xref target="upload-incomplete"/>) <bcp14>MUST</bcp14> be set to true.</t>
      <t>If the server already has an active upload with the same token in the <tt>Upload-Token</tt> header field, it <bcp14>MUST</bcp14> respond with <tt>409 (Conflict)</tt> status code.</t>
      <t>The server <bcp14>MUST</bcp14> send the <tt>Upload-Offset</tt> header 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 response status code indicates a success but the offset in the <tt>Upload-Offset</tt> header field in the response does not equal to the 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 successful status code between 200 and 299 (inclusive). Server is <bcp14>RECOMMENDED</bcp14> to use <tt>201 (Created)</tt> response if not otherwise specified. The response <bcp14>MUST NOT</bcp14> include the <tt>Upload-Incomplete</tt> header with the value of true.</t>
      <t>If the request completes successfully but the entire upload is not yet complete indicated by the <tt>Upload-Incomplete</tt> header, the server <bcp14>MUST</bcp14> acknowledge it by responding with the <tt>201 (Created)</tt> status code, the <tt>Upload-Incomplete</tt> header set to true.</t>
      <sourcecode type="example"><![CDATA[
:method: POST
:scheme: https
:authority: example.com
:path: /upload
upload-token: :SGVs…SGU=:
upload-draft-interop-version: 2
content-length: 100
[content (100 bytes)]

:status: 104
upload-draft-interop-version: 2

:status: 201
upload-offset: 100
]]></sourcecode>
      <sourcecode type="example"><![CDATA[
:method: POST
:scheme: https
:authority: example.com
:path: /upload
upload-token: :SGVs…SGU=:
upload-draft-interop-version: 2
upload-offset: 0
upload-incomplete: ?1
content-length: 25
[partial content (25 bytes)]

:status: 201
upload-incomplete: ?1
upload-offset: 25
]]></sourcecode>
      <t>The client <bcp14>MAY</bcp14> automatically attempt upload resumption when the connection is terminated unexpectedly, or if a server error status code between 500 and 599 (inclusive) is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if a client error status code between 400 and 499 (inclusive) is received.</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 Upload Creation Procedure request that starts an upload. Servers <bcp14>MAY</bcp14> interpret this metadata or <bcp14>MAY</bcp14> ignore it. The <tt>Content-Type</tt> header can be used to indicate the MIME type of the file. The <tt>Content-Disposition</tt> header 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 server supports resumable upload, the Upload Creation Procedure <bcp14>MAY</bcp14> be used with some additional constraints. In particular, the <tt>Upload-Incomplete</tt> header field (<xref target="upload-incomplete"/>) <bcp14>MUST NOT</bcp14> be sent in the request if the server support is unclear. This allows the upload to function as if it is a regular upload.</t>
        <t>If the server detects the Upload Creation Procedure and it supports resumable upload, an informational response with <tt>104 (Upload Resumption Supported)</tt> status <bcp14>MAY</bcp14> be sent to the client while the request body is being uploaded.</t>
        <t>The client <bcp14>MUST NOT</bcp14> attempt to resume an upload if it did not receive the <tt>104 (Upload Resumption Supported)</tt> informational response, and it does not have other signals of whether the server supporting resumable upload.</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 2.</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. Its ABNF is</t>
        <sourcecode type="abnf"><![CDATA[
Upload-Draft-Interop-Version = sf-integer
]]></sourcecode>
        <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 Retrieving Procedure</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 server with the same <tt>Upload-Token</tt> header field (<xref target="upload-token"/>). The client <bcp14>MUST NOT</bcp14> initiate this procedure without the knowledge of server support.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>HEAD</tt> method and include the <tt>Upload-Token</tt> header. The request <bcp14>MUST NOT</bcp14> include the <tt>Upload-Offset</tt> header or the <tt>Upload-Incomplete</tt> header. The server <bcp14>MUST</bcp14> reject the request with the <tt>Upload-Offset</tt> header or the <tt>Upload-Incomplete</tt> header by sending a <tt>400 (Bad Request)</tt> response.</t>
      <t>If the server considers the upload associated with this token active, it <bcp14>MUST</bcp14> send back a <tt>204 (No Content)</tt> response. The response <bcp14>MUST</bcp14> include the <tt>Upload-Offset</tt> header set to the current resumption offset for the client. The response <bcp14>MUST</bcp14> include the <tt>Upload-Incomplete</tt> header which is set to true if and only if the upload is incomplete. An upload is considered complete if and only if the server completely and successfully received a corresponding Upload Creation Procedure (<xref target="upload-creation"/>) or Upload Appending Procedure (<xref target="upload-appending"/>) request with the <tt>Upload-Incomplete</tt> header being omitted or set to false.</t>
      <t>The client <bcp14>MUST NOT</bcp14> perform the Offset Retrieving Procedure (<xref target="offset-retrieving"/>) while the Upload Creation Procedure (<xref target="upload-creation"/>) or the Upload Appending Procedure (<xref target="upload-appending"/>) is in progress.</t>
      <t>The offset <bcp14>MUST</bcp14> be accepted by a subsequent Upload Appending Procedure (<xref target="upload-appending"/>). Due to network delay and reordering, the server might still be receiving data from an ongoing transfer for the same token, which in the client perspective has failed. The server <bcp14>MAY</bcp14> terminate any transfers for the same token 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 Upload Appending Procedures (<xref target="upload-appending"/>) based on the resumption offset from a single Offset Retrieving Procedure (<xref target="offset-retrieving"/>).</t>
      <t>The response <bcp14>SHOULD</bcp14> include <tt>Cache-Control: no-store</tt> header to prevent HTTP caching.</t>
      <t>If the server does not consider the upload associated with this token active, it <bcp14>MUST</bcp14> respond with <tt>404 (Not Found)</tt> status code.</t>
      <artwork><![CDATA[
:method: HEAD
:scheme: https
:authority: example.com
:path: /upload
upload-token: :SGVs…SGU=:
upload-draft-interop-version: 2

:status: 204
upload-offset: 100
cache-control: no-store
]]></artwork>
      <t>The client <bcp14>MAY</bcp14> automatically start uploading from the beginning using Upload Creation Procedure (<xref target="upload-creation"/>) if <tt>404 (Not Found)</tt> status code is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if a status code other than 204 and 404 is received.</t>
    </section>
    <section anchor="upload-appending">
      <name>Upload Appending Procedure</name>
      <t>The Upload Appending Procedure is used for resuming an existing upload.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>PATCH</tt> method and include the <tt>Upload-Token</tt> header. The <tt>Upload-Offset</tt> header field (<xref target="upload-offset"/>) <bcp14>MUST</bcp14> be set to the resumption offset.</t>
      <t>If the end of the request body is not the end of the upload, the <tt>Upload-Incomplete</tt> header field (<xref target="upload-incomplete"/>) <bcp14>MUST</bcp14> be set to true.</t>
      <t>The server <bcp14>SHOULD</bcp14> respect representation metadata received in the Upload Creation Procedure (<xref target="upload-creation"/>) and ignore any representation metadata received in the Upload Appending Procedure (<xref target="upload-appending"/>).</t>
      <t>If the server does not consider the upload associated with the token in the <tt>Upload-Token</tt> header field active, it <bcp14>MUST</bcp14> respond with <tt>404 (Not Found)</tt> status code.</t>
      <t>The client <bcp14>MUST NOT</bcp14> perform multiple upload transfers for the same token using Upload Creation Procedures (<xref target="upload-creation"/>) or Upload Appending Procedures (<xref target="upload-appending"/>) in parallel to 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 ongoing Upload Creation Procedure (<xref target="upload-creation"/>) or Upload Appending Procedure (<xref target="upload-appending"/>) for the same token. 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 in the <tt>Upload-Offset</tt> header field does not match the offset provided by the immediate previous Offset Retrieving Procedure (<xref target="offset-retrieving"/>), or the end offset of the immediate previous incomplete transfer, the server <bcp14>MUST</bcp14> respond with <tt>409 (Conflict)</tt> status code.</t>
      <t>The server <bcp14>MUST</bcp14> send the <tt>Upload-Offset</tt> header 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 response status code indicates a success but the offset in the <tt>Upload-Offset</tt> header field in the response does not equal to the 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 successful status code between 200 and 299 (inclusive). Server is <bcp14>RECOMMENDED</bcp14> to use <tt>201 (Created)</tt> response if not otherwise specified. The response <bcp14>MUST NOT</bcp14> include the <tt>Upload-Incomplete</tt> header with the value of true.</t>
      <t>If the request completes successfully but the entire upload is not yet complete indicated by the <tt>Upload-Incomplete</tt> header, the server <bcp14>MUST</bcp14> acknowledge it by responding with the <tt>201 (Created)</tt> status code, the <tt>Upload-Incomplete</tt> header set to true.</t>
      <sourcecode type="example"><![CDATA[
:method: PATCH
:scheme: https
:authority: example.com
:path: /upload
upload-token: :SGVs…SGU=:
upload-offset: 100
upload-draft-interop-version: 2
content-length: 100
[content (100 bytes)]

:status: 201
upload-offset: 200
]]></sourcecode>
      <t>The client <bcp14>MAY</bcp14> automatically attempt upload resumption when the connection is terminated unexpectedly, or if a server error status code between 500 and 599 (inclusive) is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if a client error status code between 400 and 499 (inclusive) is received.</t>
    </section>
    <section anchor="upload-cancellation">
      <name>Upload Cancellation Procedure</name>
      <t>If the client wants to terminate the transfer without the ability to resume, it <bcp14>MAY</bcp14> send a <tt>DELETE</tt> request to the server along with the <tt>Upload-Token</tt> which is an indication that the client is no longer interested in uploading this body and the server can release resources associated with this token. The client <bcp14>MUST NOT</bcp14> initiate this procedure without the knowledge of server support.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>DELETE</tt> method and include the <tt>Upload-Token</tt> header. The request <bcp14>MUST NOT</bcp14> include the <tt>Upload-Offset</tt> header or the <tt>Upload-Incomplete</tt> header. The server <bcp14>MUST</bcp14> reject the request with the <tt>Upload-Offset</tt> header or the <tt>Upload-Incomplete</tt> header by sending a <tt>400 (Bad Request)</tt> response.</t>
      <t>If the server has successfully deactivated this token, it <bcp14>MUST</bcp14> send back a <tt>204 (No Content)</tt> response.</t>
      <t>The server <bcp14>MAY</bcp14> terminate any ongoing Upload Creation Procedure (<xref target="upload-creation"/>) or Upload Appending Procedure (<xref target="upload-appending"/>) for the same token before sending the response by abruptly terminating the HTTP connection or stream.</t>
      <t>If the server does not consider the upload associated with this token active, it <bcp14>MUST</bcp14> respond with <tt>404 (Not Found)</tt> status code.</t>
      <t>If the server does not support cancellation, it <bcp14>MUST</bcp14> respond with <tt>405 (Method Not Allowed)</tt> status code.</t>
      <sourcecode type="example"><![CDATA[
:method: DELETE
:scheme: https
:authority: example.com
:path: /upload
upload-token: :SGVs…SGU=:
upload-draft-interop-version: 2

:status: 204
]]></sourcecode>
    </section>
    <section anchor="request-identification">
      <name>Request Identification</name>
      <t>The Upload Creation Procedure (<xref target="upload-creation"/>) supports arbitrary methods including <tt>PATCH</tt>, therefore it is not possible to identify the procedure of a request purely by its method. The following algorithm is <bcp14>RECOMMENDED</bcp14> to identify the procedure from a request for a generic implementation:</t>
      <ol spacing="normal" type="1"><li>The <tt>Upload-Token</tt> header is not present: Not a resumable upload.</li>
        <li>The <tt>Upload-Offset</tt> header is present: Upload Appending Procedure (<xref target="upload-appending"/>).</li>
        <li>The method is <tt>HEAD</tt>: Offset Retrieving Procedure (<xref target="offset-retrieving"/>).</li>
        <li>The method is <tt>DELETE</tt>: Upload Cancellation Procedure (<xref target="upload-cancellation"/>).</li>
        <li>Otherwise: Upload Creation Procedure (<xref target="upload-creation"/>).</li>
      </ol>
    </section>
    <section anchor="header-fields">
      <name>Header Fields</name>
      <section anchor="upload-token">
        <name>Upload-Token</name>
        <t>The <tt>Upload-Token</tt> request header field is an Item Structured Header (see <xref section="3.3" sectionFormat="of" target="STRUCTURED-FIELDS"/>) carrying the token used for identification of a specific upload. Its value <bcp14>MUST</bcp14> be a byte sequence. Its ABNF is</t>
        <sourcecode type="abnf"><![CDATA[
Upload-Token = sf-binary
]]></sourcecode>
        <t>If not otherwise specified by the server, the client is <bcp14>RECOMMENDED</bcp14> to use 256-bit (32 bytes) cryptographically-secure random binary data as the value of the <tt>Upload-Token</tt>, in order to ensure that it is globally unique and non-guessable.</t>
        <t>A conforming implementation <bcp14>MUST</bcp14> be able to handle a <tt>Upload-Token</tt> field value of at least 128 octets.</t>
      </section>
      <section anchor="upload-offset">
        <name>Upload-Offset</name>
        <t>The <tt>Upload-Offset</tt> request and response header field is an Item Structured Header indicating the resumption offset of corresponding upload, counted in bytes. Its value <bcp14>MUST</bcp14> be an integer. Its ABNF is</t>
        <sourcecode type="abnf"><![CDATA[
Upload-Offset = sf-integer
]]></sourcecode>
      </section>
      <section anchor="upload-incomplete">
        <name>Upload-Incomplete</name>
        <t>The <tt>Upload-Incomplete</tt> request and response header field is an Item Structured Header indicating whether the corresponding upload is considered complete. Its value <bcp14>MUST</bcp14> be a boolean. Its ABNF is</t>
        <sourcecode type="abnf"><![CDATA[
Upload-Incomplete = sf-boolean
]]></sourcecode>
      </section>
    </section>
    <section anchor="redirection">
      <name>Redirection</name>
      <t>The <tt>301 (Moved Permanently)</tt> status code and the <tt>302 (Found)</tt> status code <bcp14>MUST NOT</bcp14> be used in Offset Retrieving Procedure (<xref target="offset-retrieving"/>) and Upload Cancellation Procedure (<xref target="upload-cancellation"/>) responses. A <tt>308 (Permanent Redirect)</tt> response <bcp14>MAY</bcp14> be persisted for all subsequent procedures. If client receives a <tt>307 (Temporary Redirect)</tt> response in the Offset Retrieving Procedure (<xref target="offset-retrieving"/>), it <bcp14>MAY</bcp14> apply the redirection directly in the immediate subsequent Upload Appending Procedure (<xref target="upload-appending"/>).</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The tokens inside the <tt>Upload-Token</tt> header field can be selected by the client which has no knowledge of tokens picked by other client, so uniqueness cannot be guaranteed. If the token is guessable, an attacker can append malicious data to ongoing uploads. To mitigate these issues, 256-bit cryptographically-secure random binary data is recommended for the token.</t>
      <t>It is <bcp14>OPTIONAL</bcp14> for the server to partition upload tokens based on client identity established through other channels, such as Cookie or TLS client authentication. The client <bcp14>MAY</bcp14> relax the token strength if it is aware of server-side partitioning.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This specification registers the following entry in the Permanent Message Header Field Names registry established by <xref target="RFC3864"/>:</t>
      <t>Header field name: Upload-Token, Upload-Offset, Upload-Incomplete</t>
      <t>Applicable protocol: http</t>
      <t>Status: standard</t>
      <t>Author/change controller: IETF</t>
      <t>Specification: This document</t>
      <t>Related information: n/a</t>
      <t>This specification registers the following entry in the "HTTP Status Codes" registry:</t>
      <t>Code: 104</t>
      <t>Description: Upload Resumption Supported</t>
      <t>Specification: This document</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <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="HTTP">
        <front>
          <title>HTTP Semantics</title>
          <author fullname="Roy T. Fielding">
            <organization>Adobe</organization>
          </author>
          <author fullname="Mark Nottingham">
            <organization>Fastly</organization>
          </author>
          <author fullname="Julian Reschke">
            <organization>greenbytes GmbH</organization>
          </author>
          <date day="12" month="September" year="2021"/>
          <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.

 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="Internet-Draft" value="draft-ietf-httpbis-semantics-19"/>
      </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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <author fullname="P-H. Kamp" initials="P-H." surname="Kamp">
            <organization/>
          </author>
          <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="RFC3864">
        <front>
          <title>Registration Procedures for Message Header Fields</title>
          <author fullname="G. Klyne" initials="G." surname="Klyne">
            <organization/>
          </author>
          <author fullname="M. Nottingham" initials="M." surname="Nottingham">
            <organization/>
          </author>
          <author fullname="J. Mogul" initials="J." surname="Mogul">
            <organization/>
          </author>
          <date month="September" year="2004"/>
          <abstract>
            <t>This specification defines registration procedures for the message header fields used by Internet mail, HTTP, Netnews and other applications.  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="90"/>
        <seriesInfo name="RFC" value="3864"/>
        <seriesInfo name="DOI" value="10.17487/RFC3864"/>
      </reference>
    </references>
    <section anchor="changes">
      <name>Changes</name>
      <section anchor="draft-tus-httpbis-resumable-uploads-protocol-00">
        <name>draft-tus-httpbis-resumable-uploads-protocol-00</name>
        <ul spacing="normal">
          <li>Split the Upload Transfer Procedure into the Upload Creation Procedure and the Upload Appending Procedure.</li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
    <section numbered="false" anchor="appendix">
      <name>Appendix</name>
      <section numbered="false" anchor="informational-response">
        <name>Informational Response</name>
        <t>The server is allowed to respond to Upload Creation Procedure (<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 for the Upload Creation Procedure is received. The benefit is the clients can defer starting the actual data transfer until the server indicates full support of the incoming Upload Creation Procedure (i.e. resumable are supported, the provided upload token 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 numbered="false" anchor="feature-detection-1">
        <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>Avoid additional roundtrips by the client, if possible (i.e. an additional HTTP request by the client should be avoided).</li>
          <li>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)</li>
          <li>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)</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 which indicates support for resumable uploads. There are two options:
- Use the standardized <tt>Alt-Svc</tt> response header. However, it has been indicated to us that this header might be reworked in the future and could also be semantically different from our intended usage.
- Use a new response header <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 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 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 numbered="false" anchor="upload-metadata">
        <name>Upload Metadata</name>
        <t>The Upload Creation Procedure (<xref target="upload-creation"/>) allows the <tt>Content-Type</tt> and <tt>Content-Disposition</tt> header 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 headers 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. 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 numbered="false" anchor="faq">
        <name>FAQ</name>
        <ul spacing="normal">
          <li>
            <strong>Are multipart requests supported?</strong> Yes, requests whose body is encoded using the <tt>multipart/form-data</tt> are implicitly supported. The entire encoded body 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.</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1d63Ybx5H+j6folX6E4gEgkZITGxsnoSnKYla3iFRir09O
2JhpAGMNZpC5kIIV5eyj7K99kH2UfZKtW/d0zwxAgoovm7XOSQwCM32prq7L
V9XVo9FoUCVVaiaqqks1Uq9NWS/1NDXqzSrNdVyqV0Ve5VGeDvR0WpjLSfeR
QZxHmV5CG3GhZ9UIWhotqmo1TcpRYR8e1fzwaCXtjR4cDCJdmXlerCeqrOLB
IFkVMI6iLqvDBw8+e3A40IXRE3X0+nxwlRdv50Verybq6fn5q8Fbs4av4ok6
zSpTZKYaPca+B4Oy0ln8F53mGYxnbcpBudRF9Ze/1nllyonK8sEqmahvYAhD
VeZFVZhZCZ/WS/zw58FA19UiLyYDpUbwP6WSDN56Plb/lpokTukrnutzXSRA
Mu/7vJjrLPlOV0meTdR5obMSp5xU6hnMDp8wS52kE7WkV39XNU+Mo3wZdvn7
sXpuFpX2evx9UpnM+zbs72i1giU5zaKx39W3S3z8dxp/7Hby5Vj9+0Jnc6+T
L+t8bbxvb9LJHN/5y3f4zqaeno3VK13EtfG6elZHuvS/Dvs6TvM6nqXAA35f
Kb60onfGh4/Gv/rdHL/vdngG9NNVWeaZ1+NZZWY6C34I+/y9SdP10+Qy6LIc
L/kFr69BlhfwLTyJrPL6yfHhwcFn+BG5E7hy9HicmGrm9kEJbWVVEpXA5dms
eXcwGI1GSk9LYIYI2BdfV1GamKwqVT7DBTdZlNfI5TAx+P+iXlUmVrGutCIO
mpmiVEBIrXCzpRW8piKdRSaFxwrz19qU2FYBuzNfreC7KM8yE+GES1iVIoGf
qrxpHL4fKqAwNYSNrqBdGA+RCHh3rRb60qipwbG9i3DVTTxW5zk0vITFr4yq
FiYcIDaFX0IzSWFabQ4VbJHETjc2ZVKQeMFBlWVtVFlPS5xHVjXzqRa68prP
0jV1UOCaZXHTY9jVmNZHFTjmpq2yXq1AFMDzMAqgTmRWNHknvFScX2UsDmdF
vlSlKS4NUY2XCmaPr4IcrJc4SphDVCRTg4uyNEiipFzykKWv0mtcJCM3zQ1i
09JJXSbZnIY9ZmZZJnGcmsHgLsq+Io9rWsr/A6yzVxqj3r8/4wbUw/EhPobD
/vDhHkxrvqj+6VirNeeDR/6UP57vZNWXBpRWjIwcLXA9X708O8dle/XmHNcT
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

-->

</rfc>
