<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-13" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-13"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit</organization>
      <address>
        <email>ietf@mariuskleidl.net</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="2026" month="October" day="06"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>HTTP, upload, resumable</keyword>
    <abstract>
      <?line 75?>

<t>HTTP data transfers can encounter interruption due to reasons such as canceled requests or dropped connections. If the intended recipient can indicate how much of the data was processed 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 79?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP data transfers can encounter interruption due to reasons such as canceled requests or dropped connections. If the intended recipient can indicate how much of the data was processed 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. While partial PUT is one method for uploading a partial representation (via Content-Range in the request), there are caveats that affect its deployability; see <xref section="14.5" sectionFormat="of" target="HTTP"/>.</t>
      <t>Canceled upload request can be triggered for various reasons, including but not limited to:</t>
      <dl>
        <dt>explicit client cancellation:</dt>
        <dd>
          <t>e.g., terminating a user-agent process</t>
        </dd>
        <dt>implicit client cancellation:</dt>
        <dd>
          <t>e.g., terminating a tab, garbage collecting a process or internal error</t>
        </dd>
        <dt>explicit server cancellation:</dt>
        <dd>
          <t>e.g., scheduled maintenance</t>
        </dd>
        <dt>implicit server cancellation:</dt>
        <dd>
          <t>e.g., DoS mitigation or internal error</t>
        </dd>
      </dl>
      <t>Connections can be dropped due to a variety of network or transport layer reasons triggered by endpoints or on-path elements.</t>
      <t>This specification defines a new mechanism for resumable uploads from client to server that can seamlessly fall back to conventional 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 resource'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. Examples are purely illustrative and non-normative. Implementations of this protocol are expected to follow normative requirements defined in other sections, together with applying security considerations presented in <xref target="security-considerations"/>.</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 then sends an interim response to the client, signaling support for resumable uploads and the upload resource's URI via the Location header field (<xref section="10.2.2" sectionFormat="of" target="HTTP"/>). The client can start sending the representation data in the request content immediately after the request header section. Alternatively, it could also await the acknowledgment in the form of the interim response.</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="336" width="520" viewBox="0 0 520 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,304" fill="none" stroke="black"/>
                <path d="M 368,48 L 368,304" fill="none" stroke="black"/>
                <path d="M 512,192 L 512,224" fill="none" stroke="black"/>
                <path d="M 16,128 L 360,128" fill="none" stroke="black"/>
                <path d="M 376,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 376,224 L 512,224" fill="none" stroke="black"/>
                <path d="M 16,288 L 360,288" fill="none" stroke="black"/>
                <path d="M 16,320 L 120,320" fill="none" stroke="black"/>
                <path d="M 256,320 L 360,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,224 372,218.4 372,229.6" fill="black" transform="rotate(180,376,224)"/>
                <polygon class="arrowhead" points="368,128 356,122.4 356,133.6" fill="black" transform="rotate(0,360,128)"/>
                <polygon class="arrowhead" points="24,288 12,282.4 12,293.6" fill="black" transform="rotate(180,16,288)"/>
                <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="84" y="116">[representation]</text>
                  <text x="408" y="164">Reserve</text>
                  <text x="480" y="164">resources</text>
                  <text x="392" y="180">for</text>
                  <text x="436" y="180">upload</text>
                  <text x="120" y="260">104</text>
                  <text x="164" y="260">Upload</text>
                  <text x="236" y="260">Resumption</text>
                  <text x="320" y="260">Supported</text>
                  <text x="144" y="276">Location:</text>
                  <text x="236" y="276">/uploads/abc</text>
                  <text x="8" y="324">X</text>
                  <text x="140" y="324">Flow</text>
                  <text x="208" y="324">Interrupted</text>
                  <text x="368" y="324">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                  Server
|                                            |
| POST /project/123/files                    |
| Upload-Complete: ?1                        |
|                                            |
| [representation]                           |
|------------------------------------------->|
|                                            |
|                                            | 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 processed 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="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <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="80" y="148">[representation</text>
                  <text x="164" y="148">from</text>
                  <text x="212" y="148">offset</text>
                  <text x="252" y="148">X]</text>
                  <text x="360" y="196">200</text>
                  <text x="388" y="196">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        |
|                                                 |
| [representation from offset X]                  |
|------------------------------------------------>|
|                                                 |
|                                          200 OK |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can instruct the server to delete the upload resource and all associated representation data (<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, communicating with a resource known to support resumable upload, can upload parts of a representation incrementally.</t>
        <t>1) The client is aware that the targeted resource supports resumable uploads and therefore starts the 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="224" width="416" viewBox="0 0 416 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,208" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,208" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <path d="M 16,192 L 400,192" 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,192 12,186.4 12,197.6" fill="black" transform="rotate(180,16,192)"/>
                <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="52" y="116">[partial</text>
                  <text x="152" y="116">representation]</text>
                  <text x="320" y="164">201</text>
                  <text x="368" y="164">Created</text>
                  <text x="256" y="180">Location:</text>
                  <text x="348" y="180">/uploads/abc</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| POST /project/123/files                         |
