<?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.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-04" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-04"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit</organization>
      <address>
        <email>marius@transloadit.com</email>
      </address>
    </author>
    <author initials="G." surname="Zhang" fullname="Guoye Zhang" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>guoye_zhang@apple.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="08"/>
    <area>ART</area>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 65?>

<t>HTTP clients often encounter interrupted data transfers as a result of canceled requests or dropped connections. Prior to interruption, part of a representation may have been exchanged. To complete the data transfer of the entire representation, it is often desirable to issue subsequent requests that transfer only the remainder of the representation. HTTP range requests support this concept of resumable downloads from server to client. This document describes a mechanism that supports resumable uploads from client to server using HTTP.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-resumable-upload/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/resumable-upload"/>.</t>
    </note>
  </front>
  <middle>
    <?line 69?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP clients often encounter interrupted data transfers as a result of canceled requests or dropped connections. Prior to interruption, part of a representation (see <xref section="3.2" sectionFormat="of" target="HTTP"/>) might have been exchanged. To complete the data transfer of the entire representation, it is often desirable to issue subsequent requests that transfer only the remainder of the representation. HTTP range requests (see <xref section="14" sectionFormat="of" target="HTTP"/>) support this concept of resumable downloads from server to client.</t>
      <t>HTTP methods such as POST or PUT can be used by clients to request processing of representation data enclosed in the request message. The transfer of representation data from client to server is often referred to as an upload. Uploads are just as likely as downloads to suffer from the effects of data transfer interruption. Humans can play a role in upload interruptions through manual actions such as pausing an upload. Regardless of the cause of an interruption, servers may have received part of the representation before its occurrence and it is desirable if clients can complete the data transfer by sending only the remainder of the representation. The process of sending additional parts of a representation using subsequent HTTP requests from client to server is herein referred to as a resumable upload.</t>
      <t>Connection interruptions are common and the absence of a standard mechanism for resumable uploads has lead to a proliferation of custom solutions. Some of those use HTTP, while others rely on other transfer mechanisms entirely. An HTTP-based standard solution is desirable for such a common class of problem.</t>
      <t>This document defines an optional mechanism for HTTP that enables resumable uploads in a way that is backwards-compatible with conventional HTTP uploads. When an upload is interrupted, clients can send subsequent requests to query the server state and use this information to send the remaining data. Alternatively, they can cancel the upload entirely. Different from ranged downloads, this protocol does not support transferring different parts of the same representation in parallel.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The terms Byte Sequence, Item, String, Token, Integer, and Boolean are imported from
<xref target="STRUCTURED-FIELDS"/>.</t>
      <t>The terms client and server are from <xref target="HTTP"/>.</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Resumable uploads are supported in HTTP through use of a temporary resource, an <em>upload resource</em>, that is separate from the resource being uploaded to (hereafter, the <em>target resource</em>) 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 an example of a file upload to illustrate different interactions with the upload resource. Note, however, that HTTP message exchanges use representation data (see <xref section="8.1" sectionFormat="of" target="HTTP"/>), which means that resumable uploads can be used with many forms of content -- not just static files.</t>
      <section anchor="example-1-complete-upload-of-file-with-known-size">
        <name>Example 1: Complete upload of file with known size</name>
        <t>In this example, the client first attempts to upload a file with a known size in a single HTTP request to the target resource. An interruption occurs and the client then attempts to resume the upload using subsequent HTTP requests to the upload resource.</t>
        <t>1) The client notifies the server that it wants to begin an upload (<xref target="upload-creation"/>). The server reserves the required resources to accept the upload from the client, and the client begins transferring the entire file in the request content.</t>
        <t>An informational response can be sent to the client, which signals the server's support of resumable upload as well as the upload resource URL via the Location header field (<xref section="10.2.2" sectionFormat="of" target="HTTP"/>).</t>
        <figure anchor="fig-upload-creation">
          <name>Upload Creation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="520" viewBox="0 0 520 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,304" fill="none" stroke="black"/>
                <path d="M 368,48 L 368,304" fill="none" stroke="black"/>
                <path d="M 512,144 L 512,176" fill="none" stroke="black"/>
                <path d="M 16,80 L 360,80" fill="none" stroke="black"/>
                <path d="M 376,144 L 512,144" fill="none" stroke="black"/>
                <path d="M 376,176 L 512,176" fill="none" stroke="black"/>
                <path d="M 16,240 L 360,240" fill="none" stroke="black"/>
                <path d="M 16,288 L 360,288" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,176 372,170.4 372,181.6" fill="black" transform="rotate(180,376,176)"/>
                <polygon class="arrowhead" points="368,288 356,282.4 356,293.6" fill="black" transform="rotate(0,360,288)"/>
                <polygon class="arrowhead" points="368,80 356,74.4 356,85.6" fill="black" transform="rotate(0,360,80)"/>
                <polygon class="arrowhead" points="24,240 12,234.4 12,245.6" fill="black" transform="rotate(180,16,240)"/>
                <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="408" y="116">Reserve</text>
                  <text x="480" y="116">resources</text>
                  <text x="392" y="132">for</text>
                  <text x="436" y="132">upload</text>
                  <text x="120" y="212">104</text>
                  <text x="164" y="212">Upload</text>
                  <text x="236" y="212">Resumption</text>
                  <text x="320" y="212">Supported</text>
                  <text x="124" y="228">with</text>
                  <text x="172" y="228">upload</text>
                  <text x="236" y="228">resource</text>
                  <text x="288" y="228">URL</text>
                  <text x="36" y="276">Flow</text>
                  <text x="104" y="276">Interrupted</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                  Server
|                                            |
| POST                                       |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for upload
|                                            |-----------------.
|                                            |                 |
|                                            |<----------------'
|                                            |
|            104 Upload Resumption Supported |
|            with upload resource URL        |
|<-------------------------------------------|
|                                            |
| Flow Interrupted                           |
|------------------------------------------->|
|                                            |
]]></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 data that the server received before the interruption. It does so by retrieving the offset (<xref target="offset-retrieving"/>) from the upload resource.</t>
        <figure anchor="fig-offset-retrieving">
          <name>Offset Retrieval</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="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="36" y="68">HEAD</text>
                  <text x="68" y="68">to</text>
                  <text x="108" y="68">upload</text>
                  <text x="172" y="68">resource</text>
                  <text x="224" y="68">URL</text>
                  <text x="144" y="116">204</text>
                  <text x="172" y="116">No</text>
                  <text x="216" y="116">Content</text>
                  <text x="268" y="116">with</text>
                  <text x="344" y="116">Upload-Offset</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD to upload resource URL                     |
|------------------------------------------------>|
|                                                 |
|               204 No Content with Upload-Offset |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) The client can resume the upload by sending the remaining file content to the upload resource (<xref target="upload-appending"/>), appending to the already stored data in the upload. The <tt>Upload-Offset</tt> value is included to ensure that the client and server agree on the offset that the upload resumes from.</t>
        <figure anchor="fig-upload-appending">
          <name>Upload Append</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="40" y="68">PATCH</text>
                  <text x="76" y="68">to</text>
                  <text x="116" y="68">upload</text>
                  <text x="180" y="68">resource</text>
                  <text x="232" y="68">URL</text>
                  <text x="268" y="68">with</text>
                  <text x="344" y="68">Upload-Offset</text>
                  <text x="200" y="116">201</text>
                  <text x="248" y="116">Created</text>
                  <text x="292" y="116">on</text>
                  <text x="348" y="116">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH to upload resource URL with Upload-Offset |
|------------------------------------------------>|
|                                                 |
|                      201 Created on completion  |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can instruct the upload resource to delete the upload and free all related resources (<xref target="upload-cancellation"/>).</t>
        <figure anchor="fig-upload-cancellation">
          <name>Upload Cancellation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="416" viewBox="0 0 416 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,144" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,144" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="44" y="68">DELETE</text>
                  <text x="84" y="68">to</text>
                  <text x="124" y="68">upload</text>
                  <text x="188" y="68">resource</text>
                  <text x="240" y="68">URL</text>
                  <text x="184" y="116">204</text>
                  <text x="212" y="116">No</text>
                  <text x="256" y="116">Content</text>
                  <text x="300" y="116">on</text>
                  <text x="356" y="116">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| DELETE to upload resource URL                   |
|------------------------------------------------>|
|                                                 |
|                    204 No Content on completion |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="example-2-upload-as-a-series-of-parts">
        <name>Example 2: Upload as a series of parts</name>
        <t>In some cases, clients might prefer to upload a file as a series of parts sent 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, such as when file data originates from a streaming source.</t>
        <t>This example shows how the client, with prior knowledge about the server's resumable upload support, can upload parts of a file incrementally.</t>
        <t>1) If the client is aware that the server supports resumable upload, it can start an upload with the <tt>Upload-Complete</tt> field value set to false and the first part of the file.</t>
        <figure anchor="fig-upload-creation-incomplete">
          <name>Incomplete Upload Creation</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">POST</text>
                  <text x="76" y="68">with</text>
                  <text x="164" y="68">Upload-Complete:</text>
                  <text x="244" y="68">?0</text>
                  <text x="120" y="116">201</text>
                  <text x="168" y="116">Created</text>
                  <text x="220" y="116">with</text>
                  <text x="308" y="116">Upload-Complete:</text>
                  <text x="388" y="116">?0</text>
                  <text x="120" y="132">and</text>
                  <text x="172" y="132">Location</text>
                  <text x="220" y="132">on</text>
                  <text x="276" y="132">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| POST with Upload-Complete: ?0                   |
|------------------------------------------------>|
|                                                 |
|            201 Created with Upload-Complete: ?0 |
|            and Location on completion           |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>2) Subsequently, parts are appended (<xref target="upload-appending"/>). The last part of the upload has a <tt>Upload-Complete</tt> field value set to true to indicate the complete transfer.</t>
        <figure anchor="fig-upload-appending-last-chunk">
          <name>Upload Append Last Chunk</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,96 L 400,96" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,96 396,90.4 396,101.6" fill="black" transform="rotate(0,400,96)"/>
                <polygon class="arrowhead" points="24,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="40" y="68">PATCH</text>
                  <text x="76" y="68">to</text>
                  <text x="116" y="68">upload</text>
                  <text x="180" y="68">resource</text>
                  <text x="232" y="68">URL</text>
                  <text x="268" y="68">with</text>
                  <text x="72" y="84">Upload-Offset</text>
                  <text x="144" y="84">and</text>
                  <text x="228" y="84">Upload-Complete:</text>
                  <text x="308" y="84">?1</text>
                  <text x="208" y="132">201</text>
                  <text x="256" y="132">Created</text>
                  <text x="300" y="132">on</text>
                  <text x="356" y="132">completion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH to upload resource URL with               |
