<?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-14" 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-14"/>
    <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>Apple</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="18"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>HTTP, upload, resumable</keyword>
    <abstract>
      <?line 78?>

<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 82?>

<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 the <tt>Content-Range</tt> header field in the request), there are caveats that affect its deployability; see <xref section="14.5" sectionFormat="of" target="HTTP"/>.</t>
      <t>Upload requests can be canceled 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 an 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., denial-of-service mitigation or an 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>With resumable uploads, applications can recover from unintended interruptions. They can also interrupt an upload on purpose and resume it later, for example, when a user wants to pause the upload, the device's network connectivity changes, or bandwidth is needed for higher-priority tasks.</t>
      <t>This document introduces the concept of an upload resource to facilitate resumable uploads (<xref target="upload-resource"/>). It defines new header fields to communicate the state of the upload (<xref target="upload-offset-hdr"/>, <xref target="upload-complete-hdr"/>, <xref target="upload-length-hdr"/>, and <xref target="upload-limit-hdr"/>) and the <tt>104 (Upload Resumption Supported)</tt> status code to indicate the resource's support for resumable uploads (<xref target="status-code-104"/>). It also defines 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 are folded, as described in <xref target="RFC8792"/>.</t>
      <t>This document uses the following terminology from <xref section="3" sectionFormat="of" target="STRUCTURED-FIELDS"/> to specify syntax and parsing: Item, Dictionary, Integer, and Boolean.</t>
      <t>This document uses the following terms from <xref section="3" sectionFormat="of" target="HTTP"/>: "representation", "representation data", "representation metadata", "content", "client", and "server".</t>
      <t>This document uses the term "URI" as defined in <xref section="4" sectionFormat="of" target="HTTP"/>.</t>
      <t>This document uses the term "patch document" 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>
      <t>A <em>104 interim response</em> is an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code (<xref target="status-code-104"/>).</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Resumable uploads are supported in HTTP by 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 follow the normative requirements in the other sections and the security considerations 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 <tt>Location</tt> 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 can wait for the interim response first.</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> header field 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="256" width="416" viewBox="0 0 416 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,240" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,240" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,224 L 400,224" 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,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,224)"/>
                <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>
                  <text x="308" y="212">Upload-Complete:</text>
                  <text x="388" y="212">?1</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 |
|                             Upload-Complete: ?1 |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can cancel the upload (<xref target="upload-cancellation"/>). The server can then release the upload resource and any associated representation data.</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 uploads, can upload parts of a representation incrementally.</t>
        <t>1) The client is aware that the target resource supports resumable uploads and therefore starts the upload with the <tt>Upload-Complete</tt> header field 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> header field 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 the <tt>Upload-Complete</tt> header field 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="256" width="416" viewBox="0 0 416 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,240" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,240" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,224 L 400,224" 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,224 12,218.4 12,229.6" fill="black" transform="rotate(180,16,224)"/>
                <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>
                  <text x="308" y="212">Upload-Complete:</text>
                  <text x="388" y="212">?1</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 |