| Upload-Complete: ?0                             |
|                                                 |
| [partial representation]                        |
|------------------------------------------------>|
|                                                 |
|                                     201 Created |
|                          Location: /uploads/abc |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>2) Next, 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.</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="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <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="52" y="148">[partial</text>
                  <text x="148" y="148">representation</text>
                  <text x="228" y="148">from</text>
                  <text x="276" y="148">offset</text>
                  <text x="316" y="148">X]</text>
                  <text x="296" y="196">204</text>
                  <text x="324" y="196">No</text>
                  <text x="368" y="196">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        |
|                                                 |
| [partial representation from offset X]          |
|------------------------------------------------>|
|                                                 |
|                                  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 processed 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="352" width="416" viewBox="0 0 416 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,336" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,336" 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,272 L 400,272" fill="none" stroke="black"/>
                <path d="M 16,320 L 400,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,272 396,266.4 396,277.6" fill="black" transform="rotate(0,400,272)"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
                <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="52" y="260">[partial</text>
                  <text x="148" y="260">representation</text>
                  <text x="228" y="260">from</text>
                  <text x="276" y="260">offset</text>
                  <text x="316" y="260">Y]</text>
                  <text x="296" y="308">204</text>
                  <text x="324" y="308">No</text>
                  <text x="368" y="308">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        |
|                                                 |
| [partial representation from offset Y]          |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) The request to append the last part of the representation data has an <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 its representation had been fully transferred and processed, 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="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <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">Z</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="60" y="148">[remaining</text>
                  <text x="164" y="148">representation</text>
                  <text x="244" y="148">from</text>
                  <text x="292" y="148">offset</text>
                  <text x="332" y="148">Z]</text>
                  <text x="360" y="196">200</text>
                  <text x="388" y="196">OK</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?1                             |
