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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{
  "metadata": {
    [...]
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="upload-cancellation">
        <name>Upload Cancellation</name>
        <section anchor="client-behavior-3">
          <name>Client Behavior</name>
          <t>If the client wants to terminate the transfer without the ability to resume, it can send a <tt>DELETE</tt> request to the upload resource. Doing so is an indication that the client is no longer interested in continuing the upload, and that the server can release any resources associated with it.</t>
          <t>The client <bcp14>MUST NOT</bcp14> initiate cancellation without the knowledge of server support.</t>
        </section>
        <section anchor="server-behavior-3">
          <name>Server Behavior</name>
          <t>Upon receiving a <tt>DELETE</tt> request, the server <bcp14>SHOULD</bcp14> deactivate the upload resource and <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>The resource <bcp14>MUST NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes.</t>
        </section>
        <section anchor="upload-cancellation-example">
          <name>Example</name>
          <t>The following example shows an upload cancellation:</t>
          <sourcecode type="http-message"><![CDATA[
DELETE /upload/b530ce8ff HTTP/1.1
Host: example.com
Upload-Draft-Interop-Version: 7
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
]]></sourcecode>
        </section>
      </section>
      <section anchor="concurrency">
        <name>Concurrency</name>
        <t>Resumable uploads, as defined in this document, do not permit uploading representation data in parallel to the same upload resource. The client <bcp14>MUST NOT</bcp14> perform multiple representation data transfers for the same upload resource in parallel.</t>
        <t>If an upload resource receives a new request to retrieve the offset (<xref target="offset-retrieving"/>), appending representation data (<xref target="upload-appending"/>), or cancellation (<xref target="upload-cancellation"/>) while a previous request for creating the upload (<xref target="upload-creation"/>) or appending representation data (<xref target="upload-appending"/>) is still ongoing, the resource <bcp14>SHOULD</bcp14> prevent race conditions, data loss, and corruption by terminating the previous request before processing the new request. Due to network delay and reordering, the resource might still be receiving representation data from an ongoing transfer for the same upload resource, which in the client's perspective has failed. Since the client is not allowed to perform multiple transfers in parallel, the upload resource can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
      </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 from the representation 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 representation data, 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[
# NOTE: '\' line wrapping per RFC 8792

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

{
  "type":"https://iana.org/assignments/http-problem-types#\
    mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 100,
  "provided-offset": 200
}
]]></sourcecode>
      </section>
      <section anchor="completed-upload">
        <name>Completed Upload</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#completed-upload" problem type <xref target="PROBLEM"/>. A server <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[
# NOTE: '\' line wrapping per RFC 8792

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

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

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

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

<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-07">
        <name>Since draft-ietf-httpbis-resumable-upload-07</name>
        <ul spacing="normal">
          <li>
            <t>Clarify server handling when upload length is exceeded.</t>
          </li>
          <li>
            <t>Extend security considerations about upload resource URIs, representation metadata, and untrusted inputs.</t>
          </li>
          <li>
            <t>Allow clients to retry for appropriate 4xx responses.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-06">
        <name>Since draft-ietf-httpbis-resumable-upload-06</name>
        <ul spacing="normal">
          <li>
            <t>Minor editorial improvements to introduction and examples.</t>
          </li>
          <li>
            <t>Define structured types for new header fields.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-05">
        <name>Since draft-ietf-httpbis-resumable-upload-05</name>
        <ul spacing="normal">
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Numerous editorial changes.</t>
          </li>
          <li>
            <t>Rename <tt>expires</tt> limit to <tt>max-age</tt>.</t>
          </li>
          <li>
            <t>Require <tt>Upload-Complete</tt>, but not <tt>Upload-Offset</tt> or <tt>Upload-Limit</tt>, for append responses.</t>
          </li>
          <li>
            <t>Add problem type for inconsistent length values.</t>
          </li>
          <li>
            <t>Reduce use of "file" in favor of "representation".</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-04">
        <name>Since draft-ietf-httpbis-resumable-upload-04</name>
        <ul spacing="normal">
          <li>
            <t>Clarify implications of <tt>Upload-Limit</tt> header.</t>
          </li>
          <li>
            <t>Allow client to fetch upload limits upfront via <tt>OPTIONS</tt>.</t>
          </li>
          <li>
            <t>Add guidance on upload creation strategy.</t>
          </li>
          <li>
            <t>Add <tt>Upload-Length</tt> header to indicate length during creation.</t>
          </li>
          <li>
            <t>Describe possible usage of <tt>Want-Repr-Digest</tt>.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-03">
        <name>Since draft-ietf-httpbis-resumable-upload-03</name>
        <ul spacing="normal">
          <li>
            <t>Add note about <tt>Content-Location</tt> for referring to subsequent resources.</t>
          </li>
          <li>
            <t>Require <tt>application/partial-upload</tt> for appending to uploads.</t>
          </li>
          <li>
            <t>Explain handling of content and transfer codings.</t>
          </li>
          <li>
            <t>Add problem types for mismatching offsets and completed uploads.</t>
          </li>
          <li>
            <t>Clarify that completed uploads must not be appended to.</t>
          </li>
          <li>
            <t>Describe interaction with Digest Fields from RFC9530.</t>
          </li>
          <li>
            <t>Require that upload offset does not decrease over time.</t>
          </li>
          <li>
            <t>Add Upload-Limit header field.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-02">
        <name>Since draft-ietf-httpbis-resumable-upload-02</name>
        <ul spacing="normal">
          <li>
            <t>Add upload progress notifications via informational responses.</t>
          </li>
          <li>
            <t>Add security consideration regarding request filtering.</t>
          </li>
          <li>
            <t>Explain the use of empty requests for creation uploads and appending.</t>
          </li>
          <li>
            <t>Extend security consideration to include resource exhaustion attacks.</t>
          </li>
          <li>
            <t>Allow 200 status codes for offset retrieval.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-01">
        <name>Since draft-ietf-httpbis-resumable-upload-01</name>
        <ul spacing="normal">
          <li>
            <t>Replace Upload-Incomplete header with Upload-Complete.</t>
          </li>
          <li>
            <t>Replace terminology about procedures with HTTP resources.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-00">
        <name>Since draft-ietf-httpbis-resumable-upload-00</name>
        <ul spacing="normal">
          <li>
            <t>Remove Upload-Token and instead use Server-generated upload URL for upload identification.</t>
          </li>
          <li>
            <t>Require the Upload-Incomplete header field in Upload Creation Procedure.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-02">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-02</name>
        <t>None</t>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-01">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-01</name>
        <ul spacing="normal">
          <li>
            <t>Clarifying backtracking and preventing skipping ahead during the Offset Receiving Procedure.</t>
          </li>
          <li>
            <t>Clients auto-retry 404 is no longer allowed.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-00">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-00</name>
        <ul spacing="normal">
          <li>
            <t>Split the Upload Transfer Procedure into the Upload Creation Procedure and the Upload Appending Procedure.</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
qS1lMk9zraxHiB17uI/uM/m5xPn2PhL7Tluc72+a55fDChPkhgds37bt+fCn
x7r/edmnGOYjQHzjjA65qLXomQIB41g5bQfc2LY/tS7aIYv8hZplGEdgokPS
YR1C9YU3bkMYQ5NvwwoFk+aKZkNeRhl16VqKkUSKM2criNlRBEsxNkngowyD
dvg4jHydYX6eda4SW2RgBjoPBgwCuymr/6V18Y3E+6+ti/+SdB+LNh3Ue2RR
ag3JOrVFvAdtxxwmqt3SFwcqAWgleVoZb4AlCiPqgf5dJMtEUGRwE1LV27jK
MLdHpVWxhQ/P+eyCVCwRrAWpTFnRYM6Zo8rAJcCMLHSNpNowCrtJsHSW/3bV
tda28adNYZveiBjKH39CqvzZuOYft1jbL/lMfz6uyXyqg2VShEZyGv2kYMch
H7F/1fPMmayNLfWL5JKswa30mrpqFCcFSyIxc2azZnFA/rdyWlre3LuODS7M
fzW9yVDzf20zzy38nr8cDmB+flE+zBHS7Gh62RRXbb1pLTmRP8kL7bJn8v1n
cZLaYHDUdkmgs6PAD2Y2I85LrZI8nKKdWMVp6O3xOC8kIGl0U+grjpSQ0aE6
RrSzpwFLEy9RR7QnynbBnMdoxMxaPBRrpSRnYB15bPO0XS/j5K2OnnLJdp7S
iZ4Ul0hvHDpVeQFP643pdZ0JZj3RrLLaMcfuqA1hr6Ah0hg7sy3HyXObO4HA
8BLq/cfgrO030YyamStnXmPKGyednWLeJ2cBctEBnoBd7hTPS7NLjLxLZZ6X
N6TrViVW02QmP5g8X4CoV06BbkenP4MJJTxpKYJP5QMvQbT5jAVO0SwmnJM4
WVk/YZ8ApVXQFim6ZSQGyIWMsHbW2LQo67kIMzDX4zUJOthZZJL3IMk43o9d
soNP7DkwpOYkqlaBOwGzBnSgESA1FyaBWubc5JCgdEesIFkVUyDzAt23UZzU
QqJSF2llLR1nP3kKw0ZviSSPGbNt1pu+0GvE4ZIIhJItx/UYHj/elnTHmJG8
2fKL1wU74Kgpsv4SH6T6KFzXkBNXMclj6Nujpo4gmSnEIdBBjAkdD56XqF91
Os49tk3jETXORLFqMZQCUCKbyfmhepXMm4pQvyVDsnorXCksGupEshZTQjgg
c+NqX6jC02sFjl0ngusiHfeiSQF7aiWe8qIk1AB8kpJ2HA1zLLM8R5AXClXQ
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
OEJhbh5eKDRtMr1gVKkUpc1Fdds2W6ON6y3/ofFXiRN5puY2xtfWrIy31WaZ
8kt6CWZqK/IvI2t3uXUbGGCaXYpqYPRjM7bdchzwRcdFe2lkomXVtFlcB29T
4i5SMcnbZUVV8wuVIoHC0l4b36gXYDABdXSH4BDz0NHid+U1niAzm6cqh7An
tj/LNKxZulq0AiNv2oosDHPd5Mh5xSV7mpc3OeCeHul6hemZJI80emJenHz/
4uTN8Snn4y9SDG1g/aDx8AAXFRM24nWsMF8pteTwBLx5LXeZX2Afs9x12ora
g0r/H+BwSBMLbIC6PsyuxS01NaZDOiHZjE7Dd5cpxhPcXWuyuMnKT/wCe6nM
aS3l0iYiagp7UBQQI19yL2sBemHOLieLgbbal2kQdKXsQpgSnrIFrwHsUOQa
IQVe3WOzXNN3VD/pbg6yPeIcc+HW3uiYGrJiZguA7Vv2qA1dOpPMK55FMTTE
O1VLLdhTV5lEzSS+Zwo6rZkNDJjYn+eu90ZEfj80BgQPJmsTNwuKzWzR6e+Y
UkVDRob4Z8nx0aujlm5GH+KM+ornA1zCxH0mJK9SoqgrJjn6Yu+7FaZVY8sa
m+j92tzbexcV2HvJc/IcvcKs4Tc0aLXaOxwMfhh1/vzQ83vfJ/0/Pwx+8Od2
Pz8kp9ypQX6vmmndoNZL9cE/JPHPG0V5FlPV+uaHn2YXkavG7GJpu0D/kBzX
wAiCPXb0DW1dQm53YaaQ696SHacwLU17JgimIHM06Z7iKdMIRjfiKeRSlt4Z
gimYInbdhW2it2YXn/64dyLFlSNENBYFr59g3HxP3qtWQGz/ibrS4eCQgye6
ubjgdFXSoe4NBk8pkr/kxiKHa3thDU5RUZxLHAefPvNhddv1uwr9cOVEkwUQ
MM7kBZBgHc2k9r+MmzC9MTF/7FUACieIE3zs1f0jjkuQGdzxnakmCJVK+n6S
IW7iVe1i4rYf4TCLlgdG4QMduAXw4qYrqDNw9KA9KK3rdQOqiL7EJP4NJ3Dk
wCR+OFvi59oX4HvtB11iHt04Ta1CmwK1VtJopOkFaYbkhF6iejlyjq1IRXoO
hh63EXfGfc/2jpxvwrO6DvFqg6eomXGqB+g6INvxyLXzb9N2eJRR8jK9yKYi
sO/qe/bz55iYZevf/W9eplM0IvQlbZqrH7Fcyn/me1BY0Kv5JM+WkxItZBQq
5mQAfaQtGrrKcjR0KrLs+e6bdMpROpf15u3vkOqrkAaOyMDWd5Ijfl25EtEY
a8aMNmRtNqi04zho/5+8Ir000DbsAwxnmuX28z6hSA3tqwJaVjTU8bOz5z+K
cwU9ItoMAExtnOajdYIYnGHFIw7pt6IQticdKd6YSwiMK87r74RvPtr/emBV
g4/GBz8hNOJ6ZgcE2fixdvXxW2x//19r+/1FsA4QQbG2QEW0CRKh+keDBWQ8
RdFQEz+yLTlp0YP3h8y21OzXe9SAeO+D+J7ddQwYgyNPCyXA853Iqub+XaFg
sF4fMMj+d4a/vFSXWFNwWqs5vPsyrbU2WYLkHWY+0EX06Lr9E27z+oC8rajf
/+WuOQH4YpyV96XUMlwEZyc42UAs1sUR2FIgMYPQ5K67hV5mJrDFuTqgz2Cj
GrMy8+IYtsRtTEw9BZ0EpQbWK6omQHEJr9KCyOXlvOzkfMUrZNE1ZBuXUFMn
sYaRrcnuDXA4ZEIVrPRQWlwBJOGVVyVlTVymC9ozutlqzGy7Fl6ZTRqRszw2
Gk0wNhZRE0ftOn4MvQBssqKaT3+9h53O96gvo/RvmlHTtkzV8xEexSTTLqxp
MHz/y260+hxEWUp1FmL72kxAKn6RE3IhfO7pjO7Mz5NnKEUxZNepBYmnt8vv
PIwdXMYPyEgYeT01znVE2cleP3fOQ5pzdzHrIMLba1yu4q4w+qIPRi+zAl2a
oJmUFYV6F+iJoG7O3FweheCsYWFJ8p8zrmnpT6mvAzqqjIFJjIjWjh3Fgtbc
O6/5cd+aj9nxIeVGxBcyVjGxskaTz/Pz5BWQdoXuJrc5zsGgpb9RqGJRHx6g
RH3O3hDc8bncMnjOj5GK3e6pzum06BSPS+u9ansOTA7NWXKfCHuEn6M6Erak
mJM/sq9DAS+IQiZyY8weMhu6aWKeXpfkvtkLEXBvZ7A/2kROgCJOp/Yrov0w
bIzZLufeEB6HYiVlJrkGpf385PXZ8cmr03MDm4smm2FcinS8KF5u8prNsz1Z
PX7jDQGmlKOYkRiRJc/bJqaSSkm7a5VZ7gzRh30QxXVT3TgzlI4yDU61s2HJ
sqvKQQeIuq61m8NDGc3aMcjyljnGDi2X9IIAJD+jWv0u/GXK93RSKegIezPP
/GkNUnFwPH6CE7ol+9XetlCXwZm1Smz4nNg1JuXq2C3h8cN9H1J+Sq7UndhQ
+UwJhyG5jV5Hs93AxxMW42/HmHbEnQfrcMdpGdRWHpdu9RJNJOUZYn49j9lN
t4BDfTSt/GJSVGpqavzoo4ok1iCmcE6LdcK7Ppql84i7qzztOGukLFMuhz2s
iBWXPMkidoc7PoPdpf0GtbSI+JbXT3RKB32nBHwjx/6dgjaofYuLU3CHEDYS
LmPvRW4GWeblxUq4hM1NkVgH6egBL/gEG9zv3yDqb2YHZ+WVBGFNTRziB4c6
Rq6GTPD27ZsXXtMd60GZWrbsSHUNBG0JW5TRhUaWSeK5HUwAlXpBokdGRe+l
0VdloW49Zi9GCcNE4kQrC2vWrlx5C6VtUBXTVcatmlIEk1+cLh7wNzY6G8Dp
iclWbupyxJroo/1HYZtxCdrcHmC92HRKYVt33EHMhRfJ4XDvkfZ5W3tPnnB3
13lb/f9gGzc0AgEBAA==

-->

</rfc>
