<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-09" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-09"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit</organization>
      <address>
        <email>marius@transloadit.com</email>
      </address>
    </author>
    <author initials="G." surname="Zhang" fullname="Guoye Zhang" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>guoye_zhang@apple.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2025" month="June" day="04"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>HTTP, upload, resumable</keyword>
    <abstract>
      <?line 70?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>Data transfer using the Hypertext Transfer Protocol (<xref target="HTTP"/>) is often interrupted by canceled requests or dropped connections. If the intended recipient can indicate how much of the data was received prior to interruption, a sender can resume data transfer at that point instead of attempting to transfer all of the data again. HTTP range requests (see <xref section="14" sectionFormat="of" target="HTTP"/>) support this concept of resumable data transfers for downloads from server to client.</t>
      <t>This specification defines a mechanism for resumable uploads from client to server in a way that is backwards-compatible with conventional HTTP uploads. When an upload is interrupted, clients can send subsequent requests to query the server state and use this information to send the remaining representation data. Alternatively, they can cancel the upload entirely. Unlike ranged downloads, this protocol does not support transferring an upload as multiple requests in parallel.</t>
      <t>Utilizing resumable uploads, applications can recover from unintended interruptions, but also interrupt an upload on purpose to later resume it, for example, when a user wants to pause an upload, the device's network connectivity changes, or bandwidth should be saved for higher priority tasks.</t>
      <t>The document introduces the concept of an upload resource to facilitate resumable uploads (<xref target="upload-resource"/>) and defines new header fields to communicate the state of the upload (<xref target="state"/>), the status code <tt>104 (Upload Resumption Supported)</tt> to indicate the server's support for resumable uploads (<xref target="status-code-104"/>), and the <tt>application/partial-upload</tt> media type to label partial representation data when resuming an upload (<xref target="media-type-partial-upload"/>).</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Some examples in this document contain long lines that may be folded, as described in <xref target="RFC8792"/>.</t>
      <t>The terms Structured Header, Item, Dictionary, String, Integer, and Boolean are imported from <xref target="STRUCTURED-FIELDS"/>.</t>
      <t>The terms "representation", "representation data", "representation metadata", "content", "client" and "server" are from <xref section="3" sectionFormat="of" target="HTTP"/>.</t>
      <t>The term "URI" is used as defined in <xref section="4" sectionFormat="of" target="HTTP"/>.</t>
      <t>The term "patch document" is taken from <xref target="PATCH"/>.</t>
      <t>An <em>upload resource</em> is a temporary resource on the server that facilitates the resumable upload of one representation (<xref target="upload-resource"/>).</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Resumable uploads are supported in HTTP through use of a temporary resource, an <em>upload resource</em> (<xref target="upload-resource"/>), that is separate from the resource being uploaded to and specific to that upload. By interacting with the upload resource, a client can retrieve the current offset of the upload (<xref target="offset-retrieving"/>), append to the upload (<xref target="upload-appending"/>), and cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>The remainder of this section uses examples to illustrate different interactions with the upload resource. HTTP message exchanges, and thereby resumable uploads, use representation data (see <xref section="8.1" sectionFormat="of" target="HTTP"/>). This means that resumable uploads can be used with many forms of content, such as static files, in-memory buffers, data from streaming sources, or on-demand generated data.</t>
      <section anchor="example-1">
        <name>Example 1: Complete upload of representation data with known size</name>
        <t>In this example, the client first attempts to upload representation data with a known size in a single HTTP request to the resource at <tt>/project/123/files</tt>. An interruption occurs and the client then attempts to resume the upload using subsequent HTTP requests to the upload resource at <tt>/uploads/abc</tt>.</t>
        <t>1) The client notifies the server that it wants to begin an upload (<xref target="upload-creation"/>). The server reserves the required resources to accept the upload from the client, and the client begins transferring the entire representation data in the request content.</t>
        <t>An interim response can be sent to the client, which signals the server's support of resumable upload as well as the upload resource's URI via the Location header field (<xref section="10.2.2" sectionFormat="of" target="HTTP"/>).</t>
        <figure anchor="fig-upload-creation">
          <name>Upload Creation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="520" viewBox="0 0 520 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,272" fill="none" stroke="black"/>
                <path d="M 368,48 L 368,272" fill="none" stroke="black"/>
                <path d="M 512,160 L 512,192" fill="none" stroke="black"/>
                <path d="M 16,96 L 360,96" fill="none" stroke="black"/>
                <path d="M 376,160 L 512,160" fill="none" stroke="black"/>
                <path d="M 376,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 16,256 L 360,256" fill="none" stroke="black"/>
                <path d="M 16,288 L 120,288" fill="none" stroke="black"/>
                <path d="M 256,288 L 360,288" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,192 372,186.4 372,197.6" fill="black" transform="rotate(180,376,192)"/>
                <polygon class="arrowhead" points="368,96 356,90.4 356,101.6" fill="black" transform="rotate(0,360,96)"/>
                <polygon class="arrowhead" points="24,256 12,250.4 12,261.6" fill="black" transform="rotate(180,16,256)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="348" y="36">Server</text>
                  <text x="36" y="68">POST</text>
                  <text x="132" y="68">/project/123/files</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="408" y="132">Reserve</text>
                  <text x="480" y="132">resources</text>
                  <text x="392" y="148">for</text>
                  <text x="436" y="148">upload</text>
                  <text x="120" y="228">104</text>
                  <text x="164" y="228">Upload</text>
                  <text x="236" y="228">Resumption</text>
                  <text x="320" y="228">Supported</text>
                  <text x="144" y="244">Location:</text>
                  <text x="236" y="244">/uploads/abc</text>
                  <text x="8" y="292">X</text>
                  <text x="140" y="292">Flow</text>
                  <text x="208" y="292">Interrupted</text>
                  <text x="368" y="292">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                  Server
|                                            |
| POST /project/123/files                    |
| Upload-Complete: ?1                        |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for upload
|                                            |-----------------.
|                                            |                 |
|                                            |<----------------'
|                                            |
|            104 Upload Resumption Supported |
|            Location: /uploads/abc          |
|<-------------------------------------------|
|                                            |
X--------------Flow Interrupted--------------X
]]></artwork>
          </artset>
        </figure>
        <t>2) If the connection to the server is interrupted, the client might want to resume the upload. However, before this is possible the client needs to know the amount of representation data that the server received before the interruption. It does so by retrieving the offset (<xref target="offset-retrieving"/>) from the upload resource.</t>
        <figure anchor="fig-offset-retrieving">
          <name>Offset Retrieval</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="416" viewBox="0 0 416 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,160" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,160" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">HEAD</text>
                  <text x="108" y="68">/uploads/abc</text>
                  <text x="280" y="116">204</text>
                  <text x="308" y="116">No</text>
                  <text x="352" y="116">Content</text>
                  <text x="324" y="132">Upload-Offset:</text>
                  <text x="392" y="132">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD /uploads/abc                               |
|------------------------------------------------>|
|                                                 |
|                                204 No Content   |
|                                Upload-Offset: X |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) The client can resume the upload by sending the remaining representation data to the upload resource (<xref target="upload-appending"/>), appending to the already stored representation data in the upload using the <tt>application/partial-upload</tt> media type. The <tt>Upload-Offset</tt> value is included to ensure that the client and server agree on the offset that the upload resumes from. Once the remaining representation data is transferred, the server processes the entire representation and responds with whatever the initial request to <tt>/project/123/files</tt> would have produced if it had not been interrupted, e.g. a <tt>200 (OK)</tt> response.</t>
        <figure anchor="fig-upload-appending">
          <name>Upload Append</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="416" viewBox="0 0 416 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,192" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <path d="M 16,176 L 400,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
                <polygon class="arrowhead" points="24,176 12,170.4 12,181.6" fill="black" transform="rotate(180,16,176)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">X</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="360" y="164">200</text>
                  <text x="388" y="164">OK</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?1                             |
