<?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.14 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-tus-httpbis-resumable-uploads-protocol-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title abbrev="Resumable Uploads">tus - Resumable Uploads Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-tus-httpbis-resumable-uploads-protocol-02"/>
    <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="July" day="25"/>
    <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. 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>
      <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 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-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>
      <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> use the Upload Cancellation Procedure (<xref target="upload-cancellation"/>) to cancel the upload after rejecting the offset.</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>SHOULD NOT</bcp14> automatically retry if a client error status code between 400 and 499 (inclusive) 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 (suggested value)</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="since-draft-tus-httpbis-resumable-uploads-protocol-01">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-01</name>
        <ul spacing="normal">
          <li>Clarifying backtracking and preventing skipping ahead during the Offset Receiving Procedure.</li>
          <li>Clients auto-retry 404 is no longer allowed.</li>
        </ul>
      </section>
      <section anchor="since-draft-tus-httpbis-resumable-uploads-protocol-00">
        <name>Since 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:
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
V4SwhJQAAA==

-->

</rfc>