| Upload-Offset and Upload-Complete: ?1           |
|------------------------------------------------>|
|                                                 |
|                       201 Created on completion |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="upload-creation">
      <name>Upload Creation</name>
      <t>When a resource supports resumable uploads, the first step is creating the upload resource. To be compatible with the widest range of resources, this is accomplished by including the <tt>Upload-Complete</tt> header field in the request that initiates the upload.</t>
      <t>As a consequence, resumable uploads support all HTTP request methods that can carry content, such as <tt>POST</tt>, <tt>PUT</tt>, and <tt>PATCH</tt>. Similarly, the response to the upload request can have any status code. Both the method(s) and status code(s) supported are determined by the resource.</t>
      <t><tt>Upload-Complete</tt> <bcp14>MUST</bcp14> be set to false if the end of the request content is not the end of the upload. Otherwise, it <bcp14>MUST</bcp14> be set to true. This header field can be used for request identification by a server. The request <bcp14>MUST NOT</bcp14> include the <tt>Upload-Offset</tt> header field.</t>
      <t>If the request is valid, the server <bcp14>SHOULD</bcp14> create an upload resource. Then, the server <bcp14>MUST</bcp14> include the <tt>Location</tt> header field in the response and set its value to the URL of the upload resource. The client <bcp14>MAY</bcp14> use this URL for offset retrieval (<xref target="offset-retrieving"/>), upload append (<xref target="upload-appending"/>), and upload cancellation (<xref target="upload-cancellation"/>).</t>
      <t>Once the upload resource is available and while the request content is being uploaded, the target resource <bcp14>MAY</bcp14> send one or more informational responses with a <tt>104 (Upload Resumption Supported)</tt> status code to the client. In the first informational response, the <tt>Location</tt> header field <bcp14>MUST</bcp14> be set to the URL pointing to the upload resource. In subsequent informational responses, the <tt>Location</tt> header field <bcp14>MUST NOT</bcp14> be set. An informational response <bcp14>MAY</bcp14> contain the <tt>Upload-Offset</tt> header field with the current upload offset as the value to inform the client about the upload progress.</t>
      <t>The server <bcp14>MUST</bcp14> send the <tt>Upload-Offset</tt> header field in the response if it considers the upload active, either when the response is a success (e.g. <tt>201 (Created)</tt>), or when the response is a failure (e.g. <tt>409 (Conflict)</tt>). The <tt>Upload-Offset</tt> field value <bcp14>MUST</bcp14> be equal to the end offset of the entire upload, or the begin offset of the next chunk if the upload is still incomplete. The client <bcp14>SHOULD</bcp14> consider the upload failed if the response has a status code that indicates a success but the offset indicated in the <tt>Upload-Offset</tt> field value does not equal the total of begin offset plus the number of bytes uploaded in the request.</t>
      <t>If the request completes successfully and the entire upload is complete, the server <bcp14>MUST</bcp14> acknowledge it by responding with a 2xx (Successful) status code. Servers are <bcp14>RECOMMENDED</bcp14> to use <tt>201 (Created)</tt> unless otherwise specified. The response <bcp14>MUST NOT</bcp14> include the <tt>Upload-Complete</tt> header field with the value of false.</t>
      <t>If the request completes successfully but the entire upload is not yet complete, as indicated by an <tt>Upload-Complete</tt> field value of false in the request, the server <bcp14>MUST</bcp14> acknowledge it by responding with the <tt>201 (Created)</tt> status code and an <tt>Upload-Complete</tt> header value set to false.</t>
      <t>If the request includes an <tt>Upload-Complete</tt> field value set to true and a valid <tt>Content-Length</tt> header field, the client attempts to upload a fixed-length resource in one request. In this case, the upload's final size is the <tt>Content-Length</tt> field value and the server <bcp14>MUST</bcp14> record it to ensure its consistency.</t>
      <t>The server <bcp14>MAY</bcp14> enforce a maximum size of an upload resource. This limit <bcp14>MAY</bcp14> be equal to the upload's final size, if <tt>Upload-Complete: ?1</tt> and <tt>Content-Length</tt> are present in the upload creation request, or an arbitrary value. The limit's value or its existence <bcp14>MUST NOT</bcp14> change throughout the lifetime of the upload resource. The server <bcp14>MAY</bcp14> indicate such a limit to the client by including the <tt>Upload-Limit</tt> header field in the informational or final response to upload creation. If the client receives an <tt>Upload-Limit</tt> header field indicating that the maximum size is less than the amount of bytes it intends to upload to a resource, it <bcp14>SHOULD</bcp14> stop the current upload transfer immediately and cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>The request content <bcp14>MAY</bcp14> be empty. If the <tt>Upload-Complete</tt> header field is then set to true, the client intends to upload an empty resource representation. An <tt>Upload-Complete</tt> header field is set to false is also valid. This can be used to create an upload resource URL before transferring data, which can save client or server resources. Since informational responses are optional, this technique provides another mechanism to learn the URL, at the cost of an additional round-trip before data upload can commence.</t>
      <t>If the server does not receive the entire request content, for example because of canceled requests or dropped connections, it <bcp14>SHOULD</bcp14> append as much of the request content starting at its beginning and without discontinuities as possible. If the server did not append the entire request content, the upload <bcp14>MUST NOT</bcp14> be considered complete.</t>
      <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
Upload-Complete: ?1
Content-Length: 100

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

HTTP/1.1 104 Upload Resumption Supported
Upload-Draft-Interop-Version: 6
Upload-Offset: 50

HTTP/1.1 201 Created
Location: https://example.com/upload/b530ce8ff
Upload-Offset: 100
]]></sourcecode>
      <t>The next example shows an upload creation, where only the first 25 bytes are transferred. The server acknowledges the received data and that the upload is not complete yet:</t>
      <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
Upload-Complete: ?0
Content-Length: 25