| Upload-Offset: X                                |
| Content-Type: application/partial-upload        |
|------------------------------------------------>|
|                                                 |
|                                          200 OK |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can instruct the upload resource to delete the upload and free all related resources (<xref target="upload-cancellation"/>).</t>
        <figure anchor="fig-upload-cancellation">
          <name>Upload Cancellation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="416" viewBox="0 0 416 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,144" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,144" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="44" y="68">DELETE</text>
                  <text x="124" y="68">/uploads/abc</text>
                  <text x="296" y="116">204</text>
                  <text x="324" y="116">No</text>
                  <text x="368" y="116">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| DELETE /uploads/abc                             |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="example-2">
        <name>Example 2: Upload as a series of parts</name>
        <t>In some cases, clients might prefer to upload a representation as a series of parts sent serially across multiple HTTP messages. One use case is to overcome server limits on HTTP message content size. Another use case is where the client does not know the final size of the representation data, such as when the data originates from a streaming source.</t>
        <t>This example shows how the client, with prior knowledge about the server's resumable upload support, can upload parts of a representation incrementally.</t>
        <t>1) If the client is aware that the server supports resumable upload, it can start an upload with the <tt>Upload-Complete</tt> field value set to false and the first part of the representation.</t>
        <figure anchor="fig-upload-creation-incomplete">
          <name>Upload creation with partial representation data</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="416" viewBox="0 0 416 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,176" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,176" fill="none" stroke="black"/>
                <path d="M 16,96 L 400,96" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,96 396,90.4 396,101.6" fill="black" transform="rotate(0,400,96)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">POST</text>
                  <text x="132" y="68">/project/123/files</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?0</text>
                  <text x="320" y="132">201</text>
                  <text x="368" y="132">Created</text>
                  <text x="256" y="148">Location:</text>
                  <text x="348" y="148">/uploads/abc</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| POST /project/123/files                         |
| Upload-Complete: ?0                             |
|------------------------------------------------>|
|                                                 |
|                                     201 Created |
|                          Location: /uploads/abc |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>2) Subsequent, intermediate parts are appended (<xref target="upload-appending"/>) with the <tt>Upload-Complete</tt> field value set to false, indicating that they are not the last part of the representation data. The offset value in the <tt>Upload-Offset</tt> header field is taken from the previous response when creating the upload or appending to it.</t>
        <figure anchor="fig-upload-appending-incomplete">
          <name>Appending partial representation data to upload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="416" viewBox="0 0 416 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,192" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <path d="M 16,176 L 400,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
                <polygon class="arrowhead" points="24,176 12,170.4 12,181.6" fill="black" transform="rotate(180,16,176)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?0</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">X</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="296" y="164">204</text>
                  <text x="324" y="164">No</text>
                  <text x="368" y="164">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?0                             |
| Upload-Offset: X                                |
| Content-Type: application/partial-upload        |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) If the connection was interrupted, the client might want to resume the upload, similar to the previous example (<xref target="example-1"/>). The client retrieves the offset (<xref target="offset-retrieving"/>) to learn the amount of representation data received by the server and then continues appending the remaining parts to the upload as in the previous step.</t>
        <figure anchor="fig-upload-resume-incomplete">
          <name>Resuming an interrupted upload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="416" viewBox="0 0 416 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,304" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,304" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <path d="M 16,240 L 400,240" fill="none" stroke="black"/>
                <path d="M 16,288 L 400,288" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,240 396,234.4 396,245.6" fill="black" transform="rotate(0,400,240)"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,288 12,282.4 12,293.6" fill="black" transform="rotate(180,16,288)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">HEAD</text>
                  <text x="108" y="68">/uploads/abc</text>
                  <text x="296" y="116">204</text>
                  <text x="324" y="116">No</text>
                  <text x="368" y="116">Content</text>
                  <text x="324" y="132">Upload-Offset:</text>
                  <text x="392" y="132">Y</text>
                  <text x="40" y="180">PATCH</text>
                  <text x="116" y="180">/uploads/abc</text>
                  <text x="84" y="196">Upload-Complete:</text>
                  <text x="164" y="196">?0</text>
                  <text x="76" y="212">Upload-Offset:</text>
                  <text x="144" y="212">Y</text>
                  <text x="72" y="228">Content-Type:</text>
                  <text x="236" y="228">application/partial-upload</text>
                  <text x="296" y="276">204</text>
                  <text x="324" y="276">No</text>
                  <text x="368" y="276">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD /uploads/abc                               |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|                                Upload-Offset: Y |
|<------------------------------------------------|
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?0                             |
| Upload-Offset: Y                                |
| Content-Type: application/partial-upload        |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) The request to append the last part of the representation data has a <tt>Upload-Complete</tt> field value set to true to indicate the complete transfer. Once the remaining representation data is transferred, the server processes the entire representation and responds with whatever the initial request to <tt>/project/123/files</tt> would have produced if it had received the entire representation, e.g. a <tt>200 (OK)</tt> response.</t>
        <figure anchor="fig-upload-appending-last-chunk">
          <name>Appending remaining representation data</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="416" viewBox="0 0 416 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,192" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,192" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <path d="M 16,176 L 400,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
                <polygon class="arrowhead" points="24,176 12,170.4 12,181.6" fill="black" transform="rotate(180,16,176)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="76" y="84">Upload-Offset:</text>
                  <text x="144" y="84">Z</text>
                  <text x="84" y="100">Upload-Complete:</text>
                  <text x="164" y="100">?1</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="360" y="164">200</text>
                  <text x="388" y="164">OK</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Offset: Z                                |