| Upload-Offset: Z                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [remaining representation from offset Z]        |
|------------------------------------------------>|
|                                                 |
|                                          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"/>). Using this 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"/>). The server is responsible for persisting the state of the upload resource (<xref target="state"/>) and updating it as the upload progresses.</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, keeping the upload resource available for a period of time after completion allows the client to verify the state of the upload if it did not receive the last response acknowledging the completion. Implementations are responsible for deciding if they retain the resource and for what duration; they will need to consider the resource costs required to do so.</t>
      <t>An upload resource <bcp14>SHOULD</bcp14> be unique. Reuse of a URI for a different upload resource <bcp14>SHOULD</bcp14> be avoided in order to reduce the chance of misdirected or corrupted upload resources, as well as the potential security issues described in <xref target="security-considerations"/>.</t>
      <section anchor="state">
        <name>State</name>
        <t>The state of an upload consists of the following properties that are tracked by the server.</t>
        <section anchor="upload-offset">
          <name>Offset</name>
          <t>The offset is the number of bytes from the representation data that have been processed, either during the creation of the upload resource (<xref target="upload-creation"/>) or by appending to it (<xref target="upload-appending"/>). The offset 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>The offset reflects application-level processing for the upload. Data may have been delivered and acknowledged at the transport layer without yet being reflected in the offset.</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 client obtains the current offset in multiple ways:</t>
          <ul spacing="normal">
            <li>
              <t>The offset can be explicitly retrieved from the upload resource (<xref target="offset-retrieving"/>).</t>
            </li>
            <li>
              <t>Interim and final responses for creating the upload (<xref target="upload-creation"/>) or appending (<xref target="upload-appending"/>) with a non-<tt>2XX</tt> status code and the <tt>Upload-Complete: ?0</tt> header can include the <tt>Upload-Offset</tt> header field.</t>
            </li>
            <li>
              <t>Final responses for appending representation data (<xref target="upload-appending"/>) with a <tt>2XX</tt> status code and the <tt>Upload-Complete: ?0</tt> header acknowledge that the entire request content was received and the offset increased by the length of the appended representation data. An <tt>Upload-Offset</tt> header field's value <bcp14>MUST</bcp14> match this inferred offset, if present.</t>
            </li>
          </ul>
          <t>Representation data processed by the upload resource cannot be removed again and, therefore, the offset as seen by the client <bcp14>MUST NOT</bcp14> decrease. Clients can use this guarantee to free resources associated to transferred representation data, as no retransmission of it will be necessary. If the server loses any part of the state, it <bcp14>MUST</bcp14> deactivate the upload resource and reject further interaction with it.</t>
        </section>
        <section anchor="upload-complete">
          <name>Completeness</name>
          <t>An upload is incomplete until it is explicitly marked as completed by the client or the server. After this point, no more representation data can be appended.</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 either when a request for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>) includes the <tt>Upload-Complete</tt> header field with a true value and the request content was fully processed, or when a response includes the <tt>Upload-Complete</tt> header field with a true value.</t>
          <t>When used in an upload creation response (<xref target="upload-creation"/>) or an upload append response (<xref target="upload-appending"/>), <tt>Upload-Complete</tt> signals whether the response comes from the initial targeted resource. The value of true means that the semantics of the targeted resource apply, and the value of false means that the semantics of the resumable upload protocol apply. The client <bcp14>SHOULD NOT</bcp14> perform upload resumption to the upload resource after receiving a response with the <tt>Upload-Complete</tt> field value set to true. Note that <tt>Upload-Complete</tt> can be true even when the full representation data was not transmitted in the case that the server decides to generate an early response when processing the targeted resource. Also note that <tt>Upload-Complete</tt> can be false in response to an invalid operation performed on a completed upload.</t>
        </section>
        <section anchor="upload-length">
          <name>Length</name>
          <t>The length of the representation data might not be known when starting the transfer, for example, because the representation is taken from a streaming source. The representation's length will, however, be known at the latest when the client completes the upload (<xref target="upload-complete"/>).</t>
          <t>Despite this, a client <bcp14>SHOULD</bcp14> communicate the representation's length to the server as soon as it becomes known to aid with resource management and facilitate early validation. There are two different ways for the client to indicate and for the server to discover the representation's length from requests for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>):</t>
          <ol spacing="normal" type="1"><li>
              <t>If the request includes the <tt>Upload-Complete</tt> field value set to true, the request content is the remaining representation data. The representation's length is then the sum of the current offset (<xref target="upload-offset"/>) and the request content's length, which might be announced in the <tt>Content-Length</tt> header field.</t>
            </li>
            <li>
              <t>The request can include the <tt>Upload-Length</tt> header field defined below.</t>
            </li>
          </ol>
          <t>The <tt>Upload-Length</tt> request and response header field 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 representation's length as a number of bytes. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>If indicators (1) and (2) are both present in the same request, their indicated lengths <bcp14>MUST</bcp14> match. The representation's length, if known, <bcp14>MUST</bcp14> stay consistent across subsequent requests. 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 indicators.</t>
          <t>The <tt>Upload-Length</tt> field can be used in response to an offset retrieval; see <xref target="offset-retrieving-server"/>.</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>A server <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>
          <dl>
            <dt><tt>max-size</tt>:</dt>
            <dd>
              <t>Specifies a maximum size for the representation data, counted in bytes. The server might not create an upload resource if the representation's length (<xref target="upload-length"/>) deduced from the upload creation request is larger than the maximum size. The server might also deactivate the upload resource if the offset (<xref target="upload-offset"/>) exceeds the maximum size. The value is an Integer.</t>
            </dd>
            <dt><tt>min-size</tt>:</dt>
            <dd>
              <t>Specifies a minimum size for the representation data, counted in bytes, for the server to offer resumable uploads. The server might not create an upload resource if the representation's 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. Resumable uploads impose additional overhead on the server, which might not be acceptable for small representations. Requests with representation data below this value might still be accepted by the server, although without the ability to resume them. The value is an Integer.</t>
            </dd>
            <dt><tt>max-append-size</tt>:</dt>
            <dd>
              <t>Specifies a maximum size counted in bytes for the request content in a single upload append (<xref target="upload-appending"/>) or upload creation (<xref target="upload-creation"/>) request. The server might reject requests exceeding this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send larger upload append or upload creation requests. The value is an Integer.</t>
            </dd>
            <dt><tt>min-append-size</tt>:</dt>
            <dd>
              <t>Specifies a minimum size counted in bytes for the request content in a single upload append (<xref target="upload-appending"/>) or upload creation (<xref target="upload-creation"/>) request. The server might reject requests below this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send smaller upload append or upload creation requests. The value is an Integer. This limit does not apply to upload creation requests with no content, or to requests completing the upload by including the <tt>Upload-Complete: ?1</tt> header field.</t>
            </dd>
            <dt><tt>max-age</tt>:</dt>
            <dd>
              <t>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. The value is an Integer.</t>
            </dd>
          </dl>
          <t>Clients usually discover limits through the <tt>Upload-Limit</tt> header field when the upload resource is created (<xref target="upload-creation"/>). Throughout the lifetime of the upload resource, these limits <bcp14>SHOULD NOT</bcp14> change in a way that causes failures for clients adhering to the initially discovered limits. If the client discovers that it cannot continue the upload while adhering to the limits, it <bcp14>SHOULD</bcp14> stop the current request immediately (<xref target="request-cancellation"/>) and cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The following recommendations for limit changes can minimize the risk of causing upload failures:</t>
          <ul spacing="normal">
            <li>
              <t><tt>max-size</tt> and <tt>max-append-size</tt> <bcp14>SHOULD NOT</bcp14> decrease.</t>
            </li>
            <li>
              <t><tt>min-size</tt> and <tt>min-append-size</tt> <bcp14>SHOULD NOT</bcp14> increase.</t>
            </li>
            <li>
              <t>Between subsequent responses, the end of the upload resource's lifetime as implied by <tt>max-age</tt> <bcp14>SHOULD NOT</bcp14> decrease.</t>
            </li>
          </ul>
          <t>Receivers of <tt>Upload-Limit</tt> parse the Dictionary as described in <xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>. Where the Dictionary is successfully parsed, this document places two additional requirements on Dictionary members. First, a member with an unknown key <bcp14>MUST</bcp14> be ignored. Second, a member with a known key but a value of unexpected type <bcp14>MUST</bcp14> cause the entire <tt>Upload-Limit</tt> header field to be ignored, or alternatively the complete HTTP message <bcp14>MUST</bcp14> be treated as malformed.</t>
          <t>When responding to an <tt>OPTIONS</tt> request without the <tt>Upload-Complete</tt> header field, if the resource that is the target of the request supports the creation of a resumable upload resource (<xref target="upload-creation"/>), the server <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits in the response. If a server is configured such that all of its resources support the creation of upload resources with identical limits, it <bcp14>SHOULD</bcp14> include the <tt>Upload-Limit</tt> header field in response to an <tt>OPTIONS</tt> request for the target <tt>*</tt> (if this target is supported). 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 without the <tt>Upload-Complete</tt> header field to discover whether the resource supports resumable uploads and to learn potential limits before creating an upload resource. To reduce the likelihood 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 1 GB, but reduce it to 100 MB when the media type indicates an image.</t>
          <t>When a request is rejected because limits were violated, the response <bcp14>SHOULD</bcp14> include the <tt>Upload-Limit</tt> header field carrying all limits of the corresponding upload if possible. This might not be possible if intermediaries enforce limits.</t>
          <t>Servers, including intermediaries, can (and often do) apply restrictions on the size of individual request message content. There is no standard mechanism to communicate such existing size restriction. A server that implements one can respond with a <tt>413 (Content Too Large)</tt> status code; see <xref section="15.5.14" sectionFormat="of" target="HTTP"/>. Appending to an upload resource, as a series of appends, can be used to upload data up to the <tt>max-size</tt> limit without encountering per-message limits. Servers might apply restrictions that are smaller than the append limits, which would also result in a failed request.</t>
          <t>When a client receives a response with a <tt>413 (Content Too Large)</tt> status code during upload creation (<xref target="upload-creation"/>) or append (<xref target="upload-appending"/>), it <bcp14>SHOULD</bcp14> retry the request with a smaller size residing between <tt>min-append-size</tt> and <tt>max-append-size</tt>. If these limits are unknown at the time of receiving such a response, the client can attempt to discover them through an <tt>OPTIONS</tt> request. Retrying with the same request content size will likely yield the same error response. Cases where the request content size matches the <tt>min-append-size</tt> limit yet fails with a <tt>413 (Content Too Large)</tt> response might indicate a deployment mismatch that cannot be recovered from.</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>. The request can benefit from incremental delivery; see <xref target="incremental"/>.</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 conventional uploads (<xref target="upgrading-uploads"/>).</t>
          <t>If the client knows the representation's length, it <bcp14>SHOULD</bcp14> indicate the 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"/>), as described in <xref target="upload-length"/>.</t>
          <t>Clients are not required to discover limits (<xref target="upload-limit"/>) before starting the upload and might therefore be initially unaware of limits enforced by the server. However, the client <bcp14>SHOULD</bcp14> respect any limits (<xref target="upload-limit"/>) announced during the upload process 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 (<xref target="request-cancellation"/>) and cancel the upload (<xref target="upload-cancellation"/>). If the client knows that the representation data is smaller than <tt>min-size</tt>, it cannot expect resumability to be offered. The client might still attempt to transfer the representation in a single request, either in a request with the <tt>Upload-Complete</tt> header field set to true (see <xref target="upgrading-uploads"/>) or via a conventional upload.</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 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.2" 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-Encoding</tt> header field (<xref section="8.4" sectionFormat="of" target="HTTP"/>) names the content codings applied to the representation. The <tt>Content-Disposition</tt> header field (<xref target="CONTENT-DISPOSITION"/>) can be used to transmit a filename. For this purpose, the <tt>inline</tt> disposition type is <bcp14>RECOMMENDED</bcp14>.</t>
          <t>If the client received a final response with the <tt>Upload-Complete: ?1</tt> header field, the upload is complete and the corresponding response comes from the resource processing the representation according to the initial request (<xref target="upload-complete"/>). Note that this does not necessarily indicate success. <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> status codes indicate in this case an error occurred while processing the representation, and therefore, resuming the upload would not resolve this error.</t>
          <t>If the client receives a 2xx successful final response with the <tt>Upload-Complete</tt> header field set to false or missing, and the client's <tt>Upload-Complete</tt> request header field was set to false, 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>
          <t>If the client receives a 4xx client error or 5xx server error final response with the <tt>Upload-Complete</tt> header field set to false or missing, or if it did not receive a final response, it can apply the heuristics described in <xref target="retry"/> to retry or resume the upload.</t>
        </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 for this request by creating an upload resource. If so, the server <bcp14>SHOULD</bcp14> announce the upload resource by sending an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code unless the server is not capable of sending interim responses. The interim response allows the client to resume the upload even if the message exchange gets later interrupted. When sent, it <bcp14>MUST</bcp14> include <tt>Location</tt> header field pointing to the upload resource and <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits (<xref target="upload-limit"/>) if existing.</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. The upload resource, on the other hand, 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 processed, no resumable upload is needed and the server proceeds to process the request and generate a response. The server <bcp14>MUST NOT</bcp14> emit a 2xx successful response with the <tt>Upload-Complete</tt> header field set to false or missing in response to a request with the <tt>Upload-Complete</tt> request header field set to true.</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to false, the client intends to transfer the representation over multiple requests. If the request content was fully processed, the server <bcp14>MUST</bcp14> include the <tt>Location</tt> response header field pointing to the upload resource and <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits if existing. Servers are <bcp14>RECOMMENDED</bcp14> to use the <tt>201 (Created)</tt> status code.</t>
          <t>The server <bcp14>MUST</bcp14> record the representation's length according to <xref target="upload-length"/> if the <tt>Upload-Length</tt> or <tt>Upload-Complete: ?1</tt> header fields are included in the request.</t>
          <t>While the request content is being processed, the server <bcp14>MAY</bcp14> send multiple 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.</t>
          <t>Where a response requires a <tt>Location</tt> header field to be included, all interim and final response messages for the same request <bcp14>MUST</bcp14> contain an identical <tt>Location</tt> value. However, final responses including the <tt>Upload-Complete: ?1</tt> header field are exempt from this requirement because they are the result of processing the transferred representation and the <tt>Location</tt> value does not necessarily represent the upload location. Where the <tt>Location</tt> value is expected to be identical across multiple messages, clients <bcp14>SHOULD</bcp14> verify this. If verification fails, clients <bcp14>SHOULD</bcp14> abort the current request and cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The server <bcp14>SHOULD</bcp14> include the <tt>Upload-Complete</tt> (<xref target="upload-complete"/>) header field in the response to indicate whether it is the result of processing the uploaded representation.</t>
          <t>The server <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt>, <tt>302 (Found)</tt>, or <tt>303 (See Other)</tt> status codes and the <tt>Upload-Complete: ?0</tt> header field because clients might follow the redirect without preserving the original method. See <xref target="origin"/> for redirecting a response that completes the upload.</t>
          <t>The server might not process the entire request content when the upload is interrupted, for example because of dropped connection or canceled request. In this case, the server <bcp14>SHOULD</bcp14> append as much of the request content as possible to the upload resource, allowing the client to resume the upload from where it was interrupted. In addition, 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 123456789 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