[partial content (25 bytes)]
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Location: https://example.com/upload/b530ce8ff
Upload-Complete: ?0
Upload-Offset: 25
Upload-Limit: max-size=1000000000
]]></sourcecode>
      <t>If the client received an informational response with the upload URL in the Location field value, it <bcp14>MAY</bcp14> automatically attempt upload resumption when the connection is terminated unexpectedly, or if a 5xx status is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if it receives a 4xx status code.</t>
      <t>File metadata can affect how servers might act on the uploaded file. Clients can send representation metadata (see <xref section="8.3" sectionFormat="of" target="HTTP"/>) in the request that starts an upload. Servers <bcp14>MAY</bcp14> interpret this metadata or <bcp14>MAY</bcp14> ignore it. The <tt>Content-Type</tt> header field (<xref section="8.3" sectionFormat="of" target="HTTP"/>) can be used to indicate the media type of the file. The content coding of the representation is specified using the <tt>Content-Encoding</tt> header field and is retained throughout the entire upload. When resuming an interrupted upload, the same content coding is used for appending to the upload, producing a representation of the upload resource with one consistent content coding. The <tt>Content-Disposition</tt> header field (<xref target="RFC6266"/>) can be used to transmit a filename; if included, the parameters <bcp14>SHOULD</bcp14> be either <tt>filename</tt>, <tt>filename*</tt> or <tt>boundary</tt>.</t>
      <section anchor="feature-detection">
        <name>Feature Detection</name>
        <t>If the client has no knowledge of whether the resource supports resumable uploads, a resumable request can be used with some additional constraints. In particular, the <tt>Upload-Complete</tt> field value (<xref target="upload-complete"/>) <bcp14>MUST NOT</bcp14> be false if the server support is unclear. This allows the upload to function as if it is a regular upload.</t>
        <t>Servers <bcp14>SHOULD</bcp14> use the <tt>104 (Upload Resumption Supported)</tt> informational response to indicate their support for a resumable upload request.</t>
        <t>Clients <bcp14>MUST NOT</bcp14> attempt to resume an upload unless they receive <tt>104 (Upload Resumption Supported)</tt> informational response, or have other out-of-band methods to determine server support for resumable uploads.</t>
      </section>
      <section anchor="draft-version-identification">
        <name>Draft Version Identification</name>
        <ul empty="true">
          <li>
            <t><strong>RFC Editor's Note:</strong>  Please remove this section and <tt>Upload-Draft-Interop-Version</tt> from all examples prior to publication of a final version of this document.</t>
          </li>
        </ul>
        <t>The current interop version is 6.</t>
        <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to its requests. The <tt>Upload-Draft-Interop-Version</tt> field value is an Integer.</t>
        <t>Server implementations of draft versions of the protocol <bcp14>MUST NOT</bcp14> send a <tt>104 (Upload Resumption Supported)</tt> informational response when the interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field in the request is missing or mismatching.</t>
        <t>Server implementations of draft versions of the protocol <bcp14>MUST</bcp14> also send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to the <tt>104 (Upload Resumption Supported)</tt> informational response.</t>
        <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> ignore a <tt>104 (Upload Resumption Supported)</tt> informational response with missing or mismatching interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
        <t>The reason both the client and the server are sending and checking the draft version is to ensure that implementations of the final RFC will not accidentally interop with draft implementations, as they will not check the existence of the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
      </section>
    </section>
    <section anchor="offset-retrieving">
      <name>Offset Retrieval</name>
      <t>If an upload is interrupted, the client <bcp14>MAY</bcp14> attempt to fetch the offset of the incomplete upload by sending a <tt>HEAD</tt> request to the upload resource.</t>
      <t>The request <bcp14>MUST NOT</bcp14> include an <tt>Upload-Offset</tt> or <tt>Upload-Complete</tt> header field. The server <bcp14>MUST</bcp14> reject requests with either of these fields by responding with a <tt>400 (Bad Request)</tt> status code.</t>
      <t>If the server considers the upload resource to be active, it <bcp14>MUST</bcp14> respond with a <tt>204 (No Content)</tt> or <tt>200 (OK)</tt> status code. The response <bcp14>MUST</bcp14> include the <tt>Upload-Offset</tt> header field, with the value set to the current resumption offset for the target resource. The response <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field; the value is set to true only if the upload is complete. The response <bcp14>MAY</bcp14> include the <tt>Upload-Limit</tt> header field if corresponding limits on the upload resource exist.</t>
      <t>An upload is considered complete only if the server completely and successfully received a corresponding creation request (<xref target="upload-creation"/>) or append request (<xref target="upload-appending"/>) with the <tt>Upload-Complete</tt> header value set to true.</t>
      <t>The client <bcp14>MUST NOT</bcp14> perform offset retrieval while creation (<xref target="upload-creation"/>) or append (<xref target="upload-appending"/>) is in progress.</t>
      <t>The offset <bcp14>MUST</bcp14> be accepted by a subsequent append (<xref target="upload-appending"/>). Due to network delay and reordering, the server might still be receiving data from an ongoing transfer for the same upload resource, which in the client's perspective has failed. The server <bcp14>MAY</bcp14> terminate any transfers for the same upload resource before sending the response by abruptly terminating the HTTP connection or stream. Alternatively, the server <bcp14>MAY</bcp14> keep the ongoing transfer alive but ignore further bytes received past the offset.</t>
      <t>The client <bcp14>MUST NOT</bcp14> start more than one append (<xref target="upload-appending"/>) based on the resumption offset from a single offset retrieving request.</t>
      <t>In order to prevent HTTP caching, the response <bcp14>SHOULD</bcp14> include a <tt>Cache-Control</tt> header field with the value <tt>no-store</tt>.</t>
      <t>If the server does not consider the upload resource to be active, it <bcp14>MUST</bcp14> respond with a <tt>404 (Not Found)</tt> status code.</t>
      <t>The resumption offset can be less than or equal to the number of bytes the client has already sent. The client <bcp14>MAY</bcp14> reject an offset which is greater than the number of bytes it has already sent during this upload. The client is expected to handle backtracking of a reasonable length. If the offset is invalid for this upload, or if the client cannot backtrack to the offset and reproduce the same content it has already sent, the upload <bcp14>MUST</bcp14> be considered a failure. The client <bcp14>MAY</bcp14> cancel the upload (<xref target="upload-cancellation"/>) after rejecting the offset.</t>
      <t>The following example shows an offset retrieval request. The server indicates the new offset and that the upload is not complete yet:</t>
      <sourcecode type="http-message"><![CDATA[
HEAD /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Offset: 100
Upload-Complete: ?0
Cache-Control: no-store
]]></sourcecode>
      <t>The client <bcp14>SHOULD NOT</bcp14> automatically retry if a 4xx (Client Error) status code is received.</t>
    </section>
    <section anchor="upload-appending">
      <name>Upload Append</name>
      <t>Upload appending is used for resuming an existing upload.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>PATCH</tt> method with the <tt>application/partial-upload</tt> media type and <bcp14>MUST</bcp14> be sent to the upload resource. The <tt>Upload-Offset</tt> field value (<xref target="upload-offset"/>) <bcp14>MUST</bcp14> be set to the resumption offset.</t>
      <t>If the end of the request content is not the end of the upload, the <tt>Upload-Complete</tt> field value (<xref target="upload-complete"/>) <bcp14>MUST</bcp14> be set to false.</t>
      <t>The server <bcp14>SHOULD</bcp14> respect representation metadata received during creation (<xref target="upload-creation"/>). An upload append request continues uploading the same representation as used in the upload creation (<xref target="upload-creation"/>) and thus uses the same content coding, if one was applied. For example, if the initial upload creation included the <tt>Content-Encoding: gzip</tt> header field, the upload append request resumes the transfer of the gzipped data without indicating again that the gzip coding is applied.</t>
      <t>If the server does not consider the upload associated with the upload resource active, it <bcp14>MUST</bcp14> respond with a <tt>404 (Not Found)</tt> status code.</t>
      <t>The client <bcp14>MUST NOT</bcp14> perform multiple upload transfers for the same upload resource in parallel. This helps avoid race conditions, and data loss or corruption. The server is <bcp14>RECOMMENDED</bcp14> to take measures to avoid parallel upload transfers: The server <bcp14>MAY</bcp14> terminate any creation (<xref target="upload-creation"/>) or append for the same upload URL. Since the client is not allowed to perform multiple transfers in parallel, the server can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
      <t>If the offset indicated by the <tt>Upload-Offset</tt> field value does not match the offset provided by the immediate previous offset retrieval (<xref target="offset-retrieving"/>), or the end offset of the immediate previous incomplete successful transfer, the server <bcp14>MUST</bcp14> respond with a <tt>409 (Conflict)</tt> status code. The server <bcp14>MAY</bcp14> use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" in the response; see <xref target="mismatching-offset"/>.</t>
      <t>The server applies the patch document of the <tt>application/partial-upload</tt> media type by appending the request content to the targeted upload resource. If the server does not receive the entire patch document, for example because of canceled requests or dropped connections, it <bcp14>SHOULD</bcp14> append as much of the patch document starting at its beginning and without discontinuities as possible. Appending a continuous section starting at the patch document's beginning constitutes a successful PATCH as defined in <xref section="2" sectionFormat="of" target="RFC5789"/>. If the server did not receive and apply the entire patch document, the upload <bcp14>MUST NOT</bcp14> be considered complete.</t>
      <t>While the request content is being uploaded, the target resource <bcp14>MAY</bcp14> send one or more informational responses with a <tt>104 (Upload Resumption Supported)</tt> status code to the client. These informational responses <bcp14>MUST NOT</bcp14> contain the <tt>Location</tt> header field. They <bcp14>MAY</bcp14> include the <tt>Upload-Offset</tt> header field with the current upload offset as the value to inform the client about the upload progress.</t>
      <t>The server <bcp14>MUST</bcp14> send the <tt>Upload-Offset</tt> header field in the response if it considers the upload active, either when the response is a success (e.g. <tt>201 (Created)</tt>), or when the response is a failure (e.g. <tt>409 (Conflict)</tt>). The value <bcp14>MUST</bcp14> be equal to the end offset of the entire upload, or the begin offset of the next chunk if the upload is still incomplete. The client <bcp14>SHOULD</bcp14> consider the upload failed if the status code indicates a success but the offset indicated by the <tt>Upload-Offset</tt> field value does not equal the total of begin offset plus the number of bytes uploaded in the request.</t>
      <t>If the upload is already complete, the server <bcp14>MUST NOT</bcp14> modify the upload resource and <bcp14>MUST</bcp14> respond with a <tt>400 (Bad Request)</tt> status code. The server <bcp14>MAY</bcp14> use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#completed-upload" in the response; see <xref target="completed-upload"/>.</t>
      <t>If the request completes successfully and the entire upload is complete, the server <bcp14>MUST</bcp14> acknowledge it by responding with a 2xx (Successful) status code. Servers are <bcp14>RECOMMENDED</bcp14> to use a <tt>201 (Created)</tt> response if not otherwise specified. The response <bcp14>MUST NOT</bcp14> include the <tt>Upload-Complete</tt> header field with the value set to false.</t>
      <t>If the request completes successfully but the entire upload is not yet complete indicated by the <tt>Upload-Complete</tt> field value set to false, the server <bcp14>MUST</bcp14> acknowledge it by responding with a <tt>201 (Created)</tt> status code and the <tt>Upload-Complete</tt> field value set to true.</t>
      <t>If the request includes the <tt>Upload-Complete</tt> field value set to true and a valid <tt>Content-Length</tt> header field, the client attempts to upload the remaining resource in one request. In this case, the upload's final size is the sum of the upload's offset and the <tt>Content-Length</tt> header field. If the server does not have a record of the upload's final size from creation or the previous append, the server <bcp14>MUST</bcp14> record the upload's final size to ensure its consistency. If the server does have a previous record, that value <bcp14>MUST</bcp14> match the upload's final size. If they do not match, the server <bcp14>MUST</bcp14> reject the request with a <tt>400 (Bad Request)</tt> status code.</t>
      <t>The request content <bcp14>MAY</bcp14> be empty. If the <tt>Upload-Complete</tt> field is then set to true, the client wants to complete the upload without appending additional data.</t>
      <t>The following example shows an upload append. The client transfers the next 100 bytes at an offset of 100 and does not indicate that the upload is then completed. The server acknowledges the new offset:</t>
      <sourcecode type="http-message"><![CDATA[
PATCH /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Offset: 100
Upload-Draft-Interop-Version: 6
Content-Length: 100
Content-Type: application/partial-upload

[content (100 bytes)]
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Upload-Offset: 200
]]></sourcecode>
      <t>The client <bcp14>MAY</bcp14> automatically attempt upload resumption when the connection is terminated unexpectedly, or if a 5xx (Server Error) status code is received. The client <bcp14>SHOULD NOT</bcp14> automatically retry if a 4xx (Client Error) status code is received.</t>
    </section>
    <section anchor="upload-cancellation">
      <name>Upload Cancellation</name>
      <t>If the client wants to terminate the transfer without the ability to resume, it can send a <tt>DELETE</tt> request to the upload resource. Doing so is an indication that the client is no longer interested in continuing the upload, and that the server can release any resources associated with it.</t>
      <t>The client <bcp14>MUST NOT</bcp14> initiate cancellation without the knowledge of server support.</t>
      <t>The request <bcp14>MUST</bcp14> use the <tt>DELETE</tt> method. The request <bcp14>MUST NOT</bcp14> include an <tt>Upload-Offset</tt> or <tt>Upload-Complete</tt> header field. The server <bcp14>MUST</bcp14> reject the request with a <tt>Upload-Offset</tt> or <tt>Upload-Complete</tt> header field with a <tt>400 (Bad Request)</tt> status code.</t>
      <t>If the server successfully deactivates the upload resource, it <bcp14>MUST</bcp14> respond with a <tt>204 (No Content)</tt> status code.</t>
      <t>The server <bcp14>MAY</bcp14> terminate any in-flight requests to the upload resource before sending the response by abruptly terminating their HTTP connection(s) or stream(s).</t>
      <t>If the server does not consider the upload resource to be active, it <bcp14>MUST</bcp14> respond with a <tt>404 (Not Found)</tt> status code.</t>
      <t>If the server does not support cancellation, it <bcp14>MUST</bcp14> respond with a <tt>405 (Method Not Allowed)</tt> status code.</t>
      <t>The following example shows an upload cancellation:</t>
      <sourcecode type="http-message"><![CDATA[
DELETE /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 6
]]></sourcecode>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
]]></sourcecode>
    </section>
    <section anchor="header-fields">
      <name>Header Fields</name>
      <section anchor="upload-offset">
        <name>Upload-Offset</name>
        <t>The <tt>Upload-Offset</tt> request and response header field indicates the resumption offset of corresponding upload, counted in bytes. The <tt>Upload-Offset</tt> field value is an Integer.</t>
      </section>
      <section anchor="upload-limit">
        <name>Upload-Limit</name>
        <t>The <tt>Upload-Limit</tt> response header field indicates limits applying the upload resource. The <tt>Upload-Limit</tt> field value is a Dictionary. The following limits are defined:</t>
        <ul spacing="normal">
          <li>
            <t>The <tt>max-size</tt> key specifies a maximum size that an upload resource is allowed to reach, counted in bytes. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>min-size</tt> key specifies a minimum size for a resumable upload, counted in bytes. The server will not create an upload resource if the client indicates that the uploaded data is smaller than the minimum size. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>max-append-size</tt> key specifies a maximum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server <bcp14>MAY</bcp14> reject requests exceeding this limit and a client <bcp14>SHOULD NOT</bcp14> send larger upload append requests. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>min-append-size</tt> key specifies a minimum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server <bcp14>MAY</bcp14> reject requests below this limit and a client <bcp14>SHOULD NOT</bcp14> send smaller upload append requests. The value is an Integer.</t>
          </li>
          <li>
            <t>The <tt>expires</tt> key specifies the remaining lifetime of the upload resource in seconds counted from the generation of the response by the server. After the resource's lifetime is reached, the server <bcp14>MAY</bcp14> make the upload resource inaccessible and a client <bcp14>SHOULD NOT</bcp14> attempt to access the upload resource. The lifetime <bcp14>MAY</bcp14> be extended but <bcp14>SHOULD NOT</bcp14> be reduced once the upload resource is created. The value is an Integer.</t>
          </li>
        </ul>
        <t>When parsing this header field, unrecognized keys <bcp14>MUST</bcp14> be ignored and <bcp14>MUST NOT</bcp14> fail the parsing to facilitate the addition of new limits in the future.</t>
      </section>
      <section anchor="upload-complete">
        <name>Upload-Complete</name>
        <t>The <tt>Upload-Complete</tt> request and response header field indicates whether the corresponding upload is considered complete. The <tt>Upload-Complete</tt> field value is a Boolean.</t>
        <t>The <tt>Upload-Complete</tt> header field <bcp14>MUST</bcp14> only be used if support by the resource is known to the client (<xref target="feature-detection"/>).</t>
      </section>
    </section>
    <section anchor="media-type-applicationpartial-upload">
      <name>Media Type <tt>application/partial-upload</tt></name>
      <t>The <tt>application/partial-upload</tt> media type describes a contiguous block of data that should be uploaded to a resource. There is no minimum block size and the block might be empty. The start and end of the block might align with the start and end of the file that should be uploaded, but they are not required to be aligned.</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 <bcp14>MAY</bcp14> use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the <tt>Upload-Offset</tt> header field in the request does not match the upload resource's offset.</t>
        <t>Two problem type extension members are defined: the <tt>expected-offset</tt> and <tt>provided-offset</tt> members. A response using this problem type <bcp14>SHOULD</bcp14> populate both members, with the value of <tt>expected-offset</tt> taken from the upload resource and the value of <tt>provided-offset</tt> taken from the upload append request.</t>
        <t>The following example shows an example response, where the resource's offset was 100, but the client attempted to append at offset 200:</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 409 Conflict
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 100,
  "provided-offset": 200
}
]]></sourcecode>
      </section>
      <section anchor="completed-upload">
        <name>Completed Upload</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#completed-upload" problem type <xref target="PROBLEM"/>. A server <bcp14>MAY</bcp14> use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the upload has already been completed and cannot be modified.</t>
        <t>The following example shows an example response:</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#completed-upload",
  "title": "upload is already completed"
}

]]></sourcecode>
      </section>
    </section>
    <section anchor="offset-values">
      <name>Offset values</name>
      <t>The offset of an upload resource is the number of bytes that have been appended to the upload resource. Appended data cannot be removed from an upload and, therefore, the upload offset <bcp14>MUST NOT</bcp14> decrease. A server <bcp14>MUST NOT</bcp14> generate responses containing an <tt>Upload-Offset</tt> header field with a value that is smaller than was included in previous responses for the same upload resource. This includes informational and final responses for upload creation (<xref target="upload-creation"/>), upload appending (<xref target="upload-appending"/>), and offset retrieval (<xref target="offset-retrieving"/>).</t>
      <t>If a server loses data that has been appended to an upload, it <bcp14>MUST</bcp14> consider the upload resource invalid and reject further use of the upload resource. The <tt>Upload-Offset</tt> header field in responses serves as an acknowledgement of the append operation and as a guarantee that no retransmission of the data will be necessary. Client can use this guarantee to free resources associated to already uploaded data while the upload is still ongoing.</t>
    </section>
    <section anchor="redirection">
      <name>Redirection</name>
      <t>The <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes <bcp14>MUST NOT</bcp14> be used in offset retrieval (<xref target="offset-retrieving"/>) and upload cancellation (<xref target="upload-cancellation"/>) responses. For other responses, the upload resource <bcp14>MAY</bcp14> return a <tt>308 (Permanent Redirect)</tt> status code and clients <bcp14>SHOULD</bcp14> use new permanent URI for subsequent requests. If the client receives a <tt>307 (Temporary Redirect)</tt> response to an offset retrieval (<xref target="offset-retrieving"/>) request, it <bcp14>MAY</bcp14> apply the redirection directly in an immediate subsequent upload append (<xref target="upload-appending"/>).</t>
    </section>
    <section anchor="transfer-and-content-codings">
      <name>Transfer and Content Codings</name>
      <t>A message might have a content coding, indicated by the <tt>Content-Encoding</tt> header field, and/or a transfer coding, indicated by the <tt>Transfer-Encoding</tt> header field (<xref section="6.1" sectionFormat="of" target="RFC9112"/>), applied, which modify the representation of uploaded data in a message. For correct interoperability, the client and server must share the same logic when counting bytes for the upload offset. From the client's perspective, the offset is counted after content coding but before transfer coding is applied. From the server's perspective, the offset is counted after the content's transfer coding is reversed but before the content coding is reversed.</t>
    </section>
    <section anchor="integrity-digests">
      <name>Integrity Digests</name>
      <t>The integrity of an entire upload or individual upload requests can be verifying using digests from <xref target="DIGEST-FIELDS"/>.</t>
      <t>If the client knows the integrity digest of the entire data before creating an upload resource, it <bcp14>MAY</bcp14> include the <tt>Repr-Digest</tt> header field when creating an upload (<xref target="upload-creation"/>). Once the upload is completed, the server can compute the integrity digest of the received upload representation and compare it to the provided digest. If the digests don't match the server <bcp14>SHOULD</bcp14> consider the transfer failed and not process the uploaded data further. This way, the integrity of the entire uploaded data can be protected.</t>
      <t>If the client knows the integrity digest of the content from an upload creation (<xref target="upload-creation"/>) or upload appending (<xref target="upload-appending"/>) request, it <bcp14>MAY</bcp14> include the <tt>Content-Digest</tt> header field in the request. Once the content has been received, the server can compute the integrity digest of the received content and compare it to the provided digest. If the digests don't match the server <bcp14>SHOULD</bcp14> consider the transfer failed and not append the content to the upload resource. This way, the integrity of an individual request can be protected.</t>
    </section>
    <section anchor="subsequent-resources">
      <name>Subsequent Resources</name>
      <t>The server might process the uploaded data and make its results available in another resource during or after the upload. This subsequent resource is different from the upload resource created by the upload creation request (<xref target="upload-creation"/>). The subsequent resource does not handle the upload process itself, but instead facilitates further interaction with the uploaded data. The server <bcp14>MAY</bcp14> indicate the location of this subsequent resource by including the <tt>Content-Location</tt> header field in informational or final responses generated while creating (<xref target="upload-creation"/>), appending to (<xref target="upload-appending"/>), or retrieving the offset (<xref target="offset-retrieving"/>) of an upload. For example, a subsequent resource could allow the client to fetch information extracted from the uploaded data.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The upload resource URL is the identifier used for modifying the upload. Without further protection of this URL, an attacker may obtain information about an upload, append data to it, or cancel it. To prevent this, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can access the upload resource. In addition, the upload resource URL <bcp14>SHOULD</bcp14> be generated in such a way that makes it hard to be guessed by unauthorized clients.</t>
      <t>Some servers or intermediaries provide scanning of content uploaded by clients. Any scanning mechanism that relies on receiving a complete file 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 a full file, or disabling resumable uploads.</t>
      <t>Resumable uploads are vulnerable to Slowloris-style attacks <xref target="SLOWLORIS"/>. A malicious client may create upload resources and keep them alive by regularly sending <tt>PATCH</tt> requests with no or small content to the upload resources. This could be abused to exhaust server resources by creating and holding open uploads indefinitely with minimal work.</t>
      <t>Servers <bcp14>SHOULD</bcp14> provide mitigations for Slowloris attacks, such as increasing the maximum number of clients the server will allow, limiting the number of uploads a single client is allowed to make, imposing restrictions on the minimum transfer speed an upload is allowed to have, and restricting the length of time an upload resource can exist.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <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">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Upload-Complete</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-complete"/> of this document</td>
          </tr>
          <tr>
            <td align="left">Upload-Offset</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-offset"/> of this document</td>
          </tr>
          <tr>
            <td align="left">Upload-Limit</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="upload-limit"/> of this document</td>
          </tr>
        </tbody>
      </table>
      <t>IANA is asked to register the following entry in the "HTTP Status Codes" registry:</t>
      <dl>
        <dt>Value:</dt>
        <dd>
          <t>104 (suggested value)</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Upload Resumption Supported</t>
        </dd>
        <dt>Specification:</dt>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
      <t>IANA is asked to register the following entry in the "Media Types" registry:</t>
      <dl>
        <dt>Type name:</dt>
        <dd>
          <t>application</t>
        </dd>
        <dt>Subtype name:</dt>
        <dd>
          <t>partial-upload</t>
        </dd>
        <dt>Required parameters:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Optional parameters:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Encoding considerations:</dt>
        <dd>
          <t>binary</t>
        </dd>
        <dt>Security considerations:</dt>
        <dd>
          <t>see <xref target="security-considerations"/> of this document</t>
        </dd>
        <dt>Interoperability considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Published specification:</dt>
        <dd>
          <t>This document</t>
        </dd>
        <dt>Applications that use this media type:</dt>
        <dd>
          <t>Applications that transfer files over unreliable networks or want pause- and resumable uploads.</t>
        </dd>
        <dt>Fragment identifier considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
      </dl>
      <t>Additional information:</t>
      <ul spacing="normal">
        <li>
          <t>Deprecated alias names for this type: N/A</t>
        </li>
        <li>
          <t>Magic number(s): N/A</t>
        </li>
        <li>
          <t>File extension(s): N/A</t>
        </li>
        <li>
          <t>Macintosh file type code(s): N/A</t>
        </li>
        <li>
          <t>Windows Clipboard Name: N/A</t>
        </li>
      </ul>
      <dl>
        <dt>Person and email address to contact for further information:</dt>
        <dd>
          <t>See the Authors' Addresses section of this document.</t>
        </dd>
        <dt>Intended usage:</dt>
        <dd>
          <t>COMMON</t>
        </dd>
        <dt>Restrictions on usage:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Author:</dt>
        <dd>
          <t>See the Authors' Addresses section of this document.</t>
        </dd>
        <dt>Change controller:</dt>
        <dd>
          <t>IETF</t>
        </dd>
      </dl>
      <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
