<?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.24 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-01"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit Ltd</organization>
      <address>
        <email>marius@transloadit.com</email>
      </address>
    </author>
    <author initials="G." surname="Zhang" fullname="Guoye Zhang" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>guoye_zhang@apple.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="02"/>
    <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>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-resumable-upload/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/resumable-upload"/>.</t>
    </note>
  </front>
  <middle>
    <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 an upload URL chosen by a server.</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 an upload URL chosen by a server.</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. An informational response can be sent to the client to signal the support of resumable upload on the server and transmit the upload URL in the Location header, which is used for identifying future requests related to this upload.</t>
        <figure anchor="fig-upload-creation-procedure">
          <name>Upload Creation Procedure</name>
          <artwork><![CDATA[
Client                                  Server
|                                            |
| POST                                       |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for upload
|                                            |------------------
|                                            |                 |
|                                            |<-----------------
|                                            |
|            104 Upload Resumption Supported |
|            with upload URL                 |
|<-------------------------------------------|
|                                            |
| 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 using the upload URL.</t>
        <figure anchor="fig-offset-retrieving-procedure">
          <name>Offset Retrieving Procedure</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| HEAD to upload URL                             |
|----------------------------------------------->|
|                                                |
|              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 to upload URL with 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 to upload URL                           |
|----------------------------------------------->|
|                                                |
|                   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. The client can include the first part of the file in the Upload Creation Procedure.</t>
        <figure anchor="fig-upload-creation-procedure-incomplete">
          <name>Upload Creation Procedure Incomplete</name>
          <artwork><![CDATA[
Client                                      Server
|                                                |
| POST with Upload-Incomplete                    |
|----------------------------------------------->|
|                                                |
|             201 Created with Upload-Incomplete |
|              and Location 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 to upload URL 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-Incomplete</tt> header field (<xref target="upload-incomplete"/>). It <bcp14>MUST</bcp14> be set to true if the end of the request body is not the end of the upload. Otherwise, it <bcp14>MUST</bcp14> be set to false. This header field can be used for request identification by a server. The request <bcp14>MUST NOT</bcp14> include the <tt>Upload-Offset</tt> header.</t>
      <t>If the request is valid, the server <bcp14>SHOULD</bcp14> create an upload resource. If so, the server <bcp14>MUST</bcp14> include the <tt>Location</tt> header in the response and set to the upload URL, which points to the created upload resource. The client <bcp14>MAY</bcp14> use this upload URL to execute the Offset Retrieving Procedure (<xref target="offset-retrieving"/>), Upload Appending Procedure (<xref target="upload-appending"/>), or Upload Cancellation Procedure (<xref target="upload-cancellation"/>).</t>
      <t>As soon as the upload resource is available, the server <bcp14>MAY</bcp14> send an informational response with <tt>104 (Upload Resumption Supported)</tt> status to the client while the request body is being uploaded. In this informational response, the <tt>Location</tt> header field <bcp14>MUST</bcp14> be set to the upload URL.</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-draft-interop-version: 3
upload-incomplete: ?0
content-length: 100
[content (100 bytes)]

:status: 104
upload-draft-interop-version: 3
location: https://example.com/upload/b530ce8ff

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

:status: 201
location: https://example.com/upload/b530ce8ff
upload-incomplete: ?1
upload-offset: 25
]]></sourcecode>
      <t>If the client received an informational repsonse with the upload URL, it <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 resource supports resumable uploads, 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 set to true if the server support is unclear. This allows the upload to function as if it is a regular upload.</t>
        <t>The server <bcp14>SHOULD</bcp14> send the <tt>104 (Upload Resumption Supported)</tt> informational response to the client, to indicate its support for a resumable upload.</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 3.</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 upload URL, as obtained from the Upload Creation Procedure (<xref target="upload-creation"/>). The client <bcp14>MUST NOT</bcp14> initiate this procedure without the knowledge of server support.</t>
      <t>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 upload URL 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 upload URL, which in the client perspective has failed. The server <bcp14>MAY</bcp14> terminate any transfers for the same upload URL 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 upload URL 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/b530ce8ff
upload-draft-interop-version: 3

:status: 204
upload-offset: 100
upload-incomplete: ?1
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 be sent to the upload URL, as obtained from the Upload Creation Procedure (<xref target="upload-creation"/>). 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 upload URL 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 upload URL 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 upload URL. Since the client is not allowed to perform multiple transfers in parallel, the server can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
      <t>If the offset 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 successful 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/b530ce8ff
upload-offset: 100
upload-draft-interop-version: 3
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 upload URL, as obtained from the Upload Creation Procedure (<xref target="upload-creation"/>). It is an indication that the client is no longer interested in uploading this body and the server can release resources associated with this upload URL. 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. 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 upload URL, 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 upload URL 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 upload URL 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/b530ce8ff
upload-draft-interop-version: 3

: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 request URL is not an upload URL (i.e. does not point to an upload resource): Upload Creation Procedure (<xref target="upload-creation"/>)</li>
        <li>The request URL is an upload URL and the method is <tt>HEAD</tt>: Offset Retrieving Procedure (<xref target="offset-retrieving"/>).</li>
        <li>The request URL is an upload URL and the method is <tt>DELETE</tt>: Upload Cancellation Procedure (<xref target="upload-cancellation"/>).</li>
        <li>The request URL is an upload URL and the <tt>Upload-Offset</tt> header is present: Upload Appending Procedure (<xref target="upload-appending"/>).</li>
        <li>Otherwise: Not a resumable upload.</li>
      </ol>
    </section>
    <section anchor="header-fields">
      <name>Header Fields</name>
      <section anchor="upload-offset">
        <name>Upload-Offset</name>
        <t>The <tt>Upload-Offset</tt> request and response header field 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>
        <t>The <tt>Upload-Incomplete</tt> header field <bcp14>MUST</bcp14> only by used if support by the resource is known to the client (<xref target="feature-detection"/>).</t>
      </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 upload URL obtained through the Upload Creation Procedure (<xref target="upload-creation"/>) is the identifier used for modifying the upload. Without further protection of this upload URL, an attacker may use the upload URL to obtain information about an upload, append data to it, or cancel it. To prevent this, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can perform the Offset Retrieving Procedure (<xref target="offset-retrieving"/>), Upload Appending Procedure (<xref target="upload-appending"/>), or Upload Cancellation Procedure (<xref target="upload-cancellation"/>) for a given upload URL and otherwise reject the procedure. In addition, the upload URL <bcp14>SHOULD</bcp14> be generated in such a way that makes it hard to be guessed by non-authorized clients.</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-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" initials="R. T." surname="Fielding">
            <organization>Adobe</organization>
          </author>
          <author fullname="Mark Nottingham" initials="M." surname="Nottingham">
            <organization>Fastly</organization>
          </author>
          <author fullname="Julian Reschke" initials="J." surname="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="since-draft-ietf-httpbis-resumable-upload-00">
      <name>Since draft-ietf-httpbis-resumable-upload-00</name>
      <ul spacing="normal">
        <li>Remove Upload-Token and instead use Server-generated upload URL for upload identification.</li>
        <li>Require the Upload-Incomplete header field in Upload Creation Procedure.</li>
        <li>Increase the draft interop version.</li>
      </ul>
      <section anchor="since-draft-tus-httpbis-resumable-uploads-protocol-02">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-02</name>
        <t>None</t>
      </section>
      <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 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 URL is active etc).</t>
      <t>On the contrary, support for intermediate responses (the <tt>1XX</tt> range) in existing software is limited or not at all present. Such software includes proxies, firewalls, browsers, and HTTP libraries for clients and server. Therefore, the <tt>104 (Upload Resumption Supported)</tt> status code is optional and not mandatory for the successful completion of an upload. Otherwise, it might be impossible in some cases to implement resumable upload servers using existing software packages. Furthermore, as parts of the current internet infrastructure currently have limited support for intermediate responses, a successful delivery of a <tt>104 (Upload Resumption Supported)</tt> from the server to the client should be assumed.</t>
      <t>We hope that support for intermediate responses increases in the near future, to allow a wider usage of <tt>104 (Upload Resumption Supported)</tt>.</t>
    </section>
    <section anchor="changes-feature-detection">
      <name>Feature Detection</name>
      <t>This specification includes a section about feature detection (it was called service discovery in earlier discussions, but this name is probably ill-suited). The idea is to allow resumable uploads to be transparently implemented by HTTP clients. This means that application developers just keep using the same API of their HTTP library as they have done in the past with traditional, non-resumable uploads. Once the HTTP library gets updated (e.g. because mobile OS or browsers start implementing resumable uploads), the HTTP library can transparently decide to use resumable uploads without explicit configuration by the application developer. Of course, in order to use resumable uploads, the HTTP library needs to know whether the server supports resumable uploads. If no support is detected, the HTTP library should use the traditional, non-resumable upload technique. We call this process feature detection.</t>
      <t>Ideally, the technique used for feature detection meets following <strong>criteria</strong> (there might not be one approach which fits all requirements, so we have to prioritize them):</t>
      <ol spacing="normal" type="1"><li>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 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 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 numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document is based on an Internet-Draft specification written by Jiten Mehta, Stefan Matsson, and the authors of this document.</t>
      <t>The <eref target="https://tus.io/">tus v1 protocol</eref> is a specification for a resumable file upload protocol over HTTP. It inspired the early design of this protocol. Members of the tus community helped significantly in the process of bringing this work to the IETF.</t>
      <t>TODO: more acknowledgements.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
PWOmEpQ3rjjv6n8B8CgUDRuZAAA=

-->

</rfc>