Content-Disposition: inline; filename="file name.jpg"; filename*=UTF-8''file%20name.jpg
Content-Length: 123456789
Upload-Length: 123456789
Upload-Complete: ?1

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

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

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

{"attachmentId": "b530ce8ff"}
]]></sourcecode>
          <t>B) The following example shows an upload creation, where only the first 23456789 bytes of a 123456789 bytes upload are transferred. The server acknowledges the processed 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: 23456789
Upload-Length: 123456789

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

HTTP/1.1 201 Created
Location: https://example.com/upload/3fd4994ad
Upload-Complete: ?0
Upload-Limit: max-size=1234567890
]]></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: 123456789
Upload-Length: 123456789

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

HTTP/1.1 500 Internal Server Error
]]></sourcecode>
          <t>D) The following example shows an upload creation being rejected by the server because the request content cannot be decoded. The <tt>Upload-Complete</tt> header in the response is set to true since the server is uninterested in receiving the full representation after the decoding failure, and the upload is complete in its perspective. The client cannot continue the upload.</t>
          <sourcecode type="http-message"><![CDATA[
POST /upload-gzip HTTP/1.1
Host: example.com
Upload-Complete: ?0
Content-Length: 23456789
Upload-Length: 123456789
Content-Encoding: gzip

[corrupted gzip content]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/6723cdf37

HTTP/1.1 400 Bad Request
Upload-Complete: ?1
]]></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 processed by the upload resource so far. It can fetch the offset by sending a <tt>HEAD</tt> or <tt>GET</tt> request to the upload resource. Using <tt>HEAD</tt> is <bcp14>RECOMMENDED</bcp14>, since response content is not required for resumption. 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 is expected to handle backtracking of a reasonable length. On the other hand, the offset can be greater than the amount of sent representation data, for example, if the server obtained additional representation data on behalf of the client. If the client is not able to provide the representation data at the given offset, the upload <bcp14>MUST</bcp14> be considered a failure. The client then <bcp14>MUST NOT</bcp14> continue the upload and <bcp14>SHOULD</bcp14> cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The client <bcp14>MUST NOT</bcp14> perform offset retrieval while the creation (<xref target="upload-creation"/>) of or appending (<xref target="upload-appending"/>) to the same upload resource 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 receives a 2xx successful response with a valid Upload-Offset header field, the client can continue appending representation data to it (<xref target="upload-appending"/>).</t>
          <t>If the client receives a 2xx successful response without a valid Upload-Offset header field, a 4xx client error, or 5xx server error response, or if it did not receive a response, the client <bcp14>MAY</bcp14> retry retrieving the offset.</t>
        </section>
        <section anchor="offset-retrieving-server">
          <name>Server Behavior</name>
          <t>A successful response to a <tt>HEAD</tt> or <tt>GET</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> 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 server <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt>, <tt>302 (Found)</tt>, or <tt>303 (See Other)</tt> status codes because clients might follow the redirect without preserving the <tt>HEAD</tt> method.</t>
          <t>A client does not require response content for an offset retrieval request in order to successfully resume an upload. Therefore, serving response content for a <tt>GET</tt> request is unexpected. Its meaning is not defined by this protocol.</t>
        </section>
        <section anchor="offset-retrieving-example">
          <name>Examples</name>
          <t>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/c35e2cd29 HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Complete: ?0