| Upload-Complete: ?1                             |
| Content-Type: application/partial-upload        |
|------------------------------------------------>|
|                                                 |
|                                          200 OK |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="upload-resource">
      <name>Upload Resource</name>
      <t>A resumable upload is enabled through interaction with an upload resource. When a resumable upload begins, the server is asked to create an upload resource through a request to another resource (<xref target="upload-creation"/>). This upload resource is responsible for handling the upload of a representation. Using the upload resource, the client can query the upload progress (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>An upload resource is specific to the upload of one representation. For uploading multiple representations, multiple upload resources have to be used.</t>
      <t>The server can clean up an upload resource and make it inaccessible immediately after the upload is complete. However, if a client didn't receive the last response acknowledging the upload's completion and the upload resource is not available anymore, the client cannot verify the upload's state with the server. Therefore, the server <bcp14>SHOULD</bcp14> keep the upload resource available for a reasonable amount of time after the upload is complete.</t>
      <t>An upload resource <bcp14>SHOULD NOT</bcp14> reuse the URI from a previous upload resource, unless reasonable time has passed to ensure that no client will attempt to access the previous upload resource. Otherwise, a client might access the upload resource corresponding to a different representation than it intends to transfer.</t>
      <section anchor="state">
        <name>State</name>
        <t>The state of an upload consists of the following properties that are tracked by the upload resource.</t>
        <section anchor="upload-offset">
          <name>Offset</name>
          <t>The offset is the number of bytes from the representation data that have been received, either during the creation of the upload resource (<xref target="upload-creation"/>) and by appending to it (<xref target="upload-appending"/>). The offset can be retrieved from the upload resource (<xref target="offset-retrieving"/>) and is required when appending representation data (<xref target="upload-appending"/>) to synchronize the client and resource regarding the amount of transferred representation data.</t>
          <t>Representation data received by the upload resource cannot be removed again and, therefore, the offset <bcp14>MUST NOT</bcp14> decrease. If the upload resource loses representation data, the server <bcp14>MUST</bcp14> consider the upload resource invalid and reject further interaction with it.</t>
          <t>The <tt>Upload-Offset</tt> request and response header field conveys the offset. <tt>Upload-Offset</tt> is an Item Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a non-negative Integer (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>) and indicates the current offset as viewed by the message sender. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>The <tt>Upload-Offset</tt> header field in responses serves as an acknowledgement of the received representation data and as a guarantee that no retransmission of it will be necessary. Clients can use this guarantee to free resources associated to transferred representation data.</t>
        </section>
        <section anchor="upload-complete">
          <name>Completeness</name>
          <t>An upload is incomplete until it is explicitly marked as completed by the client. After this point, no representation data can be appended anymore.</t>
          <t>The <tt>Upload-Complete</tt> request and response header field conveys the completeness state. <tt>Upload-Complete</tt> is an Item Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a Boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>) and indicates whether the upload is complete or not. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>An upload is marked as completed if a request for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>) included the <tt>Upload-Complete</tt> header field with a true value and the request content was fully received.</t>
        </section>
        <section anchor="upload-length">
          <name>Length</name>
          <t>The length of an upload is the number of bytes of representation data that the client intends to upload.</t>
          <t>Even the client might not know the total length of the representation data when starting the transfer, for example, because the representation is taken from a streaming source. However, a client <bcp14>SHOULD</bcp14> communicate the length to the upload resource as soon as it becomes known. There are two different ways for the client to indicate and the upload resource to discover the length from requests for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>):</t>
          <ul spacing="normal">
            <li>
              <t>If the request includes the <tt>Upload-Complete</tt> field value set to true and a valid <tt>Content-Length</tt> header field, the request content is the remaining representation data. The length is then the sum of the current offset (<xref target="upload-offset"/>) and the <tt>Content-Length</tt> header field value.</t>
            </li>
            <li>
              <t>The request can include the <tt>Upload-Length</tt> request and response header field. <tt>Upload-Length</tt> is an Item Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a non-negative Integer (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>) and indicates the number of bytes of the entire representation data. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
            </li>
          </ul>
          <t>If both indicators are present in the same request, their indicated lengths <bcp14>MUST</bcp14> match. If multiple requests include indicators, their indicated values <bcp14>MUST</bcp14> match. A server can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#inconsistent-upload-length" (<xref target="inconsistent-length"/>) in responses to indicate inconsistent length values.</t>
          <t>The upload resource might not know the length until the upload is complete.</t>
          <t>Note that the length and offset values do not determine whether an upload is complete. Instead, the client uses the <tt>Upload-Complete</tt> (<xref target="upload-complete"/>) header field to indicate that a request completes the upload. The offset could match the length, but the upload can still be incomplete.</t>
        </section>
        <section anchor="upload-limit">
          <name>Limits</name>
          <t>An upload resource <bcp14>MAY</bcp14> enforce one or multiple limits, which are communicated to the client via the <tt>Upload-Limit</tt> response header field. <tt>Upload-Limit</tt> is a Dictionary Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a Dictionary (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>). Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>The following key-value pairs are defined:</t>
          <ul spacing="normal">
            <li>
              <t>The value under the <tt>max-size</tt> key specifies a maximum size for the representation data, counted in bytes. The server might not create an upload resource if the length (<xref target="upload-length"/>) deduced from the upload creation request is larger than the maximum size. The upload resource can stop the upload if the offset (<xref target="upload-offset"/>) exceeds the maximum size. The value is an Integer.</t>
            </li>
            <li>
              <t>The value under the <tt>min-size</tt> key specifies a minimum size for the representation data, counted in bytes. The server might not create an upload resource if the length (<xref target="upload-length"/>) deduced from the upload creation request is smaller than the minimum size or no length can be deduced at all. The value is an Integer.</t>
            </li>
            <li>
              <t>The value under the <tt>max-append-size</tt> key specifies a maximum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server might reject requests exceeding this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send larger upload append requests. The value is an Integer.</t>
            </li>
            <li>
              <t>The value under the <tt>min-append-size</tt> key specifies a minimum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server might reject requests below this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send smaller upload append requests. The value is an Integer. Requests completing the upload by including the <tt>Upload-Complete: ?1</tt> header field are exempt from this limit.</t>
            </li>
            <li>
              <t>The value under the <tt>max-age</tt> key specifies the remaining lifetime of the upload resource in seconds counted from the generation of the response. After the resource's lifetime is reached, the server might make the upload resource inaccessible and a client <bcp14>SHOULD NOT</bcp14> attempt to access the upload resource as these requests will likely fail. The lifetime <bcp14>MAY</bcp14> be extended but <bcp14>SHOULD NOT</bcp14> be reduced unless the server makes the upload resource immediately inaccessible. The value is an Integer.</t>
            </li>
          </ul>
          <t>Except for the <tt>max-age</tt> limit, the existence of a limit or its value <bcp14>MUST NOT</bcp14> change throughout the lifetime of the upload resource.</t>
          <t>When parsing the <tt>Upload-Limit</tt> header field, unrecognized keys <bcp14>MUST</bcp14> be ignored and <bcp14>MUST NOT</bcp14> fail the parsing to facilitate the addition of new limits in the future. Keys with values other than defined here <bcp14>MUST</bcp14> be ignored.</t>
          <t>A server that supports the creation of a resumable upload resource (<xref target="upload-creation"/>) for a target URI <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits in a response to an <tt>OPTIONS</tt> request sent to this target URI. If a server supports the creation of upload resources for any target URI, it <bcp14>SHOULD</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits in a response to an <tt>OPTIONS</tt> request with the <tt>*</tt> target unless the server is not capable of handling <tt>OPTIONS *</tt> requests. If the server does not apply any limits, it <bcp14>MUST</bcp14> use <tt>min-size=0</tt> instead of an empty header value.</t>
          <t>A client can use an <tt>OPTIONS</tt> request to discover support for resumable uploads and potential limits before creating an upload resource. To reduce the liklihood of failing requests, the limits announced in an <tt>OPTIONS</tt> response <bcp14>SHOULD NOT</bcp14> be less restrictive than the limits applied to an upload once the upload resource has been created, unless the request to create an upload resource included additional information that warrants different limits. For example, a server might announce a general maximum size limit of 1GB, but reduce it to 100MB when the media type indicates an image.</t>
        </section>
      </section>
      <section anchor="upload-creation">
        <name>Upload Creation</name>
        <section anchor="client-behavior">
          <name>Client Behavior</name>
          <t>A client can start a resumable upload from any request that can carry content by including the <tt>Upload-Complete</tt> header field (<xref target="upload-complete"/>). As a consequence, all request methods that allow content are possible, such as <tt>POST</tt>, <tt>PUT</tt>, and <tt>PATCH</tt>.</t>
          <t>The <tt>Upload-Complete</tt> header field is set to true if the request content includes the entire representation data that the client intends to upload. This is also a requirement for transparently upgrading to resumable uploads from traditional uploads (<xref target="upgrading-uploads"/>).</t>
          <t>If the client knows the representation data's length, it <bcp14>SHOULD</bcp14> include the <tt>Upload-Length</tt> header field (<xref target="upload-length"/>) in the request to help the server allocate necessary resources for the upload and provide early feedback if the representation violates a limit (<xref target="upload-limit"/>).</t>
          <t>The client <bcp14>SHOULD</bcp14> respect any limits (<xref target="upload-limit"/>) announced in the <tt>Upload-Limit</tt> header field in interim or final responses. In particular, if the allowed maximum size is less than the amount of representation data the client intends to upload, the client <bcp14>SHOULD</bcp14> stop the current request immediately and cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The request content can be empty. If the <tt>Upload-Complete</tt> header field is then set to true, the client intends to upload an empty representation. An <tt>Upload-Complete</tt> header field is set to false is also valid. This can be used to retrieve the upload resource's URI before transferring any representation data. Since interim responses are optional, this technique provides another mechanism to learn the URI, at the cost of an additional round-trip before data upload can commence.</t>
          <t>Representation metadata included in the initial request (see <xref section="8.3" sectionFormat="of" target="HTTP"/>) can affect how servers act on the uploaded representation data. The <tt>Content-Type</tt> header field (<xref section="8.3" sectionFormat="of" target="HTTP"/>) indicates the media type of the representation. The <tt>Content-Disposition</tt> header field (<xref target="CONTENT-DISPOSITION"/>) can be used to transmit a filename. The <tt>Content-Encoding</tt> header field (<xref section="8.4" sectionFormat="of" target="HTTP"/>) names the content codings applied to the representation.</t>
          <t>If the client received a final response with a</t>
          <ul spacing="normal">
            <li>
              <t><tt>2xx (Successful)</tt> status code and the entire representation data was transferred in the request content, the upload is complete and the response belongs to the targeted resource processing the representation.</t>
            </li>
            <li>
              <t><tt>2xx (Successful)</tt> status code and not the entire representation data was transferred in the request content, the <tt>Location</tt> response header field points the client to the created upload resource. The client can continue appending representation data to it (<xref target="upload-appending"/>).</t>
            </li>
            <li>
              <t><tt>4xx (Client Error)</tt> status code, the client <bcp14>SHOULD NOT</bcp14> attempt to retry or resume the upload, unless the semantics of the response allow or recommend the client to retry the request.</t>
            </li>
            <li>
              <t><tt>5xx (Server Error)</tt> status code or no final response at all due to connectivity issues, the client <bcp14>MAY</bcp14> automatically attempt upload resumption by retrieving the current offset (<xref target="offset-retrieving"/>) if it received the URI of the upload resource in a <tt>104 (Upload Resumption Supported)</tt> interim response.</t>
            </li>
          </ul>
        </section>
        <section anchor="server-behavior">
          <name>Server Behavior</name>
          <t>Upon receiving a request with the <tt>Upload-Complete</tt> header field, the server can choose to offer resumption support by creating an upload resource. If so, it <bcp14>SHOULD</bcp14> announce the upload resource by sending an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Location</tt> header field pointing to the upload resource unless the server is not capable of sending interim responses. The interim response <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits (<xref target="upload-limit"/>) if existing. The interim response allows the client to resume the upload even if the message exchange gets later interrupted.</t>
          <t>The resource targeted by this initial request is responsible for processing the representation data transferred in the resumable upload according to the method and header fields in the initial request, while the upload resource enables resuming the transfer.</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to true, the client intends to transfer the entire representation data in one request. If the request content was fully received, no resumable upload is needed and the resource proceeds to process the request and generate a response.</t>
          <t>If the <tt>Upload-Complete</tt> header field is set to false, the client intends to transfer the representation over multiple requests. If the request content was fully received, the server <bcp14>MUST</bcp14> announce the upload resource by referencing it in the <tt>Location</tt> response header field. Servers are <bcp14>RECOMMENDED</bcp14> to use the <tt>201 (Created)</tt> status code. The response <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits if existing.</t>
          <t>The server <bcp14>MUST</bcp14> record the length according to <xref target="upload-length"/> if the necessary header fields are included in the request.</t>
          <t>While the request content is being received, the server <bcp14>MAY</bcp14> send additional interim responses with a <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Upload-Offset</tt> header field set to the current offset to inform the client about the upload progress. These interim responses <bcp14>MUST NOT</bcp14> include the <tt>Location</tt> header field.</t>
          <t>If the server does not receive the entire request content, for example because of canceled requests or dropped connections, it <bcp14>SHOULD</bcp14> append as much of the request content as possible to the upload resource. The upload resource <bcp14>MUST NOT</bcp14> be considered complete then.</t>
        </section>
        <section anchor="upload-creation-example">
          <name>Examples</name>
          <t>A) The following example shows an upload creation, where the entire 100 bytes are transferred in the initial request. The server sends multiple interim responses and one final response from processing the uploaded representation.</t>
          <sourcecode type="http-message"><![CDATA[
POST /project/123/files HTTP/1.1
Host: example.com
Upload-Complete: ?1
Content-Length: 100
Upload-Length: 100

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

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

HTTP/1.1 200 OK
Location: https://example.com/upload/b530ce8ff
Upload-Limit: max-size=1000000000
Content-Type: application/json

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

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

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

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

HTTP/1.1 500 Internal Server Error
]]></sourcecode>
          <t>D) The following example shows an upload creation being rejected by the server. The client cannot continue the upload.</t>
          <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Complete: ?1