|                             Upload-Complete: ?1 |
|<------------------------------------------------|
|                                                 |
]]></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="upload-offset"/>, <xref target="upload-complete"/>, and <xref target="upload-length"/>) and updating it as the upload progresses. Limits (<xref target="upload-limits"/>) can also apply to the upload resource.</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 whether they retain the resource and for what duration, considering the resource costs of doing 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-uri"/>.</t>
      <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 might have been delivered and acknowledged at the transport layer without yet being reflected in the offset.</t>
        <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 with 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 anchor="upload-offset-hdr">
          <name>Upload-Offset</name>
          <t>The <tt>Upload-Offset</tt> request and response header field conveys the offset. It 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 can learn the current offset in three 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 responses for creating the upload (<xref target="upload-creation"/>) or appending (<xref target="upload-appending"/>), and their final responses with a non-<tt>2xx</tt> status code and the <tt>Upload-Complete: ?0</tt> header field, 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 (Successful)</tt> status code and the <tt>Upload-Complete: ?0</tt> header field acknowledge that the entire request content was received and the offset increased by the length of the appended representation data. If present, the <tt>Upload-Offset</tt> header field value <bcp14>MUST</bcp14> match this inferred offset.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="upload-complete">
        <name>Completeness</name>
        <t>An upload is incomplete until it is explicitly marked as complete by the client or the server. After this point, no more representation data can be appended.</t>
        <section anchor="upload-complete-hdr">
          <name>Upload-Complete</name>
          <t>The <tt>Upload-Complete</tt> request and response header field 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"/>); its meaning in requests and responses is described below. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>An upload is marked as complete 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 set to true and the request content was fully processed, or when a response includes the <tt>Upload-Complete</tt> header field set to true.</t>
          <t>When used in an upload creation response (<xref target="upload-creation"/>) or an upload append response (<xref target="upload-appending"/>), the <tt>Upload-Complete</tt> header field signals whether the response comes from the target resource of the initial request. The value of true means that the semantics of that 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> header field set to true. Note that the <tt>Upload-Complete</tt> header field 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 it can be false in response to an invalid operation performed on a completed upload.</t>
        </section>
      </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>A client <bcp14>SHOULD</bcp14> communicate the representation's length to the server as soon as it becomes known, without waiting for the upload to complete. This aids resource management and allows early validation. A request that creates the upload resource (<xref target="upload-creation"/>) or appends to it (<xref target="upload-appending"/>) has two possible indicators of the length:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the request includes the <tt>Upload-Complete</tt> header field 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>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>Note that the length and offset values do not determine whether an upload is complete. Instead, the client uses the <tt>Upload-Complete</tt> header field (<xref target="upload-complete-hdr"/>) to indicate that a request completes the upload. The offset could match the length, but the upload can still be incomplete.</t>
        <section anchor="upload-length-hdr">
          <name>Upload-Length</name>
          <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>The <tt>Upload-Length</tt> field can be used in response to an offset retrieval; see <xref target="offset-retrieving-server"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="upload-limits">
      <name>Upload Limits</name>
      <t>A server can limit an upload, for example, in its total size, in the size of each request, or in how long the upload resource remains available. The server announces these limits to the client in the <tt>Upload-Limit</tt> header field (<xref target="upload-limit-hdr"/>), so the client can adhere to them.</t>
      <t>A client usually learns the limits when the upload resource is created (<xref target="upload-creation"/>). It can learn them before that through an <tt>OPTIONS</tt> request (<xref target="upload-limits-options"/>).</t>
      <section anchor="upload-limit-hdr">
        <name>Upload-Limit</name>
        <t>The <tt>Upload-Limit</tt> response header field 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>Receivers of the <tt>Upload-Limit</tt> header field 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>The following key-value pairs are defined.</t>
        <section anchor="upload-limit-max-size">
          <name>max-size</name>
          <t>The <tt>max-size</tt> limit specifies a maximum size, in bytes, for the representation data. 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>
        </section>
        <section anchor="upload-limit-min-size">
          <name>min-size</name>
          <t>The <tt>min-size</tt> limit specifies a minimum size, in bytes, for the representation data. 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>
        </section>
        <section anchor="upload-limit-max-append-size">
          <name>max-append-size</name>
          <t>The <tt>max-append-size</tt> limit specifies a maximum size, 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>
        </section>
        <section anchor="upload-limit-min-append-size">
          <name>min-append-size</name>
          <t>The <tt>min-append-size</tt> limit specifies a minimum size, 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>
        </section>
        <section anchor="upload-limit-max-age">
          <name>max-age</name>
          <t>The <tt>max-age</tt> limit specifies the remaining lifetime, in seconds, of the upload resource, 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>
        </section>
      </section>
      <section anchor="upload-limits-options">
        <name>Use with OPTIONS</name>
        <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.</t>
        <t>When responding to such a request, if the target resource 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).</t>
        <t>In an <tt>OPTIONS</tt> response, the presence of the <tt>Upload-Limit</tt> header field signals support for resumable uploads, even when the server applies no limits. An empty Dictionary is equivalent to omitting the field (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>), so it cannot carry this signal. If the server does not apply any limits, it <bcp14>MUST</bcp14> send <tt>min-size=0</tt>.</t>
        <t>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>
      </section>
      <section anchor="upload-limits-changes">
        <name>Limit Changes</name>
        <t>Throughout the lifetime of the upload resource, 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>
      </section>
      <section anchor="upload-limits-violations">
        <name>Limit Violations</name>
        <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 (<xref target="upload-limit-max-size"/>) 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> (<xref target="upload-limit-min-append-size"/>) and <tt>max-append-size</tt> (<xref target="upload-limit-max-append-size"/>). 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 (<xref target="upload-limits-options"/>). 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-hdr"/>). Any method that allows content can be used, 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-limits"/>), as described in <xref target="upload-length"/>.</t>
        <t>Clients are not required to discover limits (<xref target="upload-limits"/>) 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-limits"/>) 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> (<xref target="upload-limit-min-size"/>), 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 receives a final response with the <tt>Upload-Complete: ?1</tt> header field, the upload is complete and the corresponding response comes from the target resource of the initial request (<xref target="upload-complete-hdr"/>). 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 <tt>2xx (Successful)</tt> 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 <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> 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-limits"/>) if any.</t>
        <t>The target resource of the 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> generate a <tt>2xx (Successful)</tt> 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 any. 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>Every response to the same request that identifies the upload resource in the <tt>Location</tt> header field <bcp14>MUST</bcp14> use the same URI. A final response with <tt>Upload-Complete: ?1</tt> is the result of processing the representation, so its <tt>Location</tt> header field can identify a different resource. Clients <bcp14>SHOULD</bcp14> check that the upload resource URI does not change, and <bcp14>SHOULD</bcp14> stop the current request immediately (<xref target="request-cancellation"/>) and cancel the upload (<xref target="upload-cancellation"/>) if it does.</t>
        <t>The server <bcp14>SHOULD</bcp14> include the <tt>Upload-Complete</tt> header field (<xref target="upload-complete-hdr"/>) 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 a dropped connection or a 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. The upload resource <bcp14>MUST NOT</bcp14> be considered complete in this case.</t>
      </section>
      <section anchor="upload-creation-example">
        <name>Examples</name>
        <t>A) The following example shows an upload creation, where all 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