Title:</t>
        </dd>
        <dt/>
        <dd>
          <t>Mismatching Upload Offset
Recommended HTTP status code:</t>
        </dd>
        <dt/>
        <dd>
          <t>409
Reference:</t>
        </dd>
        <dt/>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
      <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
      <dl>
        <dt>Type URI:</dt>
        <dd>
          <t>https://iana.org/assignments/http-problem-types#completed-upload
Title:</t>
        </dd>
        <dt/>
        <dd>
          <t>Upload Is Completed
Recommended HTTP status code:</t>
        </dd>
        <dt/>
        <dd>
          <t>400
Reference:</t>
        </dd>
        <dt/>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <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="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="RFC5789">
          <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="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>
        <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="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="RFC6266">
          <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="DIGEST-FIELDS">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
      </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>
      </references>
    </references>
    <?line 646?>

<section anchor="informational-response">
      <name>Informational Response</name>
      <t>The server is allowed to respond to upload creation (<xref target="upload-creation"/>) requests with a <tt>104 (Upload Resumption Supported)</tt> intermediate response as soon as the server has validated the request. This way, the client knows that the server supports resumable uploads before the complete response is received. The benefit is the clients can defer starting the actual data transfer until the server indicates full support (i.e. resumable are supported, the provided upload URL is active etc).</t>
      <t>On the contrary, support for intermediate responses (the <tt>1XX</tt> range) in existing software is limited or not at all present. Such software includes proxies, firewalls, browsers, and HTTP libraries for clients and server. Therefore, the <tt>104 (Upload Resumption Supported)</tt> status code is optional and not mandatory for the successful completion of an upload. Otherwise, it might be impossible in some cases to implement resumable upload servers using existing software packages. Furthermore, as parts of the current internet infrastructure currently have limited support for intermediate responses, a successful delivery of a <tt>104 (Upload Resumption Supported)</tt> from the server to the client should be assumed.</t>
      <t>We hope that support for intermediate responses increases in the near future, to allow a wider usage of <tt>104 (Upload Resumption Supported)</tt>.</t>
    </section>
    <section anchor="changes-feature-detection">
      <name>Feature Detection</name>
      <t>This specification includes a section about feature detection (it was called service discovery in earlier discussions, but this name is probably ill-suited). The idea is to allow resumable uploads to be transparently implemented by HTTP clients. This means that application developers just keep using the same API of their HTTP library as they have done in the past with traditional, non-resumable uploads. Once the HTTP library gets updated (e.g. because mobile OS or browsers start implementing resumable uploads), the HTTP library can transparently decide to use resumable uploads without explicit configuration by the application developer. Of course, in order to use resumable uploads, the HTTP library needs to know whether the server supports resumable uploads. If no support is detected, the HTTP library should use the traditional, non-resumable upload technique. We call this process feature detection.</t>
      <t>Ideally, the technique used for feature detection meets following <strong>criteria</strong> (there might not be one approach which fits all requirements, so we have to prioritize them):</t>
      <ol spacing="normal" type="1"><li>
          <t>Avoid additional roundtrips by the client, if possible (i.e. an additional HTTP request by the client should be avoided).</t>
        </li>
        <li>
          <t>Be backwards compatible to HTTP/1.1 and existing network infrastructure: This means to avoid using new features in HTTP/2, or features which might require changes to existing network infrastructure (e.g. nginx or HTTP libraries)</t>
        </li>
        <li>
          <t>Conserve the user's privacy (i.e. the feature detection should not leak information to other third-parties about which URLs have been connected to)</t>
        </li>
      </ol>
      <t>Following <strong>approaches</strong> have already been considered in the past. All except the last approaches have not been deemed acceptable and are therefore not included in the specification. This follow list is a reference for the advantages and disadvantages of some approaches:</t>
      <t><strong>Include a support statement in the SETTINGS frame.</strong> The SETTINGS frame is a HTTP/2 feature and is sent by the server to the client to exchange information about the current connection. The idea was to include an additional statement in this frame, so the client can detect support for resumable uploads without an additional roundtrip. The problem is that this is not compatible with HTTP/1.1. Furthermore, the SETTINGS frame is intended for information about the current connection (not bound to a request/response) and might not be persisted when transmitted through a proxy.</t>
      <t><strong>Include a support statement in the DNS record.</strong> The client can detect support when resolving a domain name. Of course, DNS is not semantically the correct layer. Also, DNS might not be involved if the record is cached or retrieved from a hosts files.</t>
      <t><strong>Send a HTTP request to ask for support.</strong> This is the easiest approach where the client sends an OPTIONS request and uses the response to determine if the server indicates support for resumable uploads. An alternative is that the client sends the request to a well-known URL to obtain this response, e.g. <tt>/.well-known/resumable-uploads</tt>. Of course, while being fully backwards-compatible, it requires an additional roundtrip.</t>
      <t><strong>Include a support statement in previous responses.</strong> In many cases, the file upload is not the first time that the client connects to the server. Often additional requests are sent beforehand for authentication, data retrieval etc. The responses for those requests can also include a header field which indicates support for resumable uploads. There are two options:
- Use the standardized <tt>Alt-Svc</tt> response header field. However, it has been indicated to us that this header field might be reworked in the future and could also be semantically different from our intended usage.
- Use a new response header field <tt>Resumable-Uploads: https://example.org/files/*</tt> to indicate under which endpoints support for resumable uploads is available.</t>
      <t><strong>Send a 104 intermediate response to indicate support.</strong> The clients normally starts a traditional upload and includes a header field indicate that it supports resumable uploads (e.g. <tt>Upload-Offset: 0</tt>). If the server also supports resumable uploads, it will immediately respond with a 104 intermediate response to indicate its support, before further processing the request. This way the client is informed during the upload whether it can resume from possible connection errors or not. While an additional roundtrip is avoided, the problem with that solution is that many HTTP server libraries do not support sending custom 1XX responses and that some proxies may not be able to handle new 1XX status codes correctly.</t>
      <t><strong>Send a 103 Early Hint response to indicate support.</strong> This approach is the similar to the above one, with one exception: Instead of a new <tt>104 (Upload Resumption Supported)</tt> status code, the existing <tt>103 (Early Hint)</tt> status code is used in the intermediate response. The 103 code would then be accompanied by a header field indicating support for resumable uploads (e.g. <tt>Resumable-Uploads: 1</tt>). It is unclear whether the Early Hints code is appropriate for that, as it is currently only used to indicate resources for prefetching them.</t>
    </section>
    <section anchor="upload-metadata">
      <name>Upload Metadata</name>
      <t>When an upload is created (<xref target="upload-creation"/>), the <tt>Content-Type</tt> and <tt>Content-Disposition</tt> header fields are allowed to be included. They are intended to be a standardized way of communicating the file name and file type, if available. However, this is not without controversy. Some argue that since these header fields are already defined in other specifications, it is not necessary to include them here again. Furthermore, the <tt>Content-Disposition</tt> header field's format is not clearly enough defined. For example, it is left open which disposition value should be used in the header field. There needs to be more discussion whether this approach is suited or not.</t>
      <t>However, from experience with the tus project, users are often asking for a way to communicate the file name and file type. Therefore, we believe it is help to explicitly include an approach for doing so.</t>
    </section>
    <section anchor="faq">
      <name>FAQ</name>
      <ul spacing="normal">
        <li>
          <t><strong>Are multipart requests supported?</strong> Yes, requests whose content is encoded using the <tt>multipart/form-data</tt> are implicitly supported. The entire encoded content can be considered as a single file, which is then uploaded using the resumable protocol. The server, of course, must store the delimiter ("boundary") separating each part and must be able to parse the multipart format once the upload is completed.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document is based on an Internet-Draft specification written by Jiten Mehta, Stefan Matsson, and the authors of this document.</t>
      <t>The <eref target="https://tus.io/">tus v1 protocol</eref> is a specification for a resumable file upload protocol over HTTP. It inspired the early design of this protocol. Members of the tus community helped significantly in the process of bringing this work to the IETF.</t>
      <t>The authors would like to thank Mark Nottingham for substantive contributions to the text.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <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>
  </back>
  <!-- ##markdown-source:
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
T+44wG+aK/jyo4C9v/dY/Bcc3mLGdeq0i8bjxCS7cN6P3lrglp8PQJTn6IM/
CryFWx//WbEWSHXw/iD5Yp4tRg2eycGE73YEtE/k452fBoOH95IjcbF4W194
k3cZRFZiwCfZC4ncu1NyjJMXKvrF48KmIdhmpbVksQaDFcawWwqFHrsUluiP
9e4o8jSGrF88PW5w0/BUHdVs/NkS3TNe86JHRU/r0cy8jGgLtrtzRfr5ENao
qJO8eHb4NFATutC9+c4d0O2DcM6tLf55CET8ukTjmPQqIlLGvNExg/yOdEk/
H7a2kChap6xkIas64S/SHOniUaS7sK7f1IsCj1/s2SD9QPXKbvWoX8XXv/TF
NAdyncFUdVlpOEJ0D6UyXOl5BOLzBPaxNky703wtVpIp7JoIRQipw/7DCCK6
zgIKcY/7PQAk2MP4majhzeHZkxd95NCNcZ+JGuTn4d4+812DLhL1IyOz/UzU
0ES+how4pM+REh57CcHHm7EzjTgtaL5s9OuGhBZ4dIonTcllDxbketrEIj4y
OMWZcU51VWwL1NKNIa9RZXICnNfqt5m8nwMfnz57+ezs2e3582fGxwaLjhHy
s+JjeJxNtSX4ChEzsMofHqjaSJEM4GVoaKJTHl26ZIlbjBtMU2us93Oz+rKi
SEjbBO8aim03/BDwcgOWZQWKTLJc53W2UrtcfBt2nBwXHKHAaZFsYIoScIzy
OYTf5tmSolBF7BdR4YGWP1ryHMgIx7pGh1dIls7L7dSneYbWJw4xdNE29Mzy
9kiQlFUGli4Ql8SLMHIDXGpJBr+qO2eBE4OcthZdOrH5iix3RRFunD43swVG
hMp1HduyLQNWjNshsQn5LAh5iaUNiiy6qxHm7FdocaT0Og0Fm8Yl+tIHHGey
NUYJ/dzOl6XyVL0952Iws1wlsVgmczDWjXMesE8nDDvi8j+XhER7OpSEupGD
5Hd73e98Do4UysXe1TbeQXg7b0ZDmIbzfEYuJhbWCFDXRYyZmR35T7rNsVPn
Z8N4GNMC4jZLatPnHGYtME8bGChofUHM7FY4DYKaMz5gZMwQFeNQdyEusX9a
va/9TqwJIvK0cWw/fudzUELw068s/nPoiiNEs9H0Yl1cdqqNyUtEwyf4PQnq
JqYn779oenUHA45N+xPtT/0aBtwW9M8V8n8eKNI+A1f4GYU4m4FyfPQ6m6H3
lvOQ2MPKKubQ+SrSKR1AZi84J4gNKp2rTVORf7XhJWaHN2VZ1ib02aLf2FJW
QWFdFLAdy1BfMGrFURBAc5poAo6fV9VG9Qgv/89RLpwP4d+3+A9SwzkR1fk4
OQVdJE8rCcN7t3XTghWHN0xCCTcYTcGAyRqzsmYA7e9LAS4vatdK7M0/gx/5
mCFyt5nBiGRWMIjDYB9Apg1jCg1PGnI409S2mU+3iZzzaro0nlIz+hiVrOvM
GtIOGlMgW5TExeiAw+gSp7jwlIBXBQY8RExNNqxMAutjTq3PaZBb7fQIqdSY
D2cEeBzFu4MlAQfPxDUnqo/EtYkuTKDgBEShQXp9hZYSLUOlbB9SC4Kw/6Cm
fCqWJYIyyJVjQRRNr/rbq8M/+cQRfAcBKc6HSr0y/SFUVduZ92yLncqTkZGx
zZQ8xoSmLpsV2cJVCtSCxIkjc/pRD87F4ephV7iOYEBJMiUYDbD9JSWodcaR
rEYHz9FfvrvFYX7vPKS6OOY0To6KgJF2TzXcigdNEpETX5VZUQcerNbRoznm
o4k9m7zF1Eg2PL1EOzujbghZPIxU0HYbcXnBoNF8F+Rl7YF5tkNynjLypTmj
R62ZqlzAWqwE40Nac0lRW5fUpDZgcxmhlwUeU0WBP4zIX8GhmYzsRTL24nfJ
pl1PKeFw14wX4+QctY1dUTfunQOllL1vzgHl0YEobz7e+xbeLIt5nk1reLXb
ExnqmIoxcPRwRIIfzIrDpAmJs6qthnnTF0aCw/GThXkHsCBNJIsYDWY51BmI
Sa+CRzxH+aOAMYoOwy7RqzWPIcA6dERPLM1ZTw4hOxEUkLXqI+4st4HI2fEC
I+QVJZi+uOMIAqt8zYdfrJcTTu6YbHAdLi8mVj7agkMBY3Xh8zV5NQQro1Mg
JUueb0uNdOrNfkBOCrYg2GYumSZNHr57l+yeuonuxUrDqeTxojIQJFiRrg/A
b2Bpsi44PVhFtmb2mJmKV6X+bfK1R2lzTIBPBBM8UMG4NQD1+FsAxGPFMh0P
yNQG2IFKQnGDlaaLaRzuhxwJQaIB1xC9EQ861yPAartCOnQThrq9eWOh+Ukz
s1KTnIuXcvTSFIv6Ij6qKBrZk03zzsxGOb0byO+C5KxSRqKpOuhdGwa84Esb
eNHIhYcwa64o3IYST3gUlZmWFeWW+xgM6krEfMCCKaabhnQAkWVQtGBWerJM
32XL9ZLXwDnwHdpUZtmZSC83WWzHbobI4JpHgqbwOVsFzU0iYUp6Vhx/SlyY
2eEiMGxKTZxkNaX8EWjEQ4Fr/FL1RHgQAWHeMRgCcuW8sETyCFWmYnZ4nWkG
eI9WGQDROTEkaZshFOlB/SbdS3y4WxjHqkZZCVxDk6kBnHHDZynB64gwuiek
HfDaxLsZIQSeO7JC+LZoRM1ZHGQcqylmIWFQur3PasycQLR1uepSgHwtyHJp
Zmi+iqT4kHzEWENWhAXa3Tgw3WRXEykWIdeIeEF7x5jmiDN4JtAsxjjcwuvc
rLHFCceX25I5lRBhaBBi6VGfAUaqsmYuRAnpaZ1qQhi5qNHIlm1h+YHLe2NH
BdrtxbTfVkC61cIDcWrUZnpRZHAIqJxeZcyeOcQQ1N+VWJhRFarWg6ySoHFp
a2FDQZ0KkGkxG4FdttJNUYDBW1xUMIE07oWEbMVpPEIToexs4MqQTEONRUyM
qwu6bR1eiOpiMKYYwAFY9/gMKEJARTls4JIOVnDFEqsKyJxmmcUXsmINADFU
Jqg5Lg6ldbsg1HC3mvm7ZbMBUYUGjyqttDXRbdkfS/XnEkQaUAjggbzvypJf
wPEdKAipzFlwnkr4R5TMVK5G/wnKGBVMfz3okBGDWDocJPt7e4PBnxVmu/An
c597fyFPYntxup6bcr5uXJ0aiL4sP9ib7P7B5KtHe1PzzXw++HQTRzr8QfLV
XjB24MG96wIbwyJgCYJnau3EkTjPWFTSDCU26KrQ2MB/+JXIgzRkOKova/qH
Vxo1o1ZyrIiaWbmJs0FErXURgg0Wfv+SyLjXQsaHXwEuYhQkA8bkcFIBcDNK
fvzpRctrnCisLpT32HXh3QhF+Xdw1vLDK+zUGGZcA9np6mhm4qOIEY3FBcwC
ZZX9nCB903Vd4mhTjmqzHh2l+zBxOLdAkCxI8gRdt2TCrAFFwRKDX9GNjOod
hnG/AtNPLIvMuo102ePI4eLVoLNvI04PrzQlj/2QZEAOBs/RA7c0dUqoihIn
pXpWCla7MlEK+afTWnOcnLFMsdrkSbMErlnQr+O36hIehbXKXW5/EiRRqa7a
vKypSv0Vi2g3TymK7KLgilXxsSjKn21WTSVlt3dVDdUkivCRUkeNVqLgNR+R
kBAAWsqeeXNxcZz1NriUDETG0rOCX2+slopuESfQP4frihX+yISWAkZCSCkZ
Div11V1EshbL9xrrzqx307fS7PTlFfUIoNGbO+y2OZjo0Jp05lzdmLlxZk8z
IFebdXg1d7mo7uuHX3/dcV7EtNF+4bwIbMrxayIMyfDjnWPR1BKjKVZpCnVr
dgie63sYAdLf758jkp1PUIEDY+2cC16eA/tDO/UpDDWVoN2cPxvN9LOfmjwK
fWRFGeSAAMyAadDkYVBna3QvLEUOo01REQ/l8wT6JwIfAAT4YMmcJ/Y/Xeep
FIRtdz4EJot8j/APda4oxBSnlxBiwRmAtiw2ADAulM0BtqDJAM8QINHnM5dK
c9zrAlfp44DKFeT0ODBibuXs7xELDVrP/MqJFNpZOd5jqPzQgUKFg8/39hqI
OOVqrOFVXf7Dl03igyKMbJoASxiV8xF2vPHhztJHDpun0llwzshN2kUiWkVy
FIXqBoPfJvfvAxUmz6iH0JeWytgO7t9PkjdwxlSntiyvJFylpXTkM9mmvJxL
hlWeq75jJWMKNrGidlOOzaTiT7iSFWrdntbtiiGtJnrGM7nH4cmv3dlhdWjO
6VNcrofp9LR/edyVPLuCaR+cSGP+dMMGnfrRXBBifBgbzIjw2VCLgwZ9oAto
NSMZKsWwjl4+dJuI07LVj6Awpxi1jiJ07tY3b3Rb8gCqBZl0HqnwV1jH9ALl
y8cCgZwYP+eBfxwD+2hcFu3p446YSkc74f9JT905yVKLeQOaSxGk6gcSiIqv
tWkIOuMuzPRSVa8IMpJ/GlYAdACT9T7cNzLAa4yfkatiOqV8BlLIdbMEEJ6j
MdJQ4qQbPwItjDU65+st5x8Amy+SZrkGKCbtvABSTPo7XQQQJfvHC7W5gTMN
g3eyyiCTT8YMyj8AsbA+57xZk9t0T8f+z1ZoKnAFa2QQNbOtPsnY5c3Rhr+i
1eMcYXROogDyZqzhd213oO788d5esvs9UQiNEceFWv67zlB0mN4P6pNGpjWx
RmZ1U2JG+q5PSb/HO3+ICzn+98b8HQG+2ybPDJuxvSB1QaVpYO8KCswlAN0q
sb7dQroP7tfBKrxfmcJf5LlphbPjMHaU3tA1a2cwAcvdq+DEffp519ERqXJF
c7iMlvMxWrBDCv5OogRRfNR7MhrLaUaSuuu/E2e/dTwXJv1sy+buimFSjpeo
VsIclERXpqJMj1ZWEif+uIXftOCehRJ/aqaKyFyaM8Fl7BImDhNotg49Tp6y
CC5MjW1csdYm5TOpTFkBDKjFSHBy7CLh5ImJegA1MCFKLIZPFyUJGo0LKZGQ
5d3AJA1niELDwAXFGqCKPgNkDWQ6cuZFK4rn/EuUa+h78W2bUqMQcYWe0AxC
cIKyAD2kMrg+xI0BvX8LQy5UE9HVqyhc5aUxHDlrgSbNcYOYFSCKyHxdETtm
h2zQscyGeSM9qMglC0uueE05kL0du7i1VekyeprsTSo/uLdEjOG4jyB/BMEx
42KZVWWuXDOIaUqKUCNxVCxYJ96S8yfwnBkhk6/KfHvWxXlRjqjm8bw/YNSV
vXNHwfOYBU+dPEf/R0vSnXVCTLwRPu6KQakw3t5MyWm4SFxNpynqViakyO/U
zSa0Y7G7a1pz24yic5qsPXwyW0v7isw6N1owI5X2sMcWFw8jzzCylk4vscfq
pfj7UtFHyZTmZAoX1tIkJ2RhnLLBdOnmUz9wAAQAIJ6fm0bhVvokfXS+oSvO
tP15Hdtsx8riOJnLXWuB+w7x64QaDMkBxWXkgirzEj0/+FUrStOSHC75JOB2
PpmMjtdchxD5wMgLVY63IhUfE4O5MXwSVhd2BbQ6gzgha8BW4Uz9Pvh160AB
Bwd2xWR8VlVlFSWbRTGIoDxBihdccYLnoQNZceA2Dp3JoUOadCaf7tul8juP
HifeizMrUFaw/bV4gx5IGEtqMM5DPz3ihE/B7S01vzkr0yM8Y5vzfca5vS0+
6BnzB+bcf6RrtlEAEOdQCZ4gv2dzqDuO4wOczCe3a3KUJLIOcSHab1asXf6l
8oeuRoKpIE9PHlW3EsksYG25a1dPkIOyulAjuEYGiXiE+tRznzQxVE4svb5b
k/t+AV3Rm4Nk8bds1ZWE1w0V7RVA5lOjBzGOtNLQsiZSBPlO6YJTtoXr4eNB
KEc3dyflILW2nGa+2rBLb/gEGkOf9eAKhRtJVTeosmHfSS1ByVdYglCCtAX5
SVjAoRDLlQ4E0xyLk8uKjCxtiRIKG9vMtK3TS4wEpugj4tZZNINO3lr2wXZN
/dZWUdfu35681NSmQHEQbkIBFtZYWrD1QA3gFmnrFBu20s5DsAvV2Qy75asv
KNQwArukIrOipfy3zAkTj9pvVTj8bSWLN3yHW5PFyRUZDiOZXW4Ul7bn13T7
Chs5nnaifseogaPMG/3uUNp5ym3yiooK2p6fAOoqSaX3LovF9+/lsoWffsJl
uusHsrRI6UIBOHqww9BdafnCDnl9hK/bLwLH7igSizvNUoxfJ5wEEL6hEjQW
RsysrARo8ahcC1b1gt5S6KPp6mPXHfI2agfoouJh9c2tk+/ilf4CuXcN0HyC
1LtDB6tUJTQiqUbtwhnaC/gynJICzFm9jio9ELW5Jhl7q1OnZ5LqPgWDGurJ
RSCAFT25gAp8SnwHRNhsO4ampbM1K/CHf8HCtDNyUffN4VPEw6Ku7joxGmvT
6yP9/yVgP08J2L9ssVdkJd6lsOsusvrnK+zy4FDNpb9kCyloCdr0fNOtBatx
2ZbPW4NDv4iI1l3NREL2SubmgySX/3Wr4NJWvVbIEhC3fpGCuO0lXx9bFNdP
VTf34vmwM7mpCO7Wa5AAUl8N3J3G+XRFcLwWbU74aWrgQKTHrpwvbeyq7CiT
iwVzjxrKLSUSKZlrThEshO83UQtTpIa34kjv67I2aNy+Qfvr87rWK2t1k/Lg
0uc8kIHeOOuYU0fewJjelOtaOYUFQsS6dbz+7KKt/t2y6up25VaugXd0QY7g
nyrq3m4J8jbpFpAbneeRcykS7d7adxqCKz5BrT4NlQj8hrwjim1BWmTLt04b
dgJke5mE99R31j6QhfAhLvgOp3mvV76rJCdMEz9I+k3MD6zdCQslmlUOYd1K
mGrzC5Qa7Eo23A2u/7uVH3xoVCFsWxg0PgojS80sakdNsTPJ+U+VoPDDdJLl
Wb3x+bi+tZ1kNXJvyhtzk5KnJXf9kwRLdcSWgQs2dMIleVks9G6woA8oW+KN
PqBR+CrwwlWGM2rRW+i7eza9tFlfKFw7KcUdXULwRJnocYLw1tCMAo1jMze0
7PmkeVtdDP6ug39oJleksM0M2ZKNRlVBTsftc7na0qjXZ5wVI7AlMQPlhgsm
PjTBI6uazljsRuX8sfDH58w36JlYc9pDPN82x1fJ7iuOKuJUh+wt7zyIm4Vu
OGeXdJPet58xwkxPf5G8YAp4TqmNlOcf0Q3vt0lLSmqccqCtXjoq8F1BZDMZ
pGwm1SnT49tEiS2SPL05ENtMbfdboGy+eAeS4HfToiXFj7yK/Q3y2uM215U8
zYha0mrDz3vM0Smojxv5QAFPRjyoFjee02VoapTaZlsLEg4dRfJaTMOxHiBQ
VI27AdsJQl0FsJWeVYAMcavoLofpm1CI1Oc495b6x8kvIUJFWqdr7w6m8xLD
VkGqT7jOW+wXoM7K8m2A39yei8e1XMbBHUTd8d5tzUkDnt/MUTbvpsbMXJ4S
t+lgA7itoJFik6ObuupexS0RYjuAQrz4/ACamJxaLt8OOIo9HwodUKwzQN4m
VGJHwg29WBAW1mBc2jr4uTs1FqYIbvlsim4vAcfJ4bxu1A5+af3UpHNj4tCs
FZFdYiy7e10paTmZ9u7rAmNQEcBP9/NNtxi1qN/V3KgXPV7BkJRLiwltGErp
7yvIXGS25ZC4VSoYcNYRTOwOWhfoiVgUgLozPELrXPGcfzrz3l1cGLrAJfol
Q6I3bYp2hZoearDjaaGtKxxfvK7zNZaFRvJK9dJYZHlt9S5iNywg7ZK0PVnp
sVTr9reRYJOrFMd9a203HqR8dy1HBeau6lmjdSkOzze4xR2HgAe0S2mpPc4X
ySsK9aK9vjUkLGu9ZdA4vGGdLLQFRUEneTm9jK/XAeVvnc9obyqSolZBkgMh
JqAySR6IWKV6//gjziX3bqYzjrFUfPBBPlj4eAr6f+F9zp3Pzzmq2bniofqa
N6SScHxVLoYTJR1nEDP9jQQmEOSsNb4KKru86hjUeuqVvriQT5le0BcjAS7Y
DqnwDbf++WspjVfawGPry1XryROP64RFNbldYJLH7UhHaXA45yZGarsu4y0Q
57ScnoeRr1il5NWoz0eAJs3KNNvFfSoDIOQce1l7fhlNKzx6Va7WeM8I19zJ
AK2CIcC/9howb6rovTHK0YQfobXe7hHiY7vZYtMPfAm1vyaidQKUIri/t+fI
pRFCENKXRA13r+nDvb3OLGO1zTAirAHhbf5HPoH/8VeLJdfvB0myg4exc/AJ
CWpIo2KD8p2DZCesduhBWG/RKbR4jMaB75Bzlb5pHOQOOz5/EpP0C3dZqDad
/5ScpB0F/adkIDJCmE83MaFrXdvIUUWA4aA0Z3beEd1vwMu9JPCE/SKo2Tqh
GCP7w/WzHcAh9WtIwStxDxuVhnU2g9QQXbsGJZXwGoHf3SfR5w8+1Ae0n46c
D3c/mLlKMMUQCbeFCZJx5oxTOGcGlVxrQrTU78Qy8IdqNc9HEuxvzt1JNTlH
L5IObenrNLgSjWruXPBO59uWiyv5ty6kGycp0a1VWZyu5G/3vCEfttHIHLe7
rZf5bbM32amozecxJxgW5RU+JMsWPrhT9T7Gra5PLfxhbZ4sVy1xkxzBG71O
feqFB6Tc85sS6QcRuDCLUthUuVLrMi3kTqjFOq1SoHhBi6IkyFFDHWsDO1SS
0bn2sTBo+pHH64m/CdCxz2DMkm8r64xhIECFvmM/j28a38xjkhJCUlBPQI+v
WF6I1v8I0xVeERG+MYB9hcHLYu6JLvRo72Gy2+FdDjLnnOnSUZbUdx/mnfvn
+6PjAgTu4uI+HHZiEvs+wDRCRwps5Ztk123RQaIjRUOv9Aqa5qCdunLvvj05
IlIM6ma9P6SvNSuu4FfJ7pm7uz5YQdhdp6u8qw+Orkmu9l5z6Z6VP+iEf6Nu
CxSMc3nWwfpj0dzjWEIMOnOFqPCcXvr2hCopQJ4culvH2PySrIZWXUkrK2d7
Zy/iUg/IoeoCl/1j6RL72oQFTc2+5ivgT54/+XZ//6Femom1IO46eJ/W1m7h
1XC1Ip7J/hlNycMwdU11gJFwhDXOsvE3Zi7pwviLtAoKFfNykU1ZoSLXF/Ly
2HEYSUaYOL6QPC6N5pl9maV607gasdHkDHX5RlfZjqIZP6G7mu3WE0pQvuZ1
dkyChcGVFQdYcDdvux2bPklYSv6tCmPZT7MF0iVzu8x9zNpOnD9Wcs0k6OBr
X8vkvKZSpwuTAD6Qw4hMwBmPzxrM+/f/9vToD89Oz0bPj569fHr6HSLWV4/2
wlRBOXUUOaxb+UXxWI1cVkIt2bm7maitqTkeEKXinQDKjhgETe2GEKo9Xk+p
WvP2kiB3cdaqh8Fv1rXZujtXK+f2EVe1Fex8Syl9SvVKV4jCYzlmq4cwK4sv
Q4dB4/6aUO3wvQY4aRcnRKUUpmi4aJW8RQsRre06FSqOcCo4t/hlwR5sJUTW
3wfgg6J8Q1e+uTDqlqpgS5pEmOQbDnYgUyOH2GOLrtlphnrsH4czOuxnw5Kg
3/L2u5m3YotkxgjDabQnDFHli+AmP6yBYL0wyn7Q+0f7sJc63WEYI5NGiXkd
3jtEqoHTqlh/kipWFLuOWfOgsqtI//EGIwhMAJlD1S7VTAITKrKbqLy1ZYt4
fjvmDhI/qfNAMLQCBnZv8jm7qfAmYUNp+xqfsM7UIImdTl0OUBui/fcD4KN5
OQ1CUj2wat8W4PLuei/LuuG2AOuM3lnUTiai+shQjLqX9hmJVJh+lxvvQ29C
o2Y47YTFlDzvFJ8P2aLrohXsG327eDZhEDA+GqIYM10ToT0RguZ+Ykw0TXyk
5sbCfqWDI9ubXE/KSmCc8TBOfpDcMMUZodjw1LnXfYFuULAykUxToPwJlRqF
O+Iyn8BUFgbDtjU2OaQzkP4S1LnXd03Bmbruawv7s1GUKV3DgiuK5KmNQ+Wr
W4KSR74xf7eRhZDzvWE98mHElu/JAN7Ha0D2I31FKo2eLIDOLTOCddFeH3Yj
9DccW1bRMAkLLRi6TVmYfWLRqSQdRpQlO6SA0XXA5BCvGNSHgysKcIWVocrK
UuWU1vpJHrLcIOzD8v7GRLlqmVn3zMwde2t1DXXVjk6F5ZcsaNN16xZofwH0
aS8IrjN7IfSrBczuwgHdaFO4YR/r9tJIEGfVdL28it6moAMKD0BLsGMqsh61
tnucvJESSUx7g28WmXFeLTj9jLhPw1gJ07s1+c7NlmDSIEGbsH6WWVil1Bu0
WrCetHaB2sDVOkdMxI9hqlPgKjlglh3ZeoOReiJHi6WVL49/eHl8cnTKju1l
mmdTcuEJ/0F6lVycBuZbgoo2alpqYyY8cWrCm/uWftqcI26jV5SUKYgOxRuU
CKvXgWh0Mp1oH2fz7iIlo7FxkwehvNfuZ3DgOTfcBr7iIAUiC4MGGbVWk6aU
RbbEVmRlddnuH6zEtoQzXUinRzxYB1+FrL8klC7cTl0Lb80V8g5l5UQB/yKX
GYmCIWcH6Nv+LXfWSorB9d0+xws5zhA7SpZW0Adk1FQ6VMa5UE7TA8OV++KH
HnU3Ijo0hpppwIPJ2uRaKOT82bIzc2uqLV3YRD18fdiSTfQhzmgvNUttgVUj
TDtB+KKoK6YyDve82ADl11iw4Pwzb7Rr6S6GLe5xKmPyGl0KJzRotdk5GPTd
T/z3nt9vc0FwMFNwC3Byym42+r35c2JIY5ya1je9Nyh/zAobaRm6Qu/h+3vS
0Smm1TrZ370cOZ79ljsH1Kr+nuGiASl/MrlhQCKRLeP9HDC8E6ZuPJ5itrQg
whP0I+/Ie9UGcPE/MdRyMDig61R27Xqx4FoACsHcGwyeUurJipOHD7ZeuDI4
5UwzuXBjcMAcVEHzoev3GTXxyinHBhvg40xB/A/WsZ7U4ZfNWpkTzSbxvfbx
sdcPDgeDY7lqqes79W06kc4sBL+fZJhYi8xbNOD2I1zRauWBUfxAByphu77Y
hdkxKK3rDXYfp+ut7Q0ncOjBJAFFFwzx6Ub4XvtBb5Zn2Pq8RKGBiWp5RhJf
2lOSroT1LwA/GHqkbLulQjyv0gURTKD792zv0FebBfo7pSg/RQ8We6JBF8DL
C9Kl89KicUHBYRpllLxK0avL8mzX3nOf08UjLncl/OYVWKlFXdoLyVdCpJL7
r90zP4BARzfSkzxbTUrUspEL68kA+ohnDfMuc1TsK1L8Sw6LTrk7rTeBg/0d
gP7Jlu0hKen2y+SQXzc+A6GjtfxRIQmMa1RjcRwsRD5+TXpbJIzdAwxnmuXD
533CV/5NuQVcbmioo2dnzz+Kc0X5XW0G8PbkCKf5ZEkngzOM7uOQYRqZsD3J
JjsxfBcawpjWGESz8M3He98OnHT9ZHzwZ4RGM8/BA0E2fmR9Jswttr+3dfsg
zKhzJAcNQtfKiXhUIi9bs4SAa2XaNzT2OGNjA+C2LeTV2AsSGVCztiV3fwsU
Z3SzUvScY8WhSzZ2QzacznExXf99KnEERpSnsKdHXA85MQWYF7V6VkKfA5rI
lW+ZQ/H2ab2WIl7P4DHglYeL86m8ZCRqtuxuNjbjYMHUzF6hOIzdwnJW4vPh
IqvE1FO+pd05dTFIO4xuAOk8Cpvskutu/49/BAsPuQ5d2eR6N9pyXl+nnOZK
mpqhSBN5kan5mN6ECiY+2kz+ec0LgYW/yzDIPQdF4RregF8nFZwc5RQiPyfM
z7NJxQ4BXKsC20cXWy3H7tpZBzaglz86Rzhoo3BgJbAGl+niuxkJigiLDvyB
x7V0lqBYg0vsJUONPQnoPkLHDzYQIAnlrgVoYaVzDnFArg34FdA3+1Ces2hb
EgiwtxPdoqXxlfAGlII6ssyrFDjaekq3F8n3YClTVFvP8mYEGcY9nmYGPQUV
RwBudQjzOMDayAD3Scvchw4DBj8YMPhXmtV8MwqLle4tysKkleTiDznpBB2z
mM0yI8doylWwt1g9GbtdN0Dxrbx21HUTFIcXQgXSk0Pq78khr6m8n7j3gRlw
QipWXRvGjwzDA9jciyCP9JlWeUZds+x0TVk7VpNXM1bdEklqBFSDN/J8ZNd4
4BJ/ADikcg8Gw6bNLNnDSawMI1SEOg6N2TvI1aPqmjxj3TdVNTcwJGB3VyZH
/dsmf0WHDzme/NVolCpw+OZIkFkLU5knbNwdGoS5M2zVIedMbcI5wFGlqtoO
gbSLUVtT9nG9aPCFqbGfEAsd7uWkPs5lOUFl9fgUWZ7yLMnCd6Do9OzdG7Yn
QsERg3Nm8DIRbWnTPgIt3zbvEJLc52qeLdaS0SXhp044w27Rk7yuiEsFzco7
Z+pYbWEMIwFK2ajw5EY5SyHLogwvBWPsVlkWTSQMQOvNbzxIf2fvOPnBEJUk
msJLkYAWRaEiD/iea6d6f+mvC5G0qXBpEC+8Bnn/PhjvwH2y9P59kpmVZglJ
Mqg0n6/KFMQgZ9/MqRY0z7XogrTGITYWuDaMzNQ9PithZC79NMt7oIDuj5ND
ajfavFUYLxW2eu5MeNTF1gkeViTi+4gJ2urrj94NmS/Oh+xh8HCcfM9tz0H8
zDhRApBLfNEuiZgMMRVWeqNCLHMOIpagLVSZ6jElTYBOXJvGfUgOc/expDC5
EnjMSxC2y87jrbMLLReLrHiHw8Zaxr3BozH5LxGZ2WttOfmnyq7S6UYgSVZE
CzcEbHjwuUkvo1gYLKwUUsmq2YgcJsj2idnzjkB1s0H6sZTfk1J+D8z5AOUU
n4wFpONstDhv3JV6BQwRb2fIqY50JVfFI5f0Q/FAjLUGWQbg5Uzu1EhdJSDr
yaxwSYMYnypMbCCUb8L9mVwAytZd6aeeUVWw0tlVCtb6QiIQGB3xn2BnCrrN
0C0WqOH+/SN3bYKyFFTsWJ+S1Zw+Ozs7ev2HU9A2QJaMAVxnrU95SYxp7lTl
1k3qGh4VXDb0FEI4xr6O2Geogfl2CoGsRYFONQGuT0ZAoY3dICBxvcQpgiWw
5YFIuP1mP99mqH0vOXIQXpZWPGTOhMps2EhfaJ6kq1J9QwdtA16vlyKLljW2
24Eq2SWExCVqmR0xrAeq5XHabcRxUZ3ILOcKmMJdClr7u1OpJVX5bjO+JRY9
fX2acOsqxaB+0GuRSJlLoHVWYj0wKV+R9MVBBa7WgMWh/XTYUuMUyzzdUIlv
bkt+IdpoVlzBLL43o7Tuog5lWPEbJDi4agTQoCmxD12MtP1TboITSQOEtL2U
bGBuBUP7ZkygdLDUZiZgH0EZlcoQg3XNAJ/jN2dHxwRAX9DqGrSHOcL+nsr4
oiRvHG+/uBI7z6f+ApoAgxuLClwIjFTXBhRhrkNF+xl59UQap2a+7mGYcEfP
B2P//AO3DHHs2PPokDlbhbvISpc/laAjT01DvrqZRJntJc9bIGu7VgMP7qhA
i3bDZieTJ3lbfSxQ7x/gi9Ap1NcEndCkazaj5vfxvDbxgtUdJFfvaYbrRSp9
zDEhwhC6cwKG3DKgaeGmnsYNGdXbXFqTRImrdCmjvzunkQnK1yndEnXIicDS
7boUhwAImVHyVvRPADNe/jujPI7zw7wenV5Ne3qLjJMX5TUm7g71IhaSqD6n
m/TtgL1GK3eOg8qg+uIlKxuukh7IeUW25CseAvbRyFMDPPSclyzcsewqJWWr
u7T83OUfjNgMtu3b3dHrSWzkwf3zqK4N8JX66uIBwLyrEq8cvkE0ZUHaXsiW
0BLv9hWGM0ZMyrvkChQxCBO9WDy0IoKqrNAK76yw56PK6m1ORGn3G8VMD5I9
bPgbtyziq0S33O6Mdj616tWShty15FQX6+3AknmwD9XJGaR1UYuHuEe696iG
pJ9pFZe/BCTI51AbUJqqVXznMSGfsz8CgW6wL5wVZyHeV57lTb3HsTxGC7JA
nLeTlBNJXkQ3UJmvXes7zscqxAOh9VzOgyjtIx3nlESW6drWsNj9P/4xYDmu
HxspnuKspMQZEb6ahSNZmUhLOEJUTiRiPN/EKP0oeUaZNC8ydvzdgNBclcBi
VpuLZssMr8QWXgwa1BVZmkN/1zor+tQt6khSQsk1hwu9o4+UYe/sqnPcwa7f
QtuhGl7d0ommzOBxHHrlmtgZSgW5xg8lY5HpTX5dNEm+0K0sRQiyg5PtE1GG
t5JHjgy/M7+jMEWMpVFaD/kSX9K3nBeVUhI1j8mdp89gwpdXaP5I3Att+7AZ
4iu5dkd6mEQZO5pf3JPzGuXaYrBKyt18krvFlKF2Bi6L6iAENHF+eu0Pz677
2tU/TkgFCWUi8gzKUlwu14WekFM1yPXIxZ8S5iUHhef5XmSGBodaLBzxRH/4
ZpxQ7mRaLbSA1eoVKA0ppttiyzi4e4AN8chQZbYrs7qixtA0o3Q41hLw1p0O
k+dmQH9J579M3UyEfIAwpiCzRNbYvI6IHs/NvOY8N5asMz+Jtkb2fT4C+mu1
VES7XZ14VExemcBfHFBCg++wo1gZ92DgDoxYPTYAACaLJ+Eyy5ElwPtY7Tok
PwqfSMkao73UDErJpi0D5DHbUCeK+Vyjep2jiSOAwpt/2Cxn72i+icxr3RFO
PJOGnuzNP/wP4NLJ/fuH6MKjVFV06DqN0wXefgdc+U+oSPvAJ+mmwbURBvNY
zCxwZZ+7ER8gCoyQxs+ZrJZunW4K5o9Sc6ODNVJrw7v7gpRBTjB1NyISU3Up
w+tA4Cu/1IvAw9T/IZMy2zBcv1driBQjPRgkqpLdHTLMgVB27sGLmM9DVI/9
pigKxbY5vh4ITOyhxCN5IAtVNLs+hfVYdEaHrqiZfKaD9wecbGJm3+1Qe/Md
DbO4dDH43d3uKT2iMA7GnRUb0ZjrCt0E5EH/nxn+8spc1OkwOa3NHN59ldbW
osWi7Uo4tdt2pWogLP+MBHC17yD8l13VoeGLcVY+uCd3TUSLaLbYC001d2k7
JQehlsOCrLArbt5DpnlFMQTMR3Ar84f8ShrHSHyQxTaRXb0h2sHYErxKCyqk
wFZ0L/KjY7sE1AFdqxhysoomgskosnsFDgv3PLuUW0zS4hIgCa+8LmtEl4t0
6eqOa7RjriRSnU3Wkh0lF/aYdwhZQAPOg+k6/oR7L2RFNZ9+t4NduBEjvvhC
7smiy9hHmannIzyKSWZHTQN+tPeoG63uY44O8j4jHquOuhbWRMD+qiR1vaMo
xI5hKEmQ296fau7u/5LRXHLX/eQZcDf0UJD62agQIPSMq07pHVx/2NCEtZEg
UUfqX6wrQcuDC5JoiCegdXLlcFq3n2BaVwXZt0vAN59Kh612ERIX30lXUpYm
UmEaQopz6aJ2Ga4ySttlMFmg+0K3G2WcRqJwgH4ReY3YGvEDqWnGgljLIaK7
4c7DbbjjiZguu8GlewUkucrSpOdGH92N7cx9xBwl1ML8RcTIM2q6tzpEFYlm
IKZQszEvvyi1QpN8XBJ6EVRX8jg1tU7sXkSgKrnccMnjJycvp9DTTigYgDfX
R8YSLqLZI+BnOqX9vlM6MQAqrP/hB4/8TW2CO4SwjUTrcfAiezDLvFxshEsQ
25xx4Ep95jEv+Bk2uNe/QWSPuoOz8tIU4gFhExHxg8sjRr7qKUgtCnq1aFqp
RHoiUt0CQVfzJwbPE8W7NwqoD4UJoFIvSOxIJWAvjb4Gq/mDx+zFKGGY1Hgg
vDIagS6lbqSDXmarFX2OYAq9LJJ9f+JKtyI4PdGEqHVdjrgTP/bPjvrPi2H3
4QDrxaZTqu7yxx3VafAi8djK8JH2eTt1Sp7wN9IFW/2/4EqB9/vVAAA=

-->

</rfc>