Upload-Offset: 25000000
Upload-Length: 100000000
Upload-Limit: max-age=3600
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. The request can benefit from incremental delivery; see <xref target="incremental"/>.</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> header field. To ensure that the upload resource will accept the request, the offset <bcp14>SHOULD</bcp14> be taken from an immediate previous response for retrieving the offset (<xref target="offset-retrieving"/>), creating the upload (<xref target="upload-creation"/>), 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 in two cases:</t>
          <ul spacing="normal">
            <li>
              <t>the request has content that is the end of the representation data. Once the content is fully processed by the server, the upload is complete.</t>
            </li>
            <li>
              <t>the request has no content. Once the request is processed by the server, the upload is complete. This usage requires the full representation data to have been processed during prior requests.</t>
            </li>
          </ul>
          <t>If the client received a final response with the <tt>Upload-Complete: ?1</tt> header field, the upload is complete and the corresponding response comes from the resource processing the representation according to the initial request (<xref target="upload-complete"/>). Note that this does not necessarily indicate success. <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> status codes indicate in this case an error occurred while processing the representation, and therefore, resuming the upload would not resolve this error.</t>
          <t>If the client received a 4xx client error or 5xx server error final response with the <tt>Upload-Complete</tt> header field set to false or missing, or if it did not receive a final response, it can apply the heuristics described in <xref target="retry"/> to retry or resume the upload. Otherwise, the upload is considered a failure.</t>
        </section>
        <section anchor="server-behavior-1">
          <name>Server Behavior</name>
          <t>A server applies a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) to an upload resource by appending the patch document in the request content.</t>
          <t>The server might not process the entire patch document when the upload is interrupted, for example because of a dropped connection or canceled request. In this case, the server <bcp14>SHOULD</bcp14> append as much of the patch document as possible to the upload resource, 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"/>. Saving the processed data allows the client to resume the upload from where it was interrupted. In addition, the upload resource <bcp14>MUST NOT</bcp14> be considered complete then.</t>
          <t>If the <tt>Upload-Offset</tt> request header field value does not match the current offset (<xref target="upload-offset"/>), the server <bcp14>MUST</bcp14> reject the request with a <tt>409 (Conflict)</tt> status code and the <tt>Upload-Complete</tt> header field set to false. 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 <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 processed, the upload is marked as complete and the server <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 processed 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 uploaded representation. The server <bcp14>MUST NOT</bcp14> emit a 2xx successful response with the <tt>Upload-Complete</tt> header field set to false or missing in response to a request with the <tt>Upload-Complete</tt> request header field set to true.</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to false, the client intends to transfer the remaining representation data over multiple requests. If the request content was fully processed, the server acknowledges the appended data by sending a <tt>2xx (Successful)</tt> response with the <tt>Upload-Complete</tt> header field set to false.</t>
          <t>Even if the upload is complete (<xref target="upload-complete"/>) in the server's perspective and the final response from the targeted resource has already been sent, the client might still perform an upload append (<xref target="upload-appending"/>) after an offset retrieval (<xref target="offset-retrieving"/>) due to the response being lost during transmission. The server can choose to replay the final response to the client if the request to append to the completed upload is valid.</t>
          <t>The server <bcp14>MUST</bcp14> record the representation's length according to <xref target="upload-length"/> if the <tt>Upload-Length</tt> or <tt>Upload-Complete</tt> header fields are included in the request. If the representation's length is known, the server <bcp14>MUST</bcp14> prevent the offset from exceeding the representation's length by rejecting the request once the offset exceeds the length, 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 this header field might not be present.</t>
          <t>While the request content is being processed, 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>
          <t>The server <bcp14>SHOULD</bcp14> include the <tt>Upload-Complete</tt> (<xref target="upload-complete"/>) header field in the response to indicate whether it is the result of processing the uploaded representation.</t>
          <t>The server <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt>, <tt>302 (Found)</tt>, or <tt>303 (See Other)</tt> status codes and the <tt>Upload-Complete: ?0</tt> header field because clients might follow the redirect without preserving the <tt>PATCH</tt> method. See <xref target="origin"/> for redirecting a response that completes the upload.</t>
        </section>
        <section anchor="upload-appending-example">
          <name>Examples</name>
          <t>A) The following example shows an upload append request. The client transfers the next 3456789 bytes at an offset of 20000000 and does not indicate that the upload is then completed. The server generates one interim response, when the offset reached 21728394 bytes, and finally acknowledges the new offset:</t>
          <sourcecode type="http-message"><![CDATA[
PATCH /upload/37a504d87 HTTP/1.1
Host: example.com
Upload-Complete: ?0
Upload-Offset: 20000000
Content-Length: 3456789
Content-Type: application/partial-upload

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

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 4567890 bytes and completes the upload with a length of 1234567890 bytes. The server processes the uploaded representation and generates the corresponding response, in this example containing extracted meta data:</t>
          <sourcecode type="http-message"><![CDATA[
PATCH /upload/d38d6ffe8 HTTP/1.1
Host: example.com
Upload-Complete: ?1
Upload-Offset: 1230000000
Content-Length: 4567890
Content-Type: application/partial-upload

[content (4567890 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-2">
          <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 server <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt>, <tt>302 (Found)</tt>, or <tt>303 (See Other)</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/5688a431c 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 requests for the same upload. The client <bcp14>MUST NOT</bcp14> perform multiple representation data transfers for the same upload resource in parallel, or perform representation data transfers while the creation of the same upload resource is still in progress.</t>
        <t>Even if the client is well-behaved 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. This means that the offset communicated through final responses as defined in <xref target="upload-offset"/> <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 a server 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"/>) to the same upload resource is still ongoing, the server <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 server 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 for the same upload resource in parallel, the server can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
        <t>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 anchor="retry">
        <name>Retry</name>
        <t>If the client received a 4xx client error or 5xx server error response with the <tt>Upload-Complete</tt> header field set to false or missing when creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>), it can apply the heuristics described below to retry or resume the upload.</t>
        <ul spacing="normal">
          <li>
            <t><tt>409 (Conflict)</tt> with the <tt>Upload-Complete</tt> header field set to false can be resumed with the correct offset (<xref target="upload-offset"/>). If no <tt>Upload-Offset</tt> header field is provided, the client <bcp14>SHOULD</bcp14> retrieve the offset (<xref target="offset-retrieving"/>) before resuming.</t>
          </li>
          <li>
            <t><tt>413 (Content Too Large)</tt> can be resumed after applying appropriate limits (<xref target="upload-limit"/>).</t>
          </li>
          <li>
            <t><tt>429 (Too Many Requests)</tt> can be retried after appropriate delays.</t>
          </li>
          <li>
            <t><tt>5xx (Server Error)</tt> status codes can be retried.</t>
          </li>
        </ul>
        <t>If no final response was received 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>
        <t>The client <bcp14>SHOULD</bcp14> limit the number of retries it performs before considering the upload a failure.</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 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 resource'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 processed 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 retransmitted.</t>
        </li>
      </ul>
      <t>When creating or appending resumable uploads, the client can generate a 100-continue expectation because it wants an indication that the resource is willing to accept the upload. The client <bcp14>MAY</bcp14> treat an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code as fulfilling the 100-continue expectation and start sending the request content. However, the server <bcp14>MUST NOT</bcp14> omit the <tt>100 (Continue)</tt> response because it has sent an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code.</t>
    </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 12500000, but the client attempted to append at offset 25000000:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 409 Conflict
Content-Type: application/problem+json
Upload-Offset: 12500000
Upload-Complete: ?0

{
  "type":"https://iana.org/assignments/http-problem-types#\
    mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 12500000,
  "provided-offset": 25000000
}
]]></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 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
Upload-Complete: ?0

{
  "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="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 desire to avoid data retransmission, and its knowledge about the resource'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 resource'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 receives 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 resource targeted in the initial request does not support resumable uploads, the server is not capable of 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 invite 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's length is known upfront. The request is not changed otherwise.</t>
          <t>If the resource targeted in the initial request supports resumable uploads, the server 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 resource 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 an 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 resource targeted in the initial request 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="incremental">
      <name>Incremental Transfer, Processing and Forwarding</name>
      <t>The resumable upload design is most effective when a server processes request message portions as they arrive, which ensures the greatest chance that data is processed before a possible transfer interruption.</t>
      <t>To support incremental processing, it is <bcp14>RECOMMENDED</bcp14> that clients send request content incrementally and minimize buffering.</t>
      <t>As described in <xref target="INCREMENTAL"/>, intermediaries might interfere with the incremental delivery of data to a server. Clients can use the <tt>Incremental</tt> header field defined in <xref section="3" sectionFormat="of" target="INCREMENTAL"/> to signal their preference for incremental forwarding by intermediaries.</t>
    </section>
    <section anchor="request-cancellation">
      <name>Request Cancellation</name>
      <t>A client or server might want to interrupt an in-flight message transfer intentionally for various reasons (see <xref target="introduction"/>). The mechanism to do so depends on the HTTP version in use:</t>
      <dl>
        <dt>HTTP/1.1:</dt>
        <dd>
          <t>close the underlying transport connection (<xref section="9.5" sectionFormat="of" target="RFC9112"/>)</t>
        </dd>
        <dt>HTTP/2:</dt>
        <dd>
          <t>send a <tt>RST_STREAM</tt> frame (<xref section="6.4" sectionFormat="of" target="RFC9113"/>)</t>
        </dd>
        <dt>HTTP/3:</dt>
        <dd>
          <t>send a <tt>RESET_STREAM</tt> (<xref section="19.4" sectionFormat="of" target="QUIC"/>) or <tt>STOP_SENDING</tt> frame (<xref section="19.5" sectionFormat="of" target="QUIC"/>)</t>
        </dd>
      </dl>
      <t>Version-specific mechanisms place requirements on clients or servers for actioning the cancellation. However, for all versions of HTTP, resumable uploads allow the server to process received representation data and expose the upload offset via the upload resource, enabling continuation of the upload after interruption.</t>
    </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>There can be a significant delay between the creation of an upload resource and its completion. Policy decisions or authorization checks performed on the initial request might become outdated or invalid by the time the upload completes. To mitigate vulnerabilities arising from time-of-check to time-of-use (TOCTOU) conditions, the server <bcp14>SHOULD</bcp14> validate that the user is still allowed to perform the requested action before finalizing the upload. This includes, for example, validating access privileges and quota policies associated with the upload resource.</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>
      <t>Uploads performed as a series of appends can be used to upload data up to the <tt>max-size</tt> limit, which could be a larger size than a server or intermediary might normally permit in conventional single upload request message content. Servers or intermediaries need to consider that relying solely on message content limits to constrain resources allocated to uploads might not be an effective strategy when using resumable uploads.</t>
      <section anchor="origin">
        <name>Different Origins</name>
        <t>The resource targeted by the initial request (<xref target="upload-creation"/>) and the upload resource might have different origins (<xref target="ORIGIN"/>). For example, the initial request might be sent to an application server, while the upload resource is hosted by a dedicated storage service.</t>
        <t>Clients have to consider this change of origin when following the <tt>Location</tt> header field to the upload resource. Credentials and other per-origin state associated with the initially targeted resource are not necessarily applicable to the upload resource, and remain scoped to their respective origins. Clients also have to consider that disclosing an upload resource URI to a different origin can leak the capability to read, append to, or cancel the upload.</t>
        <t>Because the upload can be completed either by the initial request or by an upload append request (<xref target="upload-appending"/>), the final response might come from a different origin depending on whether the upload was resumed. To avoid this, the server <bcp14>MAY</bcp14> respond to the request that completes the upload with a <tt>303 (See Other)</tt> status code, redirecting the user agent to the origin of the initially targeted resource. Because a <tt>303 (See Other)</tt> response directs the user agent to retrieve the result with <tt>GET</tt>, the considerations regarding method preservation in <xref target="upload-creation"/> and <xref target="upload-appending"/> do not apply in this case.</t>
      </section>
    </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#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"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <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="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </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>
        <reference anchor="INCREMENTAL">
          <front>
            <title>Incremental Forwarding of HTTP Messages</title>
            <author fullname="K. Oku" initials="K." surname="Oku"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="August" year="2026"/>
            <abstract>
              <t>This document specifies the "Incremental" HTTP header field, which
 instructs HTTP intermediaries to forward the HTTP message
 incrementally.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="10036"/>
          <seriesInfo name="DOI" value="10.17487/RFC10036"/>
        </reference>
        <reference anchor="ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
      </references>
    </references>
    <?line 994?>

<section removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-12">
        <name>Since draft-ietf-httpbis-resumable-upload-12</name>
        <ul spacing="normal">
          <li>
            <t>Upload-Complete and Upload-Length are no longer required on offset retrieval responses.</t>
          </li>
          <li>
            <t>Remove discouragement against sending requests after expiration.</t>
          </li>
          <li>
            <t>Clarify how upload offset is inferred from responses.</t>
          </li>
          <li>
            <t>Disallow successful responses indicating an incomplete upload when the request indicated completion.</t>
          </li>
          <li>
            <t>Describe considerations for the initially targeted resource and the upload resource having different origins.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-11">
        <name>Since draft-ietf-httpbis-resumable-upload-11</name>
        <ul spacing="normal">
          <li>
            <t>Clear up different responsibilities of server and upload resource.</t>
          </li>
          <li>
            <t>Relax recommendations on client handling greater offsets.</t>
          </li>
          <li>
            <t>Clarify client behavior for 413 responses.</t>
          </li>
          <li>
            <t>Remove Accept-Patch from OPTIONS responses.</t>
          </li>
          <li>
            <t>Allow upload creation requests with no content regardless of the <tt>min-append-size</tt> limit.</t>
          </li>
          <li>
            <t>Remove nominative languages addressing the lost final response.</t>
          </li>
          <li>
            <t>Allow <tt>max-age</tt> limit to decrease as expected.</t>
          </li>
          <li>
            <t>Redefine Upload-Complete on the server side.</t>
          </li>
          <li>
            <t>Recommend incremental delivery.</t>
          </li>
          <li>
            <t>Clarify <tt>min-size</tt> limit and its client behavior.</t>
          </li>
          <li>
            <t>Describe <tt>GET</tt> requests against upload resource.</t>
          </li>
          <li>
            <t>Replace uses of term "upload length" with "representation's length".</t>
          </li>
          <li>
            <t>Include <tt>Upload-Limit</tt> in response to limit violation.</t>
          </li>
          <li>
            <t>Clarify that clients might not know limits when starting upload.</t>
          </li>
          <li>
            <t>Remove section covering integrity digests.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Add version-specific details on cancelling in-flight transfers.</t>
          </li>
          <li>
            <t>Clarify client retry strategies.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-10">
        <name>Since draft-ietf-httpbis-resumable-upload-10</name>
        <ul spacing="normal">
          <li>
            <t>Add recommended disposition type for file name indication.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-09">
        <name>Since draft-ietf-httpbis-resumable-upload-09</name>
        <ul spacing="normal">
          <li>
            <t>Requires Accept-Patch in OPTIONS.</t>
          </li>
          <li>
            <t>Add security consideration regarding time-of-check to time-of-use.</t>
          </li>
          <li>
            <t>Lift requirement on Upload-Complete for all final responses.</t>
          </li>
          <li>
            <t>Relax requirements on limit changes.</t>
          </li>
          <li>
            <t>Describe the interaction between 100 and 104 responses.</t>
          </li>
          <li>
            <t>Numerous editorial improvements.</t>
          </li>
        </ul>
      </section>
      <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 10.</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> interim 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> interim response.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> ignore a <tt>104 (Upload Resumption Supported)</tt> interim 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 Jiten Mehta, Stefan Matsson, and the authors of this document.</t>
      <t>The <eref target="https://tus.io/">tus v1 protocol</eref> is a specification for a resumable file upload protocol over HTTP. It inspired the early design of this protocol. Members of the tus community helped significantly in the process of bringing this work to the IETF.</t>
      <t>The authors would like to thank Mark Nottingham for substantive contributions to the text, along with the following in alphabetical order for their thorough reviews of the document:</t>
      <ul spacing="normal">
        <li>
          <t>Daniel Resnick</t>
        </li>
        <li>
          <t>Glenn Strauss</t>
        </li>
        <li>
          <t>Grant Gryczan</t>
        </li>
        <li>
          <t>Julian Reschke</t>
        </li>
        <li>
          <t>Mert Alev</t>
        </li>
        <li>
          <t>Mike Bishop</t>
        </li>
        <li>
          <t>Roy T. Fielding</t>
        </li>
        <li>
          <t>Willy Tarreau</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