Upload-Complete: ?1
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-byte 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
Upload-Limit: max-size=1234567890

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 <tt>5xx (Server Error)</tt> 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 field in the response is set to true because, after the decoding failure, the server does not want the rest of the representation and considers the upload complete. 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 already has data from an earlier attempt to upload the same representation. 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> retrieve the offset while it is still creating (<xref target="upload-creation"/>) or appending to (<xref target="upload-appending"/>) the same upload resource, because the server might terminate the in-progress request (<xref target="concurrency"/>).</t>
        <t>If the client receives a <tt>2xx (Successful)</tt> response with a valid <tt>Upload-Offset</tt> header field, the client can continue appending representation data to it (<xref target="upload-appending"/>).</t>
        <t>If the client receives a <tt>2xx (Successful)</tt> response without a valid <tt>Upload-Offset</tt> header field, a <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> 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 to 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-hdr"/>),</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> indicate the limits in the <tt>Upload-Limit</tt> header field (<xref target="upload-limits"/>) if any, 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="HTTP-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 accepts the request, the client <bcp14>SHOULD</bcp14> take the offset from the most recent offset retrieval (<xref target="offset-retrieving"/>), upload creation (<xref target="upload-creation"/>), or upload append (<xref target="upload-appending"/>) response.</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 receives a final response with the <tt>Upload-Complete: ?1</tt> header field, the upload is complete and the corresponding response comes from the target resource of the initial request (<xref target="upload-complete-hdr"/>). 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 <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> 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 a 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. The upload resource <bcp14>MUST NOT</bcp14> be considered complete in this case.</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 target resource of the initial upload creation request (<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 set to true, 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> generate a <tt>2xx (Successful)</tt> 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"/>) from the server's perspective and the final response from the target resource of the initial request 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: ?1</tt> header fields are included in the request. If the representation's length is known, the server <bcp14>MUST NOT</bcp14> let the offset exceed it: if appending a request's content would take the offset past the length, the server <bcp14>MUST</bcp14> reject the request, deactivate the upload resource, and reject 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> header field (<xref target="upload-complete-hdr"/>) 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 following 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 metadata:</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 cancel the upload, 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 does not 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 append (<xref target="upload-appending"/>) or cancellation (<xref target="upload-cancellation"/>) requests to the same upload resource. In addition, the server <bcp14>MUST NOT</bcp14> send outdated information in responses. This means that if a client appends at an offset from a final response (<xref target="upload-offset-hdr"/>), the server <bcp14>MUST NOT</bcp14> reject that request for having the wrong offset, unless another append or a cancellation arrived in between.</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 from 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 cancel the upload (<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 receives a <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> 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: the upload 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>: the upload can be resumed after applying appropriate limits (<xref target="upload-limits"/>).</t>
        </li>
        <li>
          <t><tt>429 (Too Many Requests)</tt>: the request can be retried after an appropriate delay.</t>
        </li>
        <li>
          <t><tt>5xx (Server Error)</tt>: the request 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 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, a 104 interim response 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 104 interim responses 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 does not have to be retransmitted.</t>
        </li>
      </ul>
      <t>When creating or appending resumable uploads, the client can generate a <tt>100-continue</tt> expectation because it wants an indication that the resource is willing to accept the upload. The client <bcp14>MAY</bcp14> treat a 104 interim response as fulfilling the <tt>100-continue</tt> 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 a 104 interim response.</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 to 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 do not 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 a 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 a 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 the <tt>Content-Encoding</tt> header field 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 the <tt>Upload-Offset</tt> and optionally <tt>Upload-Length</tt> header fields 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.</t>
    </section>
    <section anchor="transfer-codings">
      <name>Transfer Codings</name>
      <t>Unlike content codings (see <xref section="8.4.1" sectionFormat="of" target="HTTP"/>), transfer codings (see <xref section="6.1" sectionFormat="of" target="RFC9112"/>) are 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 <tt>Upload-Length</tt> header field value. See <xref section="6.2" sectionFormat="of" target="RFC9112"/> for how the <tt>Content-Length</tt> and <tt>Transfer-Encoding</tt> header fields interact.</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 strategies are never explicitly communicated to the server, and clients are not required to use only 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 regardless of the client's knowledge about the resource's support for resumable uploads. However, the client needs to be able to process 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 strategy is that if the upload creation request succeeds, the representation data is 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 target resource of the initial request does not support resumable uploads, the server is not capable of sending the 104 interim response, or an intermediary dropped the interim response. Without a 104 interim 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 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 <tt>100 (Continue)</tt> 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 target resource of the initial request supports resumable uploads, the server can create an upload resource and send its URI in a 104 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 field. 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 needs to 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 target resource of 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 response can include the <tt>Upload-Limit</tt> header field, which indicates limits for the rest of the upload (<xref target="upload-limits"/>).</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>reset the stream (<xref section="6.4" sectionFormat="of" target="RFC9113"/>)</t>
        </dd>
        <dt>HTTP/3:</dt>
        <dd>
          <t>abruptly terminate the request stream (<xref section="4.1.1" sectionFormat="of" target="RFC9114"/>)</t>
        </dd>
      </dl>
      <t>Version-specific mechanisms place requirements on clients or servers for carrying out 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>
      <section anchor="security-uri">
        <name>Upload Resource URIs</name>
        <t>The upload resource URI is the identifier used for modifying the upload. Without further protection of this URI, an attacker can perform any operation on the upload resource: obtain information about it, append data to it, or cancel it. Each of these requests can also cause a server to terminate an in-flight request from a legitimate client (<xref target="concurrency"/>).</t>
        <t>To mitigate these risks, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can access the upload resource. It is also <bcp14>RECOMMENDED</bcp14> that upload resource URIs be hard to guess.</t>
        <t>Servers might embed information in the upload resource URI, such as a storage or processing location, to make request routing more efficient. Because the URI is visible to the client and to anyone else who obtains it, servers <bcp14>MUST NOT</bcp14> include information in it that is not intended to be exposed. Routing information could, for instance, be encoded so that only the server can interpret it.</t>
        <t>If knowing the upload resource URI is enough to access the upload, the URI is in effect a credential. Like other credentials, it needs to be protected in transit (see <xref section="17.16.1" sectionFormat="of" target="HTTP"/>). URIs are also often logged or displayed by servers, proxies, and user agents, so the URI can be disclosed to third parties (see <xref section="17.9" sectionFormat="of" target="HTTP"/>).</t>
      </section>
      <section anchor="untrusted-input">
        <name>Untrusted Input</name>
        <t>Uploaded representation data and its metadata are untrusted input. Server operators have to be careful about 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>
      </section>
      <section anchor="content-scanning">
        <name>Content Scanning</name>
        <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>
      </section>
      <section anchor="time-of-check-to-time-of-use">
        <name>Time-of-Check to Time-of-Use</name>
        <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>
      </section>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Resumable uploads are vulnerable to Slowloris-style attacks <xref target="SLOWLORIS"/>. A malicious client can create upload resources and keep them alive by regularly sending <tt>PATCH</tt> requests with no or small content to the upload resources. This could be abused to exhaust server resources by creating and holding open uploads indefinitely with minimal work. Servers <bcp14>SHOULD</bcp14> provide mitigations for Slowloris attacks, such as increasing the maximum number of clients the server will allow, limiting the number of uploads a single client is allowed to make, imposing restrictions on the minimum transfer speed an upload is allowed to have, and restricting the length of time an upload resource can exist.</t>
      </section>
      <section anchor="message-size-limits">
        <name>Message Size Limits</name>
        <t>Uploads performed as a series of appends can be used to upload data up to the <tt>max-size</tt> limit (<xref target="upload-limit-max-size"/>), 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>
      <section anchor="origin">
        <name>Different Origins</name>
        <t>The target resource of 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 target resource of the initial request 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 target resource of the initial request. 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-hdr"/> of RFC nnnn</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-hdr"/> of RFC nnnn</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-hdr"/> of RFC nnnn</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-hdr"/> of RFC nnnn</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 "Hypertext Transfer Protocol (HTTP) Status Code 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 RFC nnnn</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 RFC nnnn</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 RFC nnnn</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Applications that transfer files over unreliable networks or want pausable 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 RFC nnnn</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 RFC nnnn</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <displayreference target="RFC9114" to="HTTP/3"/>
    <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="HTTP-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="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </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="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 1043?>

<section removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-13">
        <name>Since draft-ietf-httpbis-resumable-upload-13</name>
        <t>Editorial changes only.</t>
      </section>
      <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:
H4sIAAAAAAAAA+19+3rbVpLn/3wKrPztxu4laUm2E1szPTOKbCea8W0teTI9
Pf21QBKkMCIBNgBKVjueZ9ln2Sfbup4bDnhR3El6t/V9iSUSONc6deryq6rB
YNBr8maeHSXvs3q1SEfzLPmwnJfppE6mZZV8f37+rpeORlV2HXmkNynHRbqA
tydVOm0GedZMB5dNsxzl9aDSpwcrenpw8Lg3TptsVla3R0ndTHq9fFkdJU21
qpvD/f1n+4e9tMrSo+SHbJSkxSQ5LZqsKrImOa/Sol6WVdO7KaurWVWulkc8
tKvsFj6a8F/9hHvqJ6bvXr0aLfK6zsvi/HYJAz19cf6y16sbaP+P6bws4KPb
rO7Vi7Rq/vinVdlk9VFSlL1lfpT8vinH/aSGfqtsWsNvtwv85Q+93nVWrLKj
XpK4Y0mShrr4AcaYF7PkO/wOPr0scYVwWeqjhw/x35vZsKxmD+G7RZrPjxKz
boOb2T/dPMIv4bu0Gl/a9+Z53dRD/vLhMXyVX2f1w3er0TwfP3QbwGarbFna
V2d5c7kaDcflQnqnfwbZxyYrcGXqh/N0lM3rh+GW9fjNASzgKhvQQ0dJ66Fe
umouywqXYwD/JUlewBq+Hib/Ms/yyZw+Yip5nVb5qnY/r0qkvWySN2VFH8Ds
0iL/c9rAuI5447GTvKFvM7te/7Sgxq6orSFQid/9d8Pk3y/TYub0/t2qvM2c
Tzf0fbxcAqWfFuOh2/UMG/njn7GRf0rxCVxWv+tXw+RdWk1WmdP3q9U4rd2P
t+nc7XeODfwT/X9JrVC/vV5RVgt455qoEckQjunLk2cHB/vy9+Dk+OT70zff
6ecH8Dn/dnhEHUzyejlPb5mIHx4M7QOPYg8cmq8fx75+BJ+dnb//cHL+4f2L
54OXpy9ePT/jvr9+gk2/Oz4/+Z4+ePLN02f4wfu337568ZqfefzkG/jo5O2b
8xdvzgfPT8/evT07PT99+4a+/vrw66+BaxRTd9Jnr97+8Ort+9MzHo6ws70f
sjmsUJY0ZXI2L2/mZZXXySBpLrME/kxGwABu8klz2Yfz38A5zrLJLXGdZZnX
ZVECneKEkvE8z4rmv+1R45bS8Wcg/+K+502ezmHz3w/Nh/Wq4s3f+4+992dF
epX9x17yPRB0VnBrE+CGRwmyvsH+1zz4tJpljbS/p+f3JhsNUz7xdPrh74eH
+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
qn4lw2JzXEFmHTTYvtFVMfy2rRJLciix2hFoNM0ntT1tcMhB4l+oEi8mOCZG
ohQxWR5bGzclaCOjeB09wBvun3r97UOOzJvSROipClNWhhPxIoGecGC0Sx3c
He+QfvTiyjWsfG1et3Ukxi1IUpXVQicQqD9t+/eDrsvUNI2p0HIQPPlkochW
FOWqGFvmY3JH8tkNFYLDoedy7tImYi+bpDUsB/V6sAnOLt0/4OHfP3xAprhR
CSsh66ODq9OF6bsvmpLqqhOZYu0I2GuXuY9WYDkO9AqwlVu1FxJlM1g8kvMP
CduxmiufAcYLpLfglGCfPkkC5s+fcQNN0uEcjg6lEU5rvOkpnwXnDZfXKQ1Y
fQ9leh3KwOOfe7j13tfWqeGw7tpz1bvPGzozqw+74V948gSl2WJyE4F1QhcH
7CWnc8qMmOJlUbTM45Rzs3reKZOMaMNRa/NHzRnngxDQeOuQfJvTelbNMTn8
VQHLDDVg4lGHMXF2BDFMWQXL123iF1xEr9ED8bNqNV/aENTFryjwIjB6fxkz
ULh8nrilonsgqxhTsIS0asLalmVnwEeYM7+oW1l8fXZH2dWHl7Jz4ulTS/KB
7AFjygku2Eg4R98wMIntyNLxpWVkJSWtw0AMSr8Wux35Nqmtc8zzpCoXp22C
hZAgFS/9iGHwuqT4TOeBczM0YqkGT5ZBn+eEw1noi4Urs6zqFYXakNmO6UaG
Y2SiiCd0LPj6Drf3aWAKXNhYeWJY4lEvkgvOhHdmT1rotR2US0n484CFVHc9
gn2PHWRetu6z66Sj+8kH2GnKO7aHXYf2p5+692wls2LTOnrBRHzctDPSdppA
k6Cuc+AEs6haTeWUnlwshfNb7m8ieWxNbrvlPCXSB/EvnUwoKaboviZfFAJI
bLOLDFkVsKiXGMzTp9ztxLwMCKRgmR6TatIaOkuUwGxKdLgEbyX2FbxJUqso
r4rs45LdQCQZxHdl3Tp7m8Tppt1kOq5j2o9pM6Nv5HxhLt90zpqb8FjrEYWx
D3jUyzSv2J8tQptce4v046DmJFfeOdHP9bDo3xfCKQXowHny04/5AqRawxjp
vugbFaRTXBZmZ7XCboxNHlMq7YV1PwIHmWSM/QudA445SJQFaAZVaspExQzN
nVJkrJJWdq13Ska8RrbPPo4500i0Q8s1Cr3qdc/yIr5n8rnZM/k7umegyfyV
71m9wGTV7qY5c8IjVZTalaZFl9ZRvJzPh06ZJkFRJvmCE1BbroPhopcZ56e2
urivdolBgzOMGaALjS8E82CnYli+4RTbbSsJqVPMEpkIuBcju3I/Iaihjyzk
kq5NtQWQt4OT/PvRHYuNJAbHndXxTu7gfO0yCefju/GKQPd2UuL5ltkOu4GB
VFmaiRsiPFOqR9XiUzYeAD6nBqZHk0KF0WTTS534Vk1TyVM3fnnKDi9cxp9H
ZMBWK93MCNbtkv+1yxY27dJG7vDr2yXn1Nx9h5SnfIEtYisbd2Iiww2osKs9
5gpFaVN8loLK0uIbsbQQyAlswY0Od+tBaPqxJ30WP+Ez/2TPIrTiG8bm+TRD
TB/RTE1iFaYXjWKbEAiHxWwcZi92cAcPZUD2xn/ppYXX/hjYlGLhDQ+/y5RC
GMfoFe2AHtefteSDuh1EHQn1SaOEOIqTWpKiWozLozdYTWD7J3nNZRYCH9J2
ofMaWWexeKLAic5l3IgRuLR41SQuQ5yGnLDA6rty03eG9JM460DdIujr9WZj
b1fpyEaNlBFJ2/iKELNoJyELYCGbQmanU045IXBmoOBpPiN9j+bMpimuPcQB
JYqesoWE/Km2ILsMS5rgRozNThDmSZwD286sbShpU5kybNmZi99cJPdz4X/y
WV7bTNeoQJ8WYVPcR18soiitWMfkugGq33NtbtR+4F9TAwjC/YhpygpRbltM
WHsb6JOoFcKxFZhwiZ43ZYKt9KlrFG2yibDfjKTatCKsPa4OTSMEsAUsHZFs
zlay+RnvDiOF/3Yfs+GeewBbrOoyzy9LRkNP03zO7gXm9X3X1uLZ9aMb5Hpb
R2gFrYk+mwqXi8DQIidri7TEkl7cVmEZx3kl+mMIRimGnT5owdSFKw+sDZMw
ydYc6dqroYNnC27oitIAW/iy7v9L1yKXBgqZrA58zpfI3JM05dqCNT5IvvuW
LcOyDTmN+mB/P3n9raVCpxKItZiia2QBt6C4QqnJE84U3roOJIM43Z9ky1Je
b66srltRdsfZTG6Lhayb9FY8bykZ3ZFmgD0JeE0gn2TLc9LtCXoAyFTvEXSu
yLL6qaj0gdp1JNOBkJBqd9A3VOYs7K3N0eqmXHoOL6PFOYEGcEzl4zDG5I6p
460ZBGsUQU/FxKQjl7Q/Wv6HrmoSehXQXOX1FWVaTzn1oPSpy33U6/3GNYqk
dNJD9cfZQ4PLpfeMYp4qh+h6T7Fs+N63WXODJ9DzX4lrqC+Wp0kHXbnCUkp6
Lp19kButbBcdriX1f83LuSxgSO3X5qvPIi9Y9w2JZv/J1jL14av9GC2E/K4K
biEz2/YyJH5NIszcSDfqZfUufnVpTY1nWfPxu6q89TpPncQolIgqQ5Y11jnA
AnEUp1fyzn+FMZr32fXWIBK9fCDXhuHPuKql71JAxnOdT1ZOyGuQnIpk1irj
/HEJlWpOq4lbt9IvCUUiTPZR4rGoH2cAjg+Uz74Gw3DpQkkbiutooJ+PDx4l
9zXo+rwsk1coU/gI0FZ5wSfDJ0O3COMwOXYBae2box8mAhMAQd/zG1mliowo
q6Xyo5btMnSKGFungFqRVZtSmxRYklUDXXplm7Lrev+0d9OEoLTsVKJVKp9k
SxJHLZNhEWWkuSjVyHBsCc+hOV0mwwYZ9+sWOmrLzdFYlO2UcYPd6ETDWZ6P
XrlbTziQcelyKPlxMNVIeFubGbZ2K7BqyP3Q5r6xbfZf1MvPciTcL/UVaFCI
XNYWiWa0H1cwdl1pXFnB09vIxXVntxal8731iru4yAkvWR3HXpBkeZvcsgKp
z1PFSEfbOUkJim48NdH2yLGu/v0O4xFGyCCp1pupz9Apnxzj9U+lKumC09LU
6s9PjQhCYTIqvlCCXcfNa5JeWVCyUi7jr3l/vs0uU7hxqkBN56oJEbWUEWXF
bQB7ogycqCHoSm00wGyLhEA951brxKq6iVgs7cnheTZz4AWmi7vow78f8B86
EJQg4KIN7xmBgDzFGg04NSdrnwZImYKwzncmIG/DtKg+j4UC59MoWXnorHgu
CD+xunF4NwocszAQTuTOIbuuj5B1X4roSlHohNOwWs6qVO+Ztq2EC5FGyory
bsm7At0Rd7MvPSPjWIus8PV8J+mGAfCE+tRlNl96ijFQA71lQqsc20IA+pMk
FiBEZALlm2bZhAqoRn0zKovhdRK9KmsOamn5gwM/DqyLRp9pTjcTdugyxXl3
GPbIyfUY2DopbJl4R2NyQo5cJWdVGEOv9CAyWxgGasOXnT009xcaORtHsY+O
06rlTlSnBUbjFm2D08htrZmyFSuEmCuuQzlezdPKmNuIMVCZYUfTRZszq+Xp
Nqm01p2u2LL83KpcEj9gwhc6ktB4EpejbcVECREF+o6qy859ZRDGfTYiZ25G
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
c6er3v8F0dYsCGBXAQA=

-->

</rfc>