Content-Length: 100
Upload-Length: 100

[content (100 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 400 Bad Request
]]></sourcecode>
        </section>
      </section>
      <section anchor="offset-retrieving">
        <name>Offset Retrieval</name>
        <section anchor="client-behavior-1">
          <name>Client Behavior</name>
          <t>If the client wants to resume the upload after an interruption, it has to know the amount of representation data received by the upload resource so far. It can fetch the offset by sending a <tt>HEAD</tt> request to the upload resource. Upon a successful response, the client can continue the upload by appending representation data (<xref target="upload-appending"/>) starting at the offset indicated by the <tt>Upload-Offset</tt> response header field.</t>
          <t>The offset can be less than or equal to the number of bytes of representation data that the client has already sent. The client <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 representation data it has already sent, the upload <bcp14>MUST</bcp14> be considered a failure. The client <bcp14>SHOULD</bcp14> cancel the upload (<xref target="upload-cancellation"/>) after rejecting the offset.</t>
          <t>The client <bcp14>MUST NOT</bcp14> perform offset retrieval while creation (<xref target="upload-creation"/>) or appending (<xref target="upload-appending"/>) is in progress as this can cause the previous request to be terminated by the server as described in <xref target="concurrency"/>.</t>
          <t>If the client received a response with a</t>
          <ul spacing="normal">
            <li>
              <t><tt>2xx (Successful)</tt> status code, the client can continue appending representation data to it (<xref target="upload-appending"/>) if the upload is not complete yet.</t>
            </li>
            <li>
              <t><tt>307 (Temporary Redirect)</tt> or <tt>308 (Permanent Redirect)</tt> status code, the client <bcp14>MAY</bcp14> retry retrieving the offset from the new URI.</t>
            </li>
            <li>
              <t><tt>4xx (Client Error)</tt> status code, the client <bcp14>SHOULD NOT</bcp14> attempt to retry or resume the upload, unless the semantics of the response allow or recommend the client to retry the request.</t>
            </li>
            <li>
              <t><tt>5xx (Server Error)</tt> status code or no final response at all due to connectivity issues, the client <bcp14>MAY</bcp14> retry retrieving the offset.</t>
            </li>
          </ul>
        </section>
        <section anchor="server-behavior-1">
          <name>Server Behavior</name>
          <t>A successful response to a <tt>HEAD</tt> request against an upload resource</t>
          <ul spacing="normal">
            <li>
              <t><bcp14>MUST</bcp14> include the offset in the <tt>Upload-Offset</tt> header field (<xref target="upload-offset"/>),</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> include the completeless state in the <tt>Upload-Complete</tt> header field (<xref target="upload-complete"/>),</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> include the length in the <tt>Upload-Length</tt> header field if known (<xref target="upload-length"/>),</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> indicate the limits in the <tt>Upload-Limit</tt> header field (<xref target="upload-limit"/>), and</t>
            </li>
            <li>
              <t><bcp14>SHOULD</bcp14> include the <tt>Cache-Control</tt> header field with the value <tt>no-store</tt> to prevent HTTP caching (<xref target="CACHING"/>).</t>
            </li>
          </ul>
          <t>The resource <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes because clients might follow the redirect without preserving the <tt>HEAD</tt> method.</t>
        </section>
        <section anchor="offset-retrieving-example">
          <name>Example</name>
          <t>A) The following example shows an offset retrieval request. The server indicates the current offset and that the upload is not complete yet. The client can continue to append representation data.</t>
          <sourcecode type="http-message"><![CDATA[
HEAD /upload/b530ce8ff HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Offset: 100
Upload-Complete: ?0
Upload-Length: 500
Upload-Limit: max-age=3600
Cache-Control: no-store
]]></sourcecode>
          <t>B) The following example shows on offset retrieval request for a completed upload. The client does not need to continue the upload.</t>
          <sourcecode type="http-message"><![CDATA[
HEAD /upload/b530ce8ff HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Offset: 500
Upload-Complete: ?1
Upload-Length: 500
Cache-Control: no-store
]]></sourcecode>
        </section>
      </section>
      <section anchor="upload-appending">
        <name>Upload Append</name>
        <section anchor="client-behavior-2">
          <name>Client Behavior</name>
          <t>A client can continue the upload and append representation data by sending a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) to the upload resource. The request content is the representation data to append.</t>
          <t>The client <bcp14>MUST</bcp14> indicate the offset of the request content inside the representation data by including the <tt>Upload-Offset</tt> request header field. To ensure that the upload resource will accept request, the offset <bcp14>SHOULD</bcp14> be taken from an immediate previous response for retrieving the offset (<xref target="offset-retrieving"/>) or appending representation data (<xref target="upload-appending"/>).</t>
          <t>The request <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field. Its value is true if the end of the request content is the end of the representation data. If the content is then fully received by the upload resource, the upload will be complete.</t>
          <t>The request content can be empty. If the <tt>Upload-Complete</tt> field is then set to true, the client wants to complete the upload without appending additional representation data.</t>
          <t>If the client received a final response with a</t>
          <ul spacing="normal">
            <li>
              <t><tt>2xx (Successful)</tt> status code and the remaining representation data was transferred in the request content, the upload is complete and the corresponding response belongs to the resource processing the representation according to the initial request (see <xref target="upload-creation"/>).</t>
            </li>
            <li>
              <t><tt>2xx (Successful)</tt> status code and not the entire remaining representation data was transferred in the request content, the client can continue appending representation data.</t>
            </li>
            <li>
              <t><tt>307 (Temporary Redirect)</tt> or <tt>308 (Permanent Redirect)</tt> status code, the client <bcp14>MAY</bcp14> retry appending to the new URI.</t>
            </li>
            <li>
              <t><tt>4xx (Client Error)</tt> status code, the client <bcp14>SHOULD NOT</bcp14> attempt to retry or resume the upload, unless the semantics of the response allow or recommend the client to retry the request.</t>
            </li>
            <li>
              <t><tt>5xx (Server Error)</tt> status code or no final response at all due to connectivity issues, the client <bcp14>MAY</bcp14> automatically attempt upload resumption by retrieving the current offset (<xref target="offset-retrieving"/>).</t>
            </li>
          </ul>
        </section>
        <section anchor="server-behavior-2">
          <name>Server Behavior</name>
          <t>An upload resource applies a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) by appending the patch document in the request content to the upload resource.</t>
          <t>If the upload resource does not receive the entire patch document, for example because of canceled requests or dropped connections, it <bcp14>SHOULD</bcp14> append as much of the patch document as possible, starting at its beginning and without discontinuities. Appending a continuous section starting at the patch document's beginning constitutes a successful PATCH as defined in <xref section="2" sectionFormat="of" target="PATCH"/>.</t>
          <t>If the <tt>Upload-Offset</tt> request header field value does not match the current offset (<xref target="upload-offset"/>), the upload resource <bcp14>MUST</bcp14> reject the request with a <tt>409 (Conflict)</tt> status code. The response <bcp14>MUST</bcp14> include the correct offset in the <tt>Upload-Offset</tt> header field. The response can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" (<xref target="mismatching-offset"/>).</t>
          <t>If the upload is already complete (<xref target="upload-complete"/>), the server <bcp14>MUST NOT</bcp14> modify the upload resource and <bcp14>MUST</bcp14> reject the request. The server can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#completed-upload" in the response (<xref target="completed-upload"/>).</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to true, the client intends to transfer the remaining representation data in one request. If the request content was fully received, the upload is marked as complete and the upload resource <bcp14>SHOULD</bcp14> generate the response that matches what the resource, that was targeted by the initial upload creation (<xref target="upload-creation"/>), would have generated if it had received the entire representation in the initial request. However, the response <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field with a true value, allowing clients to identify whether a response, in particular error responses, is related to the resumable upload itself or the processing of the upload representation.</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to false, the client intends to transfer the remaining representation over multiple requests. If the request content was fully received, the upload resource acknowledges the appended data by sending a <tt>2xx (Successful)</tt> response.</t>
          <t>If the request didn't complete the upload, any response, successful or not, <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field with a false value, indicating that this response does not belong to the processing of the uploaded representation.</t>
          <t>The upload resource <bcp14>MUST</bcp14> record the length according to <xref target="upload-length"/> if the necessary header fields are included in the request. If the length is known, the upload resource <bcp14>MUST</bcp14> prevent the offset from exceeding the upload length by stopping to append bytes once the offset reaches the length, rejecting the request, marking the upload resource invalid and rejecting any further interaction with it. It is not sufficient to rely on the <tt>Content-Length</tt> header field for enforcement because the header field might not be present.</t>
          <t>While the request content is being received, the server <bcp14>SHOULD</bcp14> send interim responses with a <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Upload-Offset</tt> header field set to the current offset to inform the client about the upload progress. These interim responses <bcp14>MUST NOT</bcp14> include the <tt>Location</tt> header field.</t>
        </section>
        <section anchor="upload-appending-example">
          <name>Example</name>
          <t>A) The following example shows an upload append request. The client transfers the next 100 bytes at an offset of 100 and does not indicate that the upload is then completed. The server generates one interim response and finally acknowledges the new offset:</t>
          <sourcecode type="http-message"><![CDATA[
PATCH /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Complete: ?0
Upload-Offset: 100
Content-Length: 100
Content-Type: application/partial-upload

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

HTTP/1.1 204 No Content
Upload-Complete: ?0
]]></sourcecode>
          <t>B) The next example shows an upload append, where the client transfers the remaining 200 bytes and completes the upload. The server processes the uploaded representation and generates the responding response, in this example containing extracted meta data:</t>
          <sourcecode type="http-message"><![CDATA[
PATCH /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Complete: ?1
Upload-Offset: 200
Content-Length: 100
Content-Type: application/partial-upload

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

{
  "metadata": {
    [...]
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="upload-cancellation">
        <name>Upload Cancellation</name>
        <section anchor="client-behavior-3">
          <name>Client Behavior</name>
          <t>If the client wants to terminate the transfer without the ability to resume, it can send a <tt>DELETE</tt> request to the upload resource. Doing so is an indication that the client is no longer interested in continuing the upload, and that the server can release any resources associated with it.</t>
        </section>
        <section anchor="server-behavior-3">
          <name>Server Behavior</name>
          <t>Upon receiving a <tt>DELETE</tt> request, the server <bcp14>SHOULD</bcp14> deactivate the upload resource.</t>
          <t>The server <bcp14>SHOULD</bcp14> terminate any in-flight requests to the upload resource before sending the response by abruptly terminating their HTTP connection(s) or stream(s) as described in <xref target="concurrency"/>.</t>
          <t>The resource <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes because clients might follow the redirect without preserving the <tt>DELETE</tt> method.</t>
        </section>
        <section anchor="upload-cancellation-example">
          <name>Example</name>
          <t>The following example shows an upload cancellation:</t>
          <sourcecode type="http-message"><![CDATA[
DELETE /upload/b530ce8ff HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
]]></sourcecode>
        </section>
      </section>
      <section anchor="concurrency">
        <name>Concurrency</name>
        <t>Resumable uploads, as defined in this document, do not permit uploading representation data in parallel to the same upload resource. The client <bcp14>MUST NOT</bcp14> perform multiple representation data transfers for the same upload resource in parallel.</t>
        <t>Even if the client is well behaving and doesn't send concurrent requests, network interruptions can occur in such a way that the client considers a request as failed while the server is unaware of the problem and considers the request still ongoing. The client might then try to resume the upload with the best intentions, resulting in concurrent requests from the server's perspective. Therefore, the server <bcp14>MUST</bcp14> take measures to prevent race conditions, data loss and corruption from concurrent requests to append representation data (<xref target="upload-appending"/>) and/or cancellation (<xref target="upload-cancellation"/>) to the same upload resource. In addition, the server <bcp14>MUST NOT</bcp14> send outdated information in responses when retrieving the offset (<xref target="offset-retrieving"/>). This means that the offset sent by the server <bcp14>MUST</bcp14> be accepted in a subsequent request to append representation data if no other request to append representation data or cancel was received in the meantime. In other words, clients have to be able to use received offsets.</t>
        <t>The <bcp14>RECOMMENDED</bcp14> approach is as follows: If an upload resource receives a new request to retrieve the offset (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>) while a previous request for creating the upload (<xref target="upload-creation"/>) or appending representation data (<xref target="upload-appending"/>) is still ongoing, the resource <bcp14>SHOULD</bcp14> prevent race conditions, data loss, and corruption by terminating the previous request before processing the new request. Due to network delay and reordering, the resource might still be receiving representation data from an ongoing transfer for the same upload resource, which in the client's perspective has failed. Since the client is not allowed to perform multiple transfers in parallel, the upload resource can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
        <t>Since implementing this approach is not always technically possible or feasible, other measures can be considered as well. A simpler approach is that the server only processes a new request to retrieve the offset (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancellation (<xref target="upload-cancellation"/>) once all previous requests have been processed. This effectively implements exclusive access to the upload resource through an access lock. However, since network interruptions can occur in ways that cause the request to hang from the server's perspective, it might take the server significant time to realize the interruption and time out the request. During this period, the client will be unable to access the resource and resume the upload, causing friction for the end users. Therefore, the recommended approach is to terminate previous requests to enable quick resumption of uploads.</t>
      </section>
    </section>
    <section anchor="status-code-104">
      <name>Status Code <tt>104 (Upload Resumption Supported)</tt></name>
      <t>The <tt>104 (Upload Resumption Supported)</tt> status code is can be used for two purposes:</t>
      <ul spacing="normal">
        <li>
          <t>When responding to requests to create uploads, an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code can be sent to indicate the server's support for resumable uploads, as well as the URI and limits of the corresponding upload resource in the <tt>Location</tt> and <tt>Upload-Limit</tt> header fields, respectively (see <xref target="upload-creation"/>). This notifies the client early about the ability to resume the upload in case of network interruptions.</t>
        </li>
        <li>
          <t>While processing the content of a request to append representation data or create an upload, the server can regularly send interim responses with the <tt>104 (Upload Resumption Supported)</tt> status code to indicate the current upload progress in the <tt>Upload-Offset</tt> header field (see <xref target="upload-creation"/> and <xref target="upload-appending"/>). This allows the client to show more accurate progress information about the amount of data receive by the server. In addition, clients can use this information to release representation data that was buffered, knowing that it doesn't have to be re-transmitted.</t>
        </li>
      </ul>
    </section>
    <section anchor="media-type-partial-upload">
      <name>Media Type <tt>application/partial-upload</tt></name>
      <t>The <tt>application/partial-upload</tt> media type describes a contiguous block from the representation data that should be uploaded to a resource. There is no minimum block size and the block might be empty. The block can be a subset of the representation data, where the start and/or end of the block don't line up with the start and/or end of the representation data respectively.</t>
    </section>
    <section anchor="problem-types">
      <name>Problem Types</name>
      <section anchor="mismatching-offset">
        <name>Mismatching Offset</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the <tt>Upload-Offset</tt> header field in the request does not match the upload resource's offset.</t>
        <t>Two problem type extension members are defined: the <tt>expected-offset</tt> and <tt>provided-offset</tt> members. A response using this problem type <bcp14>SHOULD</bcp14> populate both members, with the value of <tt>expected-offset</tt> taken from the upload resource and the value of <tt>provided-offset</tt> taken from the upload append request.</t>
        <t>The following example shows an example response, where the resource's offset was 100, but the client attempted to append at offset 200:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 409 Conflict
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#\
    mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 100,
  "provided-offset": 200
}
]]></sourcecode>
      </section>
      <section anchor="completed-upload">
        <name>Completed Upload</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#completed-upload" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the upload has already been completed and cannot be modified.</t>
        <t>The following example shows an example response:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

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

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#\
    inconsistent-upload-length",
  "title": "inconsistent length values for upload"
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="content-codings">
      <name>Content Codings</name>
      <t>Since the codings listed in <tt>Content-Encoding</tt> are a characteristic of the representation (see <xref section="8.4" sectionFormat="of" target="HTTP"/>), both the client and the server always compute the values for <tt>Upload-Offset</tt> and optionally <tt>Upload-Length</tt> on the content coded data (that is, the representation data). Moreover, the content codings are retained throughout the entire upload, meaning that the server is not required to decode the representation data to support resumable uploads. See <xref section="A" sectionFormat="of" target="DIGEST-FIELDS"/> for more information.</t>
    </section>
    <section anchor="transfer-codings">
      <name>Transfer Codings</name>
      <t>Unlike <tt>Content-Encoding</tt> (see <xref section="8.4.1" sectionFormat="of" target="HTTP"/>), <tt>Transfer-Encoding</tt> (see <xref section="6.1" sectionFormat="of" target="RFC9112"/>) is a property of the message, not of the representation. Moreover, transfer codings can be applied in transit (e.g., by proxies). This means that a client does not have to consider the transfer codings to compute the upload offset, while a server is responsible for transfer decoding the message before computing the upload offset. The same applies to the value of <tt>Upload-Length</tt>. Please note that the <tt>Content-Length</tt> header field cannot be used in conjunction with the <tt>Transfer-Encoding</tt> header field.</t>
    </section>
    <section anchor="integrity-digests">
      <name>Integrity Digests</name>
      <t>The integrity of an entire upload or individual upload requests can be verifying using digests from <xref target="DIGEST-FIELDS"/>.</t>
      <section anchor="representation-digests">
        <name>Representation Digests</name>
        <t>Representation digests help verify the integrity of the entire representation data that has been uploaded so far, which might strech across multiple requests.</t>
        <t>If the client knows the integrity digest of the entire representation data before creating an upload resource, it can include the <tt>Repr-Digest</tt> header field when creating an upload (<xref target="upload-creation"/>). Once the upload is completed, the server can compute the integrity digest of the received representation data and compare it to the provided digest. If the digests don't match, the server <bcp14>SHOULD</bcp14> consider the upload failed, not process the representation further, and signal the failure to the client. This way, the integrity of the entire representation data can be protected.</t>
        <t>Alternatively, when creating an upload (<xref target="upload-creation"/>), the client can ask the server to compute and return the integrity digests using a <tt>Want-Repr-Digest</tt> field conveying the preferred algorithms.
The response <bcp14>SHOULD</bcp14> include at least one of the requested digests, but might not include it.
The server <bcp14>SHOULD</bcp14> compute the representation digests using the preferred algorithms once the upload is complete and include the corresponding <tt>Repr-Digest</tt> header field in the response.
Alternatively, the server can compute the digest continuously during the upload and include the <tt>Repr-Digest</tt> header field in responses to upload creation (<xref target="upload-creation"/>) and upload appending requests (<xref target="upload-appending"/>) even when the upload is not completed yet.
This allows the client to simultaneously compute the digest of the transmitted representation data, compare its digest to the server's digest, and spot data integrity issues.
If an upload is spread across multiple requests, data integrity issues can be found even before the upload is fully completed.</t>
      </section>
      <section anchor="content-digests">
        <name>Content Digests</name>
        <t>Content digests help verify the integrity of the content in an individual request.</t>
        <t>If the client knows the integrity digest of the content from an upload creation (<xref target="upload-creation"/>) or upload appending (<xref target="upload-appending"/>) request, it can include the <tt>Content-Digest</tt> header field in the request. Once the content has been received, the server can compute the integrity digest of the received content and compare it to the provided digest. If the digests don't match the server <bcp14>SHOULD</bcp14> consider the transfer failed, not append the content to the upload resource, and signal the failure to the client. This way, the integrity of an individual request can be protected.</t>
      </section>
    </section>
    <section anchor="responses-to-uploads">
      <name>Responses to Uploads</name>
      <t>HTTP uploads often not only transfer a representation to the server but also send back information to the client. For resumable uploads, this works similar to conventional HTTP uploads. The server can include information in the response to the request, which transferred the remaining representation data and included the <tt>Upload-Complete: ?1</tt> header field. Clients can regard this response as the final response for the entire upload, as detailed in <xref target="upload-creation"/> and <xref target="upload-appending"/>.</t>
      <t>However, due to network interruptions, the upload resource might receive the remaining representation data, complete the upload, and send a response to the client, which then does not receive the response. The client can learn that the upload is complete by retrieving its state (<xref target="offset-retrieving"/>), but resumable uploads as defined in this document do not offer functionality to recover the missed response.</t>
      <t>To address this issue, the server can send the desired information in header fields, which are included in both the final response and responses when the client fetches the upload state via a HEAD request (<xref target="offset-retrieving"/>). This way, the client can retrieve the information from the header even if it failed to receive the final response. If the piece of information is too large for header fields, the server could make it available as a separate resource for retrieval and point the client to its URI in an appropriate header field.</t>
    </section>
    <section anchor="upload-strategies">
      <name>Upload Strategies</name>
      <t>The definition of the upload creation request (<xref target="upload-creation"/>) provides the client with flexibility to choose whether the representation data is fully or partially transferred in the first request, or if no representation data is included at all. Which behavior is best largely depends on the client's capabilities, its intention to avoid data re-transmission, and its knowledge about the server's support for resumable uploads.</t>
      <t>The following subsections describe two typical upload strategies that are suited for common environments. Note that these modes are never explicitly communicated to the server and clients are not required to stick to one strategy, but can mix and adapt them to their needs.</t>
      <section anchor="optimistic-upload-creation">
        <name>Optimistic Upload Creation</name>
        <t>An "optimistic upload creation" can be used independent of the client's knowledge about the server's support for resumable uploads. However, the client must be capable of handling and processing interim responses. An upload creation request then includes the full representation data because the client anticipates that it will be transferred without interruptions or resumed if an interruption occurs.</t>
        <t>The benefit of this method is that if the upload creation request succeeded, the representation data was transferred in a single request without additional round trips.</t>
        <t>A possible drawback is that the client might be unable to resume an upload. If an upload is interrupted before the client received a <tt>104 (Upload Resumption Supported)</tt> interim response with the upload resource's URI, the client cannot resume that upload due to the missing URI. The interim response might not be received if the interruption happens too early in the message exchange, the server does not support resumable uploads at all, the server does not support sending the <tt>104 (Upload Resumption Supported)</tt> interim response, or an intermediary dropped the interim response. Without a 104 response, the client needs to either treat the upload as failed or retry the entire upload creation request if this is allowed by the application.</t>
        <t>A client might wait for a limited duration to receive a 104 (Upload Resumption Supported) interim response before starting to transmit the request content. This way, the client can learn about the resource's support for resumable uploads and/or the upload resource's URI. This is conceptually similar to how a client might wait for a 100 (Continue) interim response (see <xref section="10.1.1" sectionFormat="of" target="HTTP"/>) before committing to work.</t>
        <section anchor="upgrading-uploads">
          <name>Upgrading To Resumable Uploads</name>
          <t>Optimistic upload creation allows clients and servers to automatically upgrade non-resumable uploads to resumable ones. In a non-resumable upload, the representation is transferred in a single request, usually <tt>POST</tt> or <tt>PUT</tt>, without any ability to resume from interruptions. The client can offer the server to upgrade such a request to a resumable upload by adding the <tt>Upload-Complete: ?1</tt> header field to the original request. The <tt>Upload-Length</tt> header field <bcp14>SHOULD</bcp14> be added if the representation data's length is known upfront. The request is not changed otherwise.</t>
          <t>A server that supports resumable uploads at the target URI can create an upload resource and send its URI in a <tt>104 (Upload Resumption Supported)</tt> interim response for the client to resume the upload after interruptions. A server that does not support resumable uploads or does not want to upgrade to a resumable upload for this request ignores the <tt>Upload-Complete: ?1</tt> header. The transfer then falls back to a non-resumable upload without additional cost.</t>
          <t>This upgrade can also be performed transparently by a library or program that acts as a HTTP client by sending requests on behalf of a user. When the user instructs the client to send a non-resumable request, the client can perform the upgrade transparently and handle potential interruptions and resumptions under the hood without involving the user. The last response received by the client is considered the response for the entire upload and should be provided to the user.</t>
        </section>
      </section>
      <section anchor="careful-upload-creation">
        <name>Careful Upload Creation</name>
        <t>For a "careful upload creation" the client knows that the server supports resumable uploads and sends an empty upload creation request without including any representation data. Upon successful response reception, the client can use the included upload resource URI to transmit the representation data (<xref target="upload-appending"/>) and resume the upload at any stage if an interruption occurs. The client should inspect the response for the <tt>Upload-Limit</tt> header field, which would indicate limits applying to the remaining upload procedure.</t>
        <t>The retransmission of representation data or the ultimate upload failure that can happen with an "optimistic upload creation" is therefore avoided at the expense of an additional request that does not carry representation data.</t>
        <t>This approach is best suited if the client cannot receive interim responses, e.g. due to a limitation in the provided HTTP interface, or if large representations are transferred where the cost of the additional request is minuscule compared to the effort of transferring the representation itself.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The upload resource URI is the identifier used for modifying the upload. Without further protection of this URI, an attacker may obtain information about an upload, append data to it, or cancel it. To prevent this, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can access the upload resource. To reduce the risk of unauthorized access, it is <bcp14>RECOMMENDED</bcp14> to generate upload resource URIs in such a way that makes it hard to be guessed by unauthorized clients. In addition, servers may embed information about the storage or processing location of the uploaded representation in the upload resource URI to make routing requests more efficient. If so, they <bcp14>MUST</bcp14> ensure that no internal information is leaked in the URI that is not intended to be exposed.</t>
      <t>Uploaded representation data and its metadata are untrusted input. Server operators have to be careful of where uploaded data is written and subsequently accessed, especially if the operations cause the representation to be processed or executed by the server. In addition, metadata <bcp14>MUST</bcp14> be validated and/or sanitized if the server takes its values into consideration for processing or storing the representation.</t>
      <t>Some servers or intermediaries provide scanning of content uploaded by clients. Any scanning mechanism that relies on receiving a complete representation in a single request message can be defeated by resumable uploads because content can be split across multiple messages. Servers or intermediaries wishing to perform content scanning <bcp14>SHOULD</bcp14> consider how resumable uploads can circumvent scanning and take appropriate measures. Possible strategies include waiting for the upload to complete before scanning the entire representation, or disabling resumable uploads.</t>
      <t>Resumable uploads are vulnerable to Slowloris-style attacks <xref target="SLOWLORIS"/>. A malicious client may create upload resources and keep them alive by regularly sending <tt>PATCH</tt> requests with no or small content to the upload resources. This could be abused to exhaust server resources by creating and holding open uploads indefinitely with minimal work. Servers <bcp14>SHOULD</bcp14> provide mitigations for Slowloris attacks, such as increasing the maximum number of clients the server will allow, limiting the number of uploads a single client is allowed to make, imposing restrictions on the minimum transfer speed an upload is allowed to have, and restricting the length of time an upload resource can exist.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-fields">
        <name>HTTP Fields</name>
        <t>IANA is asked to register the following entries in the "Hypertext Transfer Protocol (HTTP) Field Name Registry":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Status</th>
              <th align="left">Structured Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Upload-Offset</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-offset"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Complete</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-complete"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Length</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-length"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Limit</td>
              <td align="left">permanent</td>
              <td align="left">Dictionary</td>
              <td align="left">
                <xref target="upload-limit"/> of this document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="http-status-code">
        <name>HTTP Status Code</name>
        <t>IANA is asked to register the following entry in the "HTTP Status Codes" registry:</t>
        <dl>
          <dt>Value:</dt>
          <dd>
            <t>104 (suggested value)</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Upload Resumption Supported</t>
          </dd>
          <dt>Specification:</dt>
          <dd>
            <t><xref target="status-code-104"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is asked to register the following entry in the "Media Types" registry:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>partial-upload</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security-considerations"/> of this document</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type-partial-upload"/> of this document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Applications that transfer files over unreliable networks or want pause- and resumable uploads.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
        </dl>
        <t>Additional information:</t>
        <ul spacing="normal">
          <li>
            <t>Deprecated alias names for this type: N/A</t>
          </li>
          <li>
            <t>Magic number(s): N/A</t>
          </li>
          <li>
            <t>File extension(s): N/A</t>
          </li>
          <li>
            <t>Macintosh file type code(s): N/A</t>
          </li>
          <li>
            <t>Windows Clipboard Name: N/A</t>
          </li>
        </ul>
        <dl>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See the Authors' Addresses section of this document.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See the Authors' Addresses section of this document.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
      <section anchor="http-problem-types">
        <name>HTTP Problem Types</name>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#mismatching-upload-offset</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Mismatching Upload Offset</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>409</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="mismatching-offset"/> of this document</t>
          </dd>
        </dl>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#completed-upload</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Upload Is Completed</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>400</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="completed-upload"/> of this document</t>
          </dd>
        </dl>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#inconsistent-upload-length</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Inconsistent Upload Length Values</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>400</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="inconsistent-length"/> of this document</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="CACHING">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="PATCH">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification. The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
        <reference anchor="PROBLEM">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="DIGEST-FIELDS">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
        <reference anchor="CONTENT-DISPOSITION">
          <front>
            <title>Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)</title>
            <author fullname="J. Reschke" initials="J." surname="Reschke"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>RFC 2616 defines the Content-Disposition response header field, but points out that it is not part of the HTTP/1.1 Standard. This specification takes over the definition and registration of Content-Disposition, as used in HTTP, and clarifies internationalization aspects. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6266"/>
          <seriesInfo name="DOI" value="10.17487/RFC6266"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="SLOWLORIS" target="https://web.archive.org/web/20150315054838/http://ha.ckers.org/slowloris/">
          <front>
            <title>Welcome to Slowloris - the low bandwidth, yet greedy and poisonous HTTP client!</title>
            <author initials="R." surname="&quot;RSnake&quot; Hansen">
              <organization/>
            </author>
            <date year="2009" month="June"/>
          </front>
        </reference>
        <reference anchor="RFC8792">
          <front>
            <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="E. Auerswald" initials="E." surname="Auerswald"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document defines two strategies for handling long lines in width-bounded text content. One strategy, called the "single backslash" strategy, is based on the historical use of a single backslash ('\') character to indicate where line-folding has occurred, with the continuation occurring with the first character that is not a space character (' ') on the next line. The second strategy, called the "double backslash" strategy, extends the first strategy by adding a second backslash character to identify where the continuation begins and is thereby able to handle cases not supported by the first strategy. Both strategies use a self-describing header enabling automated reconstitution of the original content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8792"/>
          <seriesInfo name="DOI" value="10.17487/RFC8792"/>
        </reference>
      </references>
    </references>
    <?line 949?>

<section removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-08">
        <name>Since draft-ietf-httpbis-resumable-upload-08</name>
        <ul spacing="normal">
          <li>
            <t>Clarify definitions of new header fields.</t>
          </li>
          <li>
            <t>Make handling of OPTIONS * optional.</t>
          </li>
          <li>
            <t>Require server to announce limits using Upload-Limit.</t>
          </li>
          <li>
            <t>Require clients to adhere to known limits.</t>
          </li>
          <li>
            <t>Rephrase requirements for concurrency handling, focusing on the outcome.</t>
          </li>
          <li>
            <t>Remove requirement for 204 status code for DELETE responses.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Add section about 104 status code.</t>
          </li>
          <li>
            <t>Rephrase recommendation for sending information back to client.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-07">
        <name>Since draft-ietf-httpbis-resumable-upload-07</name>
        <ul spacing="normal">
          <li>
            <t>Clarify server handling when upload length is exceeded.</t>
          </li>
          <li>
            <t>Extend security considerations about upload resource URIs, representation metadata, and untrusted inputs.</t>
          </li>
          <li>
            <t>Allow clients to retry for appropriate 4xx responses.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-06">
        <name>Since draft-ietf-httpbis-resumable-upload-06</name>
        <ul spacing="normal">
          <li>
            <t>Minor editorial improvements to introduction and examples.</t>
          </li>
          <li>
            <t>Define structured types for new header fields.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-05">
        <name>Since draft-ietf-httpbis-resumable-upload-05</name>
        <ul spacing="normal">
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Numerous editorial changes.</t>
          </li>
          <li>
            <t>Rename <tt>expires</tt> limit to <tt>max-age</tt>.</t>
          </li>
          <li>
            <t>Require <tt>Upload-Complete</tt>, but not <tt>Upload-Offset</tt> or <tt>Upload-Limit</tt>, for append responses.</t>
          </li>
          <li>
            <t>Add problem type for inconsistent length values.</t>
          </li>
          <li>
            <t>Reduce use of "file" in favor of "representation".</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-04">
        <name>Since draft-ietf-httpbis-resumable-upload-04</name>
        <ul spacing="normal">
          <li>
            <t>Clarify implications of <tt>Upload-Limit</tt> header.</t>
          </li>
          <li>
            <t>Allow client to fetch upload limits upfront via <tt>OPTIONS</tt>.</t>
          </li>
          <li>
            <t>Add guidance on upload creation strategy.</t>
          </li>
          <li>
            <t>Add <tt>Upload-Length</tt> header to indicate length during creation.</t>
          </li>
          <li>
            <t>Describe possible usage of <tt>Want-Repr-Digest</tt>.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-03">
        <name>Since draft-ietf-httpbis-resumable-upload-03</name>
        <ul spacing="normal">
          <li>
            <t>Add note about <tt>Content-Location</tt> for referring to subsequent resources.</t>
          </li>
          <li>
            <t>Require <tt>application/partial-upload</tt> for appending to uploads.</t>
          </li>
          <li>
            <t>Explain handling of content and transfer codings.</t>
          </li>
          <li>
            <t>Add problem types for mismatching offsets and completed uploads.</t>
          </li>
          <li>
            <t>Clarify that completed uploads must not be appended to.</t>
          </li>
          <li>
            <t>Describe interaction with Digest Fields from RFC9530.</t>
          </li>
          <li>
            <t>Require that upload offset does not decrease over time.</t>
          </li>
          <li>
            <t>Add Upload-Limit header field.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-02">
        <name>Since draft-ietf-httpbis-resumable-upload-02</name>
        <ul spacing="normal">
          <li>
            <t>Add upload progress notifications via informational responses.</t>
          </li>
          <li>
            <t>Add security consideration regarding request filtering.</t>
          </li>
          <li>
            <t>Explain the use of empty requests for creation uploads and appending.</t>
          </li>
          <li>
            <t>Extend security consideration to include resource exhaustion attacks.</t>
          </li>
          <li>
            <t>Allow 200 status codes for offset retrieval.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-01">
        <name>Since draft-ietf-httpbis-resumable-upload-01</name>
        <ul spacing="normal">
          <li>
            <t>Replace Upload-Incomplete header with Upload-Complete.</t>
          </li>
          <li>
            <t>Replace terminology about procedures with HTTP resources.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-00">
        <name>Since draft-ietf-httpbis-resumable-upload-00</name>
        <ul spacing="normal">
          <li>
            <t>Remove Upload-Token and instead use Server-generated upload URL for upload identification.</t>
          </li>
          <li>
            <t>Require the Upload-Incomplete header field in Upload Creation Procedure.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-02">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-02</name>
        <t>None</t>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-01">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-01</name>
        <ul spacing="normal">
          <li>
            <t>Clarifying backtracking and preventing skipping ahead during the Offset Receiving Procedure.</t>
          </li>
          <li>
            <t>Clients auto-retry 404 is no longer allowed.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-00">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-00</name>
        <ul spacing="normal">
          <li>
            <t>Split the Upload Transfer Procedure into the Upload Creation Procedure and the Upload Appending Procedure.</t>
          </li>
        </ul>
      </section>
    </section>
    <section removeInRFC="true" anchor="draft-version-identification">
      <name>Draft Version Identification</name>
      <t>To assist the development of implementations and interoperability testing while this document is still a draft, an interop version is defined. Implementations of this draft use the interop version to identify the iteration of the draft that they implement. The interop version is bumped for breaking changes.</t>
      <t>The current interop version is 8.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to its requests. The <tt>Upload-Draft-Interop-Version</tt> field value is an Integer.</t>
      <t>Server implementations of draft versions of the protocol <bcp14>MUST NOT</bcp14> send a <tt>104 (Upload Resumption Supported)</tt> informational response when the interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field in the request is missing or mismatching.</t>
      <t>Server implementations of draft versions of the protocol <bcp14>MUST</bcp14> also send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to the <tt>104 (Upload Resumption Supported)</tt> informational response.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> ignore a <tt>104 (Upload Resumption Supported)</tt> informational response with missing or mismatching interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
      <t>The reason both the client and the server are sending and checking the draft version is to ensure that implementations of the final RFC will not accidentally interop with draft implementations, as they will not check the existence of the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document is based on an Internet-Draft specification written by <contact fullname="Jiten Mehta"/>, <contact fullname="Stefan Matsson"/>, and the authors of this document.</t>
      <t>The <eref target="https://tus.io/">tus v1 protocol</eref> is a specification for a resumable file upload protocol over HTTP. It inspired the early design of this protocol. Members of the tus community helped significantly in the process of bringing this work to the IETF.</t>
      <t>The authors would like to thank <contact fullname="Mark Nottingham"/> for substantive contributions to the text, and <contact fullname="Roy T. Fielding"/> and <contact fullname="Julian Reschke"/> for their thorough reviews of the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+192XbbSJLoO78CIz+Uqy5JS15q0ZmeaZWXKk17u5Y8NT3d
fVogCUoYgQAbCUpmuzzfcr/lftmNLTMjgQRJya7tTuucKkskkEtkRGTsMRqN
Bk3eFNlh8iYzq0U6KbLk7bKo0plJ5lWdfH96+nqQTiZ1dhV5ZDCrpmW6gLdn
dTpvRnnWzEcXTbOc5GZU26dHK3p6tP/NYJo22XlVrw8T08wGg3xZHyZNvTLN
/f39b/bvD9I6Sw+TH7JJkpaz5LhssrrMmuS0TkuzrOpmcF3Vl+d1tVoe8tIu
szV8NOO/hgnPNEzc3AOzmixyY/KqPF0vYaHHT0+fDQamgfH/mhZVCR+tMzMw
i7Ru/vq3VdVk5jApq8EyP0z+1FTTYWJg3jqbG/htvcBf/jIYXGXlKjscJIle
S5I0NMUPsMa8PE++w+/g04sKIYRgMYf37uG/1+fjqj6/B98t0rw4TBzcRtfn
v79+gF/Cd2k9vfDvFblpzJi/vHcEX+VXmbn3ejUp8uk9PQAOW2fLyr96njcX
q8l4Wi1kdvpnlL1rshIhY+4V6SQrzL32kQ34zREAcJWN6KHDpPPQIF01F1WN
4BjBf0mSlwDDF+PkD0WWzwr6iLHkRVrnK6M/ryvEvWyWN1VNH8Du0jL/e9rA
ug754HGSvKFvM4bXgsb5feO/xc2F8383Tv7zIi3P1fTfrap1pj7dMvnRcgmo
flxOx3rucxzkr3/HQX6f4hPdqZ+Pk9dpPVtlau7nq2lq9MdbJn9cVKvZvACC
0JMXOMrv6f9LGoomHwzKql7Ai1eEk4iMQKzPHn9zcLAPfz8+evz98cvv7EcH
8BH/dv+Qxp7lZlmka8biewdjfODk9M3bx6dv3zx9Mnp2/PT5kxN++8tH+OXr
o9PH39MHj776+hv84M2rb58/fcHPPHz0FXz05Pi7pyenwcuPHtBqXr08ffry
dPTk+OT1q5Pj0+NXL+nrL+9/+SVwhHKut3Ly/NUPz1+9OT7hlQqr2vshK2Df
WdJUyUlRXRdVnZtklDQXWQJ/JhMg7ut81lwMgbYboNEsm62Joyyr3FRlBTiI
e02mRZ6VzT/t0eAei/FnJP/ikeZNnhZwrm/G7kOzqvlc9/689+akTC+zP+8l
3wM6ZiWPNgNOd5ggWxvtf8mLT+vzrJHx9yxtXmeTccrUTJQNf9+7v3/waP8B
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

-->

</rfc>
