<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-spk-httpbis-parallel-upload-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Parallel Resumable Uploads">Parallel Appends for Resumable Uploads</title>
    <seriesInfo name="Internet-Draft" value="draft-spk-httpbis-parallel-upload-00"/>
    <author fullname="Santosh Pallagatti">
      <organization>Zscaler</organization>
      <address>
        <email>santosh.pallagatti@gmail.com</email>
      </address>
    </author>
    <author fullname="Akshat Maheshwari">
      <organization>Zscaler</organization>
      <address>
        <email>akshatmaheshwari1995@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="11"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>resumable upload</keyword>
    <keyword>parallel upload</keyword>
    <keyword>intermediary</keyword>
    <keyword>content inspection</keyword>
    <abstract>
      <?line 59?>

<t>The resumable upload protocol lets a client continue an interrupted
upload, but the upload has to be sent in order, one request at a time.
This document extends that protocol so that a client can send different
parts of the same upload in parallel. Servers and intermediaries can
limit both the number of concurrent requests and the amount of data
that arrives out of order. The document also describes how
intermediaries that inspect uploads (for data loss prevention or
malware scanning, say) can continue to do so, and how the extension
behaves over HTTP/1.1, HTTP/2, and HTTP/3.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://santoshpallagatti.github.io/draft-spk-httpbis-parallel-upload/draft-spk-httpbis-parallel-upload.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-spk-httpbis-parallel-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/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/santoshpallagatti/draft-spk-httpbis-parallel-upload"/>.</t>
    </note>
  </front>
  <middle>
    <?line 72?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The resumable upload protocol <xref target="RESUMABLE"/> lets a client continue an
interrupted upload instead of starting over. Its state is a single
offset: all bytes before the offset have been stored, and each append
has to start exactly at that offset. <xref section="4.6" sectionFormat="of" target="RESUMABLE"/>
forbids a client from transferring data for the same upload in
parallel.</t>
      <t>HTTP has had a standard mechanism for parallel downloads since
HTTP/1.1: a client requests different byte ranges of the same resource
at the same time using the Range header field
(<xref section="14.2" sectionFormat="of" target="RFC9110"/>), and download managers and cloud storage
clients rely on it. Uploads have no counterpart.
<xref section="14.5" sectionFormat="of" target="RFC9110"/> describes
Content-Range in a PUT request but leaves its handling undefined, and
<xref target="RESUMABLE"/> requires appends to be sequential.</t>
      <t>Parallel uploads are nevertheless widely deployed in service-specific
forms: cloud storage APIs, and the Concatenation extension of the tus
protocol <xref target="TUS"/>, upload parts as separate resources and join them at
the end. What is missing is a standard way for a client to send several
byte ranges of one upload at the same time. The Byte Range PATCH draft
<xref target="BYTERANGE"/> mentions parallel uploads and leaves them for "a later
document".</t>
      <t>This document defines such an extension for <xref target="RESUMABLE"/>. A client
asks for parallel mode when it creates the upload (<xref target="negotiation"/>) and
then sends appends for different byte ranges at the same time, within a
window (<xref target="appends"/>). The server reports which ranges it has in a new
response field (<xref target="upload-received"/>), and <xref target="completion"/> says when the
upload is complete. Requirements for servers and for intermediaries are
in <xref target="server-reqs"/> and <xref target="intermediary-reqs"/>.</t>
      <t>Unless this document says otherwise (<xref target="updates"/>), all rules of
<xref target="RESUMABLE"/> still apply. A client or server that does not implement
this extension simply keeps using the sequential protocol.</t>
      <section anchor="use-cases">
        <name>Use Cases</name>
        <t>The main motivation is large uploads over paths where a single
connection cannot use the available bandwidth: video and audio, disk
images and backups, and datasets or model files that often run to
several gigabytes. <xref target="h2h3"/> explains which parts of the gain come from
parallel appends on one connection and which need several
connections.</t>
        <t>Uploads to AI services are a growing case. Users attach documents,
recordings, and video for a model to analyze, and the model cannot
start until the upload has finished, so upload time shows up directly
as waiting time. For small files the gain from parallel appends is
small, because connection setup and round trips dominate. For large
inputs it can be significant.</t>
        <t>The same trend affects organizations that inspect outbound uploads,
including uploads to AI services, to keep sensitive data from leaving
their networks. Their proxies have to handle more and larger uploads
with limited memory, and must not let a file be committed before it
has been checked. <xref target="inspecting"/> describes how they can do that.</t>
        <t>Mobile clients benefit as well. Their connections drop and change
often, and with this extension only the missing ranges need to be sent
again.</t>
      </section>
    </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>This document uses the terms "upload resource", "append", "upload
creation", "offset retrieval", and "upload cancellation" as defined in
<xref target="RESUMABLE"/>, and the terms "client", "server", "intermediary",
"proxy", and "gateway" as defined in <xref target="RFC9110"/>. Structured Field
types (Boolean, Integer, Token, List, Inner List, Dictionary) are
defined in <xref target="RFC9651"/>.</t>
      <t>The following terms are also used:</t>
      <dl>
        <dt>Parallel mode:</dt>
        <dd>
          <t>The mode of an upload for which the extension defined in this
document has been negotiated.</t>
        </dd>
        <dt>Contiguous offset (C):</dt>
        <dd>
          <t>The number of bytes, starting at byte 0, that have been received
without a gap. This is the value that <xref target="RESUMABLE"/> conveys in the
Upload-Offset field.</t>
        </dd>
        <dt>Reorder window (W):</dt>
        <dd>
          <t>The maximum distance, in bytes, beyond the contiguous offset at which
an append may end. See <xref target="window"/>.</t>
        </dd>
        <dt>Received ranges:</dt>
        <dd>
          <t>The set of byte ranges of the upload that the server has received and
stored.</t>
        </dd>
        <dt>Tail append:</dt>
        <dd>
          <t>The append that carries Upload-Complete set to true. With explicit
commit it is an empty append at the upload length. With automatic
commit it is normally the data append that ends at the upload length,
although an empty append at the upload length is also accepted (see
<xref target="completion"/>). Without it the upload cannot complete.</t>
        </dd>
        <dt>Inspecting intermediary:</dt>
        <dd>
          <t>An intermediary that examines the content of an upload before
allowing it to reach or be committed at the server, typically to
apply data loss prevention (DLP) or malware scanning policy.</t>
        </dd>
      </dl>
      <t>Byte ranges in this document are written as [start, end), meaning the
range includes start and excludes end. "MiB" means 1,048,576 bytes.</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>A client asks for parallel mode when it creates an upload. The server,
and any intermediary on the path, answer with the limits they accept:
how many appends may be in progress at once, how large the reorder
window is, or both. Intermediaries can only make these limits stricter.</t>
      <t>The client then sends several appends at the same time, each covering
its own byte range. Every append has to end within the reorder window,
which starts at the contiguous offset. As gaps at the start of the
window fill, the contiguous offset advances and the window slides
forward. The server reports the ranges it holds in the Upload-Received
field, so a client that loses an append re-sends only the missing
range. The upload completes when the received ranges cover the whole
upload.</t>
      <figure anchor="fig-window">
        <name>The Reorder Window</name>
        <artwork type="ascii-art"><![CDATA[
 0                 C                              C+W        Length
 |=================|----+=====+------+=====+------|----------|
   all received     gap  recv   gap    recv  gap    outside
                   |<------ reorder window ------>|  window
]]></artwork>
      </figure>
      <t><xref target="fig-overview"/> shows a 12 MiB upload sent as 2 MiB appends with a
window of 6 MiB and at most three appends in progress.</t>
      <figure anchor="fig-overview">
        <name>Parallel Upload Overview</name>
        <artwork type="ascii-art"><![CDATA[
Client                                   Server
  |  POST /files                            |
  |  Upload-Parallel: ?1                    |
  |  Upload-Length: 12582912                |
  |---------------------------------------->|
  |  201 Created                            |
  |  Location: /uploads/abc                 |
  |  Upload-Limit: max-parallel=3,          |
  |                reorder-window=6291456   |
  |<----------------------------------------|
  |  PATCH, Upload-Offset: 0         ------>|  \
  |  PATCH, Upload-Offset: 2097152   ------>|   > concurrent,
  |  PATCH, Upload-Offset: 4194304   ------>|  /  window [0, 6 MiB)
  |<------------------ 204 (three times) ---|
  |  PATCH, Upload-Offset: 6291456   ------>|  \
  |  PATCH, Upload-Offset: 8388608   ------>|   > window slid to
  |  PATCH, Upload-Offset: 10485760  ------>|  /  [6 MiB, 12 MiB)
  |         Upload-Complete: ?1             |
  |<----------- 204, 204, 201 Created ------|  upload complete
]]></artwork>
      </figure>
      <t>Inspecting intermediaries use the same window to process content in
order with bounded memory, and hold the tail append until they reach a
verdict (<xref target="inspecting"/>).</t>
    </section>
    <section anchor="negotiation">
      <name>Negotiating Parallel Mode</name>
      <section anchor="upload-parallel">
        <name>The Upload-Parallel Request Field</name>
        <t>The Upload-Parallel request header field is a Boolean <xref target="RFC9651"/>. A
client sends it with the value true in an upload creation request to
ask for parallel mode:</t>
        <sourcecode type="http-message"><![CDATA[
Upload-Parallel: ?1
]]></sourcecode>
        <t>A client that sends Upload-Parallel with the value true <bcp14>MUST</bcp14> also send
Upload-Length in the same request. Parallel mode requires the total
length to be known before appends arrive out of order. A server that
receives Upload-Parallel without Upload-Length <bcp14>MUST</bcp14> treat the upload as
sequential.</t>
        <t>A client <bcp14>MAY</bcp14> create the upload with an empty body: a POST carrying
Upload-Parallel, Upload-Length, Upload-Complete set to false, and no
content. The response gives the client the Location of the upload
resource and the Upload-Limit field, so it knows the upload URI and the
limits that apply, that is how many appends may be in flight, the
reorder window, any alignment, and the commit mode, before it sends any
content. All content is then sent in appends.</t>
        <sourcecode type="http-message"><![CDATA[
POST /files HTTP/1.1
Host: example.com
Upload-Parallel: ?1
Upload-Length: 12582912
Upload-Complete: ?0
Content-Length: 0

HTTP/1.1 201 Created
Location: /uploads/abc
Upload-Limit: max-parallel=3, reorder-window=6291456
]]></sourcecode>
        <t>This is <bcp14>RECOMMENDED</bcp14> when HTTP/1.1 is used, because <xref target="RESUMABLE"/>
otherwise carries the upload URI in a 104 (Upload Resumption Supported)
interim response, which some intermediaries do not forward
(<xref target="http11"/>).</t>
      </section>
      <section anchor="limits">
        <name>Upload-Limit Parameters</name>
        <t>This document defines the following parameters for the Upload-Limit
response field of <xref target="RESUMABLE"/>:</t>
        <dl newline="true">
          <dt>max-parallel:</dt>
          <dd>
            <t>An Integer. The maximum number of appends to this upload that may be
in progress at the same time. A value of 1 in the upload creation
response means the upload is sequential (<xref target="fallback"/>). If the
parameter is absent, this field places no limit on the number of
appends; concurrency is then bounded only by the reorder window and by
what the server accepts at the time (<xref target="server-window"/>).</t>
          </dd>
          <dt>reorder-window:</dt>
          <dd>
            <t>An Integer. The reorder window W in bytes. If absent, the window is
unlimited, that is, equal to the upload length.</t>
          </dd>
          <dt>append-alignment:</dt>
          <dd>
            <t>An Integer. The offset of every append, and the length of every
append except the tail append, <bcp14>MUST</bcp14> be a multiple of this value. If
absent, no alignment applies.</t>
          </dd>
          <dt>commit:</dt>
          <dd>
            <t>A Token, either "auto" or "explicit". See <xref target="completion"/>. If absent,
the value is "auto".</t>
          </dd>
        </dl>
        <t>A server that accepts parallel mode <bcp14>MUST</bcp14> include at least one of
max-parallel with a value greater than 1, or reorder-window, in the
Upload-Limit field of the upload creation response, and <bcp14>MUST</bcp14> include
its current values of these parameters in every later Upload-Limit
field it sends for the upload, including in offset retrieval
responses. A server that cares only about how much
out-of-order data it has to hold can send reorder-window alone; one
that cares only about the number of concurrent requests can send
max-parallel alone.</t>
      </section>
      <section anchor="tightening">
        <name>Tightening by Intermediaries</name>
        <t>An intermediary <bcp14>MAY</bcp14> modify the Upload-Limit field in a response it
forwards, but only in ways that make the limits stricter:</t>
        <ul spacing="normal">
          <li>
            <t>it <bcp14>MAY</bcp14> lower max-parallel, or add it if absent;</t>
          </li>
          <li>
            <t>it <bcp14>MAY</bcp14> lower reorder-window, or add it if absent;</t>
          </li>
          <li>
            <t>it <bcp14>MAY</bcp14> replace append-alignment with a multiple of the current value,
or add it if absent;</t>
          </li>
          <li>
            <t>it <bcp14>MAY</bcp14> change commit from "auto" to "explicit".</t>
          </li>
        </ul>
        <t>An intermediary <bcp14>MUST NOT</bcp14> raise max-parallel or reorder-window, remove
any of these parameters, or change commit from "explicit" to "auto".
Because each hop can only tighten the limits, the values a client
receives are the strictest on the path.</t>
        <t>Only the party that has to satisfy a limit can raise it. Replacing
append-alignment with a multiple of its current value is a further
restriction on the client, not a new permission, which is why an
intermediary may do it. Raising max-parallel or reorder-window would
commit the server to work it has not agreed to, so an intermediary
cannot do that even though it could reassemble the data itself. An
intermediary that takes over parallel mode on the client-facing hop
(<xref target="translation"/>) is a different case: there it acts as the server, and
it <bcp14>MAY</bcp14> advertise its own limits, including larger ones, because it
services them itself.</t>
        <t>An intermediary that tightens a limit <bcp14>MUST</bcp14> enforce the value it
advertised. The server knows only its own limits, so it would accept an
append that breaks a tighter one. The intermediary therefore rejects or
delays such an append itself, in the same way a server does
(<xref target="server-window"/>, <xref target="h2h3-flow"/>).</t>
        <t>Changing commit from "auto" to "explicit" works with any server that
implements this document, because such a server accepts an empty
append as the tail append in either mode (<xref target="completion"/>). An
intermediary that makes this change tracks which ranges the server has
received and applies the explicit-commit rules toward the client: if
the client sends the commit request while ranges are still missing, the
intermediary responds with 409 (Conflict) and "incomplete-ranges"
instead of forwarding it (<xref target="commit-explicit"/>).</t>
      </section>
      <section anchor="fallback">
        <name>Falling Back to Sequential Uploads</name>
        <t>An upload is in parallel mode if, and only if, the client sent
Upload-Parallel with the value true and the Upload-Limit field in the
response to upload creation contains either max-parallel with a value
greater than 1, or reorder-window without max-parallel. A max-parallel
value of 1 in that response always means sequential, even when
reorder-window is also present. In every other case, client and server
<bcp14>MUST</bcp14> follow <xref target="RESUMABLE"/> without the changes in this document. This is
the only rule that decides the mode; other sections refer to it.</t>
        <t>The mode is fixed when the upload is created, but the limits can change
during the upload. Any response for the upload resource, whether to an
append or to offset retrieval, <bcp14>MAY</bcp14> carry a different Upload-Limit. Each
Upload-Limit field carries the complete current values: a parameter that
is absent from it has the default meaning given in <xref target="limits"/>, not its
previous value. A server <bcp14>MAY</bcp14> raise or lower its own limits. An
intermediary recomputes its values from each new value it receives from
upstream and still only tightens it (<xref target="tightening"/>). A client <bcp14>MUST</bcp14>
apply the most recent values to appends it starts after receiving them,
and a change never invalidates an append already in progress
(<xref target="server-window"/>). A later max-parallel of 1 limits the client to one
append at a time but does not end parallel mode; Upload-Received and the
other rules of this document still apply.</t>
      </section>
    </section>
    <section anchor="appends">
      <name>Parallel Appends</name>
      <section anchor="window">
        <name>The Reorder Window</name>
        <t>Let C be the contiguous offset, L the upload length, and W the reorder
window. In parallel mode, an append that covers bytes [o, o + n),
where n is the length of its content, is inside the window if and only
if:</t>
        <artwork type="ascii-art"><![CDATA[
    o + n <= min(C + W, L)
]]></artwork>
        <t>A client <bcp14>MUST NOT</bcp14> start an append that is outside the window as
computed from the most recent Upload-Offset it has received. Because C
only grows, an append that was inside the window when it started stays
inside it.</t>
        <t>A window equal to L allows unrestricted parallelism. A window equal to
the size of one append results in sequential behavior while still
permitting a new append to start as soon as the previous one
completes.</t>
      </section>
      <section anchor="append-requests">
        <name>Append Requests</name>
        <t>Appends in parallel mode use the PATCH method and the
application/partial-upload media type, as defined in <xref target="RESUMABLE"/>. The
Upload-Offset request field carries the offset o at which the content
starts; the content length gives n.</t>
        <t>In parallel mode, Upload-Offset in an append request is not required to
equal the server's current offset. It is the start of the byte range
the append writes. A client <bcp14>MUST</bcp14> send Content-Length on every append in
parallel mode, so that a recipient knows the full range before the
content arrives.</t>
        <t>If max-parallel is present, a client <bcp14>MUST NOT</bcp14> have more than that many
appends to the same upload in progress at once. An append is in
progress from when its request starts until its response is received
or the request is abandoned.</t>
        <t>A client <bcp14>SHOULD</bcp14> include a Content-Digest field <xref target="RFC9530"/> on each
append so that the server and intermediaries can verify each range on
its own.</t>
        <sourcecode type="http-message"><![CDATA[
PATCH /uploads/abc HTTP/1.1
Host: example.com
Content-Type: application/partial-upload
Upload-Offset: 4194304
Upload-Complete: ?0
Content-Length: 2097152
Content-Digest: sha-256=:(base64-encoded SHA-256 of the content):

[2097152 bytes]
]]></sourcecode>
      </section>
      <section anchor="overlap">
        <name>Overlapping and Repeated Ranges</name>
        <t>An append may overlap ranges the server has already received, for
example when a client retries an append whose response it did not
receive. Retrying a range with identical content is always safe.</t>
        <t>A server <bcp14>MAY</bcp14> discard overlapping bytes without comparing them. If a
server detects that overlapping bytes differ from the stored bytes
(using Content-Digest, say), it <bcp14>MUST</bcp14> reject the append with status 409
(Conflict) and the problem type "range-conflict" (<xref target="problems"/>).</t>
        <t>Two appends in flight for the same range with identical content are
not a conflict. The server treats the newer one as a retry of the older
(see below), and the range is stored once. The problem type
"range-conflict" applies only when overlapping bytes differ.</t>
        <t>If a new append overlaps a range that is being written by an append
still in progress, the server <bcp14>SHOULD</bcp14> terminate the older append before
processing the new one. This applies the rule of
<xref section="4.6" sectionFormat="of" target="RESUMABLE"/> per byte range instead of per upload: the
newer request is taken to be a retry of the older one. Bytes the older
append stored before termination remain received.</t>
      </section>
      <section anchor="interrupted">
        <name>Interrupted Appends</name>
        <t>When an append is interrupted, the server <bcp14>MAY</bcp14> keep the bytes it
received as a received range, as in <xref target="RESUMABLE"/>. In parallel mode,
this can leave a gap after the kept bytes. The client learns about the
gap through offset retrieval (<xref target="upload-received"/>) and re-sends only
the missing bytes.</t>
      </section>
    </section>
    <section anchor="upload-received">
      <name>Reporting Received Ranges</name>
      <t>The Upload-Received response header field is a List of Inner Lists
<xref target="RFC9651"/>. Each Inner List contains exactly two Integers, the start
and end of a received range [start, end):</t>
      <sourcecode type="http-message"><![CDATA[
Upload-Offset: 1048576
Upload-Received: (0 1048576), (2097152 6291456)
]]></sourcecode>
      <t>The ranges <bcp14>MUST</bcp14> be listed in ascending order and <bcp14>MUST NOT</bcp14> overlap or
touch; adjacent ranges are merged. If the contiguous offset is greater
than 0, the first range starts at 0 and ends at the contiguous offset.</t>
      <t>In parallel mode, a server <bcp14>MUST</bcp14> include Upload-Received in every offset
retrieval response and <bcp14>SHOULD</bcp14> include it in responses to appends. The
Upload-Offset field keeps the meaning defined in <xref target="RESUMABLE"/>: it is
the contiguous offset, and it never decreases.</t>
      <t>A server <bcp14>MUST NOT</bcp14> list a range it has not stored. A server <bcp14>MAY</bcp14> omit
ranges beyond the contiguous offset, for example to limit the size of
the field; the client then re-sends those bytes, which is safe
(<xref target="overlap"/>).</t>
    </section>
    <section anchor="completion">
      <name>Upload Completion</name>
      <t>In parallel mode an upload is complete when its received ranges cover
[0, L) and the server has received the tail append. The tail append is
the append that carries Upload-Complete with the value true. Every
other append <bcp14>MUST</bcp14> carry Upload-Complete with the value false.</t>
      <section anchor="commit-auto">
        <name>Automatic Commit</name>
        <t>When commit is "auto", the tail append is normally the data append that
ends at L. A client <bcp14>MUST</bcp14> set Upload-Complete to true on the append that
ends at L and on no other append. A server that receives Upload-Complete
set to true on an append that does not end at L <bcp14>MUST</bcp14> reject it with
status 400 (Bad Request).</t>
        <t>In either commit mode, a server <bcp14>MUST</bcp14> also accept an empty append at
offset L carrying Upload-Complete set to true as the tail append, if it
has not already received one. <xref target="RESUMABLE"/> already allows such an
append to complete an upload whose content has all arrived; accepting
it in automatic mode is what lets an intermediary change the commit
mode (<xref target="tightening"/>).</t>
        <t>If gaps remain when the tail append has been received, the server
responds to the tail append with 204 (No Content) and the current
Upload-Offset and Upload-Received. The upload completes when the last
gap is filled. The append that fills it receives the final response for
the upload, as described in <xref target="RESUMABLE"/>. Other appends receive 204
(No Content).</t>
      </section>
      <section anchor="commit-explicit">
        <name>Explicit Commit</name>
        <t>When commit is "explicit", every data append, including the one that
ends at L, carries Upload-Complete set to false. After the client has
received successful responses for all ranges, it sends an append with
empty content, Upload-Offset set to L, and Upload-Complete set to true.
That empty append is the tail append and receives the final response.</t>
        <t>If the server receives the tail append while gaps remain, it <bcp14>MUST</bcp14>
reject it with status 409 (Conflict), the problem type
"incomplete-ranges", and the Upload-Received field.</t>
        <t>Explicit commit separates receiving the data from committing it. It
lets a client check the whole representation, using Repr-Digest
<xref target="RFC9530"/>, before committing. It also keeps the tail append small,
which helps intermediaries that hold it (<xref target="hold-tail"/>).</t>
      </section>
    </section>
    <section anchor="updates">
      <name>Changes to Resumable Upload Rules in Parallel Mode</name>
      <t>For uploads in parallel mode only, this document changes the following
rules of <xref target="RESUMABLE"/>. Section numbers refer to version 13 of that
draft; each rule is also described in words, so that it can be found if
the numbering changes. All other rules apply unchanged.</t>
      <table anchor="tab-updates">
        <name>Rules Changed in Parallel Mode</name>
        <thead>
          <tr>
            <th align="left">Rule in RESUMABLE</th>
            <th align="left">Change in parallel mode</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Section 4.6: a client must not transfer data for one upload in parallel</td>
            <td align="left">Several appends may be in progress, within the limits of <xref target="limits"/> (<xref target="append-requests"/>).</td>
          </tr>
          <tr>
            <td align="left">Section 4.6: a new request terminates the older one</td>
            <td align="left">Applies per overlapping byte range (<xref target="overlap"/>).</td>
          </tr>
          <tr>
            <td align="left">Section 4.4.2: Upload-Offset must match the current offset, otherwise 409</td>
            <td align="left">Any append inside the reorder window is accepted (<xref target="window"/>).</td>
          </tr>
          <tr>
            <td align="left">Upload-Complete marks the final append</td>
            <td align="left">Marks the tail append; completion requires full coverage (<xref target="completion"/>).</td>
          </tr>
        </tbody>
      </table>
      <t><xref target="RESUMABLE"/> is sequential for a good reason. Without negotiation, a
server cannot tell a deliberate concurrent append from a stale request
that the client gave up on, such as one left behind on a half-open
connection. Negotiating parallel mode removes that ambiguity, and
applying the termination rule per range keeps the protection against
stale requests.</t>
    </section>
    <section anchor="client-reqs">
      <name>Client Behavior</name>
      <ul spacing="normal">
        <li>
          <t>A client <bcp14>SHOULD</bcp14> choose append sizes that are multiples of
append-alignment and small enough that several fit inside the reorder
window.</t>
        </li>
        <li>
          <t>A client <bcp14>SHOULD</bcp14> keep the append that starts at the contiguous offset
in progress at all times, because the window cannot slide until that
range arrives.</t>
        </li>
        <li>
          <t>If the append at the contiguous offset is much slower than the
others, a client <bcp14>MAY</bcp14> replace it by sending the same range again on
another stream or connection. Because the server terminates the older
of two appends for the same range (<xref target="overlap"/>), the new request
replaces the old one rather than racing it, so the client <bcp14>SHOULD</bcp14>
cancel the old request when it sends the new one. Only the new request
then counts against max-parallel.</t>
        </li>
        <li>
          <t>After any failed or abandoned append, a client <bcp14>SHOULD</bcp14> perform offset
retrieval and re-send only ranges missing from Upload-Received.</t>
        </li>
        <li>
          <t>A client that receives status 409 with the problem type
"offset-outside-window" <bcp14>MUST</bcp14> wait until the contiguous offset has
advanced before retrying that range.</t>
        </li>
        <li>
          <t>A client <bcp14>SHOULD</bcp14> send Repr-Digest <xref target="RFC9530"/> for the whole
representation, either at upload creation or on the tail append.</t>
        </li>
        <li>
          <t>If a request for the upload resource fails with 404 (Not Found) or
410 (Gone), the upload no longer exists (<xref target="server-failure"/>) and a
client <bcp14>MUST</bcp14> create a new one rather than continue sending ranges.</t>
        </li>
      </ul>
    </section>
    <section anchor="server-reqs">
      <name>Server Requirements</name>
      <section anchor="server-state">
        <name>Upload State</name>
        <t>A server that supports parallel mode <bcp14>MUST</bcp14> track the received ranges of
each upload in parallel mode, and update them atomically: a range is
either fully recorded or not recorded at all. Offset retrieval
responses <bcp14>MUST</bcp14> reflect every range recorded before the request was
received.</t>
        <t>When requests for one upload can reach different server instances, for
example behind a load balancer, all instances <bcp14>MUST</bcp14> share a consistent
view of the received ranges, or requests for an upload <bcp14>MUST</bcp14> be routed
to a single instance.</t>
      </section>
      <section anchor="server-window">
        <name>Enforcing Limits</name>
        <t>A server <bcp14>MUST</bcp14> reject an append that is outside the reorder window with
status 409 (Conflict), the problem type "offset-outside-window", and
the current Upload-Offset, unless it delays the append as described in
<xref target="h2h3-flow"/>.</t>
        <t>A server <bcp14>MAY</bcp14> reject an append with status 429 (Too Many Requests), the
problem type "too-many-parallel", and a Retry-After field when accepting
it would exceed max-parallel or, if max-parallel is absent, the number
of concurrent appends the server can currently handle.</t>
        <t>A server <bcp14>MUST</bcp14> reject an append whose offset or length violates
append-alignment with status 400 (Bad Request) and the problem type
"misaligned-append".</t>
        <t>A server <bcp14>MAY</bcp14> raise or lower its limits during an upload, for example as
its load changes, and signals new values in its next responses
(<xref target="fallback"/>). It <bcp14>MUST NOT</bcp14> reject an append that was inside the limits
it last advertised when the append started solely because the limits
changed.</t>
      </section>
      <section anchor="server-storage">
        <name>Storage and Visibility</name>
        <t>A server <bcp14>MAY</bcp14> write ranges directly into a single sparse object or store
them separately and join them on completion. The choice is not visible
to clients.</t>
        <t>Until an upload is complete, a server <bcp14>MUST NOT</bcp14> make its content
available as the representation of any target resource, and <bcp14>MUST NOT</bcp14>
fill gaps with placeholder bytes that could be mistaken for uploaded
content. An upload that is cancelled or expires <bcp14>MUST</bcp14> be discarded
without being committed.</t>
        <t>If a Repr-Digest was provided, the server <bcp14>SHOULD</bcp14> verify it against the
joined content before committing and <bcp14>MUST NOT</bcp14> commit on a mismatch.</t>
      </section>
      <section anchor="server-resources">
        <name>Resource Management</name>
        <t>The reorder window bounds how much out-of-order data a server has to
buffer per upload. A server that buffers in memory <bcp14>SHOULD</bcp14> choose
reorder-window and max-parallel according to its memory budget, and
<bcp14>SHOULD</bcp14> also limit the number of concurrent uploads per client.</t>
      </section>
      <section anchor="server-failure">
        <name>Expiry, Failure, and Loss of State</name>
        <t>Uploads expire as described in <xref target="RESUMABLE"/>, and a server <bcp14>SHOULD</bcp14> state
its expiry through the max-age parameter of Upload-Limit so that
clients and intermediaries can bound how long they keep state for an
upload. An upload that expires or is cancelled <bcp14>MUST</bcp14> be discarded
without being committed (<xref target="server-storage"/>).</t>
        <t>Upload-Offset never decreases, and Upload-Received lists only ranges
the server holds. A server that loses recorded ranges, for example when
an instance without shared state restarts, therefore <bcp14>MUST NOT</bcp14> report a
smaller contiguous offset or fewer ranges for that upload. It <bcp14>MUST</bcp14>
instead fail subsequent requests for the upload resource with 404 (Not
Found) or 410 (Gone), so that the client creates a new upload rather
than completing one with missing bytes.</t>
      </section>
    </section>
    <section anchor="intermediary-reqs">
      <name>Intermediary Requirements</name>
      <section anchor="all-intermediaries">
        <name>All Intermediaries</name>
        <t>Appends in parallel mode are ordinary HTTP requests. An intermediary
that does not implement this document forwards them without change,
and parallel mode works through it.</t>
        <t>An intermediary that implements this document:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MAY</bcp14> tighten Upload-Limit as described in <xref target="tightening"/>, and <bcp14>MUST
NOT</bcp14> loosen it;</t>
          </li>
          <li>
            <t><bcp14>MAY</bcp14> force sequential behavior by removing Upload-Parallel from an
upload creation request or by setting max-parallel to 1 in the upload
creation response (<xref target="fallback"/>);</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> enforce any limit it tightens (<xref target="tightening"/>);</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> remove or alter Upload-Received, except as described in
<xref target="hold-tail-retrieval"/>;</t>
          </li>
          <li>
            <t>when it balances load across servers, <bcp14>MUST</bcp14> meet the consistency
requirement of <xref target="server-state"/>, for example by routing all requests
for an upload resource to the same server.</t>
          </li>
        </ul>
        <t>Responses to appends and to offset retrieval are not cacheable, as
specified in <xref target="RESUMABLE"/>; this is unchanged.</t>
      </section>
      <section anchor="translation">
        <name>Terminating Parallel Mode at an Intermediary</name>
        <t>An intermediary <bcp14>MAY</bcp14> accept parallel mode from clients while forwarding
the upload to the server sequentially, for example because the server
does not support this extension or is reached over a different HTTP
version. Such an intermediary acts as the server for parallel mode on
the client-facing hop: it <bcp14>MUST</bcp14> meet the requirements of
<xref target="server-reqs"/> for that hop, buffer out-of-order data within the
window it advertises, and forward bytes upstream in order as the
contiguous offset advances.</t>
      </section>
      <section anchor="inspecting">
        <name>Inspecting Intermediaries</name>
        <t>An inspecting intermediary examines upload content before it reaches,
or is committed at, the server. Such intermediaries only see content
where they already terminate TLS, usually under an enterprise policy.
This document does not change that.</t>
        <section anchor="in-order">
          <name>In-Order Processing</name>
          <t>Many inspection engines need content in order: file types are
recognized from the first bytes, and patterns can span append
boundaries. An inspecting intermediary that processes content in
order:</t>
          <ul spacing="normal">
            <li>
              <t><bcp14>SHOULD</bcp14> advertise a reorder-window no larger than the buffer it can
dedicate to the upload;</t>
            </li>
            <li>
              <t>buffers appends that arrive ahead of the contiguous offset and passes
bytes to its engines in order as gaps fill;</t>
            </li>
            <li>
              <t><bcp14>MUST NOT</bcp14> evaluate appends only in isolation when its policy can match
content that spans appends;</t>
            </li>
            <li>
              <t><bcp14>MAY</bcp14> use Content-Digest to recognize a retried range it has already
inspected and skip inspecting it again.</t>
            </li>
          </ul>
          <t>In-order inspection needs a single view of the whole upload. When
several instances of an intermediary share the load, all requests for
one upload resource <bcp14>MUST</bcp14> reach the same instance, or the instances <bcp14>MUST</bcp14>
share the buffered and inspection state of the upload. An instance that
receives an append for an upload whose earlier content it has not
inspected, and cannot obtain that state, <bcp14>MUST</bcp14> treat this as lost state
(<xref target="inspect-failure"/>).</t>
          <t>Some formats can only be analyzed as a whole, such as archives that
keep their index at the end. For those, an intermediary keeps the
content as it passes and inspects the complete content before releasing
the tail. This needs storage for the whole upload but not a larger
reorder window, since the content still arrives in order within the
window; an intermediary <bcp14>MUST NOT</bcp14> raise reorder-window for this purpose
(<xref target="tightening"/>).</t>
        </section>
        <section anchor="forwarding">
          <name>Forwarding Strategies</name>
          <t>The <bcp14>RECOMMENDED</bcp14> approach is to forward every append as soon as it
arrives, inspect the content in order alongside, and hold back only the
tail append until there is a verdict (<xref target="hold-tail"/>). Upload throughput
is unaffected; the only added delay is the time needed to inspect the
last data received.</t>
          <t>The simplest way to do this is to set commit to "explicit" when
tightening limits (<xref target="tightening"/>). Every append then reaches the
server unchanged, and the only request the intermediary holds is the
empty commit request at the end, which it forwards once its verdict
allows the content.</t>
          <t>An intermediary that does not want the server to store uninspected
bytes at all can instead forward each range only after inspecting it,
at the cost of more delay. It can also forward the upload sequentially,
as described in <xref target="translation"/>.</t>
        </section>
        <section anchor="hold-tail">
          <name>Holding the Tail Append</name>
          <t>Whatever forwarding strategy it uses, an inspecting intermediary <bcp14>MUST
NOT</bcp14> forward the tail append to the server before its verdict for the
upload is that the content is allowed. Since a server cannot complete
an upload without its tail append (<xref target="completion"/>), this is enough to
keep uninspected content from being committed, even if the server
knows nothing about inspection or about this document.</t>
          <t>The intermediary always knows which append is the tail: it carries
Upload-Complete set to true and, with automatic commit, ends at the
upload length. With explicit commit the tail append is the empty commit
request, so holding it delays nothing but the commit itself. That is
the same rule as the strategy in <xref target="forwarding"/>, not an alternative to
it.</t>
          <t>With automatic commit the tail append can be large. The intermediary
<bcp14>MAY</bcp14> forward all of it except a final part, as an append with
Upload-Complete set to false, and hold only that final part as the tail
it forwards later. The forwarded part is not a tail append, so if
append-alignment applies it <bcp14>MUST</bcp14> end at a multiple of append-alignment:
the intermediary forwards up to the largest such multiple that is less
than the upload length and holds the rest. If no such multiple lies
within the tail append, the intermediary holds all of it. With explicit
commit the tail append is empty and nothing needs to be split.</t>
        </section>
        <section anchor="hold-tail-retrieval">
          <name>Offset Retrieval While Holding</name>
          <t>With automatic commit, the held tail carries content the server has
not yet received. While it holds it, the intermediary <bcp14>SHOULD</bcp14> answer
offset retrieval requests for the upload itself, or modify the server's
response, so that the held range is reported as received and the
Upload-Inspection field (<xref target="upload-inspection"/>) is included. Otherwise
the client would see a gap at the end and re-send the tail, which is
safe but wasteful. With explicit commit no content is held, and the
intermediary only adds Upload-Inspection to these responses.</t>
        </section>
        <section anchor="verdicts">
          <name>Verdicts</name>
          <dl newline="true">
            <dt>Allowed:</dt>
            <dd>
              <t>The intermediary forwards the tail append. It relays the server's
final response to the client and adds Upload-Inspection with state
"clean".</t>
            </dd>
            <dt>Blocked:</dt>
            <dd>
              <t>The intermediary <bcp14>MUST NOT</bcp14> forward the tail append. It <bcp14>SHOULD</bcp14> cancel
the upload at the server using upload cancellation as defined in
<xref target="RESUMABLE"/>, and responds to the client with status 403 (Forbidden)
and the problem type "upload-blocked". Later requests for the upload
receive the same response.</t>
            </dd>
            <dt>Pending:</dt>
            <dd>
              <t>If inspection takes longer than the intermediary is willing to hold
the request, it <bcp14>MAY</bcp14> respond to the tail append with status 202
(Accepted), a Retry-After field, and Upload-Inspection with state
"scanning". The client then uses offset retrieval until the response
shows the upload as complete or blocked.</t>
            </dd>
          </dl>
        </section>
        <section anchor="upload-inspection">
          <name>The Upload-Inspection Response Field</name>
          <t>The Upload-Inspection response header field is a Dictionary
<xref target="RFC9651"/> that an inspecting intermediary uses to report progress:</t>
          <sourcecode type="http-message"><![CDATA[
Upload-Inspection: state=scanning, scanned=7340032
]]></sourcecode>
          <dl>
            <dt>state:</dt>
            <dd>
              <t>A Token: "scanning", "clean", or "blocked".</t>
            </dd>
            <dt>scanned:</dt>
            <dd>
              <t>An Integer, optional: the offset up to which content has been
inspected.</t>
            </dd>
          </dl>
          <t>Only inspecting intermediaries set this field. A client <bcp14>MUST NOT</bcp14> treat
it as a statement by the server, and <bcp14>MAY</bcp14> use it to explain delays to
users. Unknown keys <bcp14>MUST</bcp14> be ignored.</t>
        </section>
        <section anchor="inspect-failure">
          <name>Timeouts and Failures</name>
          <t>An intermediary <bcp14>SHOULD</bcp14> bound how long it holds a tail append. If it
cannot reach a verdict, because an inspection engine is unavailable or
the upstream server is failing, it <bcp14>MUST NOT</bcp14> forward the tail. It
<bcp14>SHOULD</bcp14> cancel the upload at the server and fail the client's request,
so that content that was never inspected is not left stored and cannot
be committed later.</t>
          <t>An intermediary that abandons an upload, for example when the client
disconnects or the intermediary itself restarts, <bcp14>SHOULD</bcp14> cancel the
upload at the server rather than rely on expiry.</t>
          <t>An intermediary that loses its buffered or inspection state for an
upload, for example after a restart, cannot recover by inspecting again.
The content before the contiguous offset is already at the server and
will not be sent again, and in-order engines would also miss the start
of the content, where file types are recognized. The intermediary
therefore <bcp14>MUST NOT</bcp14> forward the tail append for that upload. It <bcp14>MUST</bcp14>
cancel the upload at the server and respond to the client's requests for
it with 410 (Gone), so that the client creates a new upload
(<xref target="client-reqs"/>). An intermediary that terminates parallel mode
(<xref target="translation"/>) acts as the server on the client-facing hop and
follows <xref target="server-failure"/> in the same way.</t>
          <t>If forwarding a held tail append fails because the upload has expired
or the server has lost it, the intermediary reports the failure to the
client and discards the held content.</t>
        </section>
        <section anchor="verdict-cache">
          <name>Reusing Earlier Verdicts</name>
          <t>If the client sends Repr-Digest at upload creation, an inspecting
intermediary <bcp14>MAY</bcp14> look up an earlier verdict for that digest under the
same policy. A digest known to be blocked can be refused at upload
creation, before any content is transferred. For a digest known to be
allowed, the intermediary <bcp14>MAY</bcp14> skip its inspection engines, but <bcp14>MUST</bcp14>
still compute the digest of the content as it passes and treat a
mismatch as blocked.</t>
        </section>
      </section>
    </section>
    <section anchor="versions">
      <name>HTTP Version Considerations</name>
      <section anchor="h2h3">
        <name>HTTP/2 and HTTP/3</name>
        <t>Over HTTP/2 <xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/>, each append is a
request on its own stream, and several appends can share one
connection. Parallel appends on one connection already remove the idle
round trip that sequential appends spend waiting for each response, and
a slow append no longer holds up the ranges after it. With HTTP/3, a
lost packet also delays only the stream it belongs to; with HTTP/2 it
delays every stream on the connection.</t>
        <t>Parallel appends on one connection do not raise that connection's
throughput limit, however. All streams on a connection share one
congestion controller, whether the transport is TCP or QUIC, so on a
path with a long round-trip time or packet loss a single connection can
still use only part of the available capacity. Only additional
connections, each with its own congestion controller, lift that limit.
A client <bcp14>MAY</bcp14> therefore spread appends over more than one connection
when a single connection does not use the available capacity, subject
to <xref target="fairness"/>. The total number of appends in progress still stays
within max-parallel when it is present.</t>
        <section anchor="h2h3-priority">
          <name>Priorities</name>
          <t>A client <bcp14>SHOULD</bcp14> use the Priority field <xref target="RFC9218"/> to give the append
that starts at the contiguous offset a lower urgency value (that is,
higher importance) than appends further into the window, for example
u=1 for the first and u=3 to u=5 for later ones. Servers and
intermediaries <bcp14>MAY</bcp14> send PRIORITY_UPDATE frames to adjust this.
Delivering the start of the window first lets the window slide sooner
and reduces the data buffered out of order. Priorities are hints; the
protocol works without them.</t>
        </section>
        <section anchor="h2h3-flow">
          <name>Flow Control</name>
          <t>A request's header section, which carries Upload-Offset and
Content-Length, arrives before its content. A recipient therefore knows
the range of an append before any of its content arrives, and can use
per-stream flow control to delay an append that is outside the window
instead of rejecting it:</t>
          <ul spacing="normal">
            <li>
              <t>For an append inside the window, the recipient grants flow control
credit as usual (WINDOW_UPDATE in HTTP/2, MAX_STREAM_DATA <xref target="RFC9000"/>
in HTTP/3).</t>
            </li>
            <li>
              <t>For an append outside the window, the recipient withholds credit
beyond the initial stream window until the window reaches the append.
The sender pauses on that stream only.</t>
            </li>
            <li>
              <t>The recipient <bcp14>MUST</bcp14> continue to grant connection-level credit to other
streams, so that a delayed stream does not stall them.</t>
            </li>
            <li>
              <t>A recipient <bcp14>MAY</bcp14> reject an append that has been delayed longer than it
is willing to wait, as described in <xref target="server-window"/>.</t>
            </li>
          </ul>
          <t>A delayed stream can still send up to its initial stream window before
pausing. A recipient that delays appends can lower its initial stream
window to bound that data.</t>
          <figure anchor="fig-flow">
            <name>Delaying an Append with Flow Control (W = 6 MiB)</name>
            <artwork type="ascii-art"><![CDATA[
Client                           Recipient
  | HEADERS 1, Upload-Offset: 0       |  C = 0,
  | HEADERS 3, Upload-Offset: 2097152 |  window [0, 6 MiB)
  | HEADERS 5, Upload-Offset: 8388608 |
  |---------------------------------->|
  |      WINDOW_UPDATE streams 1, 3   |  stream 5 is outside
  |<----------------------------------|  the window: no
  | DATA streams 1, 3                 |  further credit
  |---------------------------------->|
  |                                   |  C reaches 4 MiB,
  |      WINDOW_UPDATE stream 5       |  window [4, 10 MiB)
  |<----------------------------------|
  | DATA stream 5                     |
  |---------------------------------->|
]]></artwork>
          </figure>
        </section>
        <section anchor="h2h3-other">
          <name>Cancellation and Early Data</name>
          <t>A client cancels a redundant or abandoned append with RST_STREAM in
HTTP/2 or by resetting the stream in HTTP/3. The server treats it as an
interrupted append (<xref target="interrupted"/>).</t>
          <t>Upload creation and appends <bcp14>MUST NOT</bcp14> be sent in TLS early data. A
server that receives them in early data responds with status 425 (Too
Early) <xref target="RFC8470"/>.</t>
        </section>
      </section>
      <section anchor="http11">
        <name>HTTP/1.1</name>
        <t>Over HTTP/1.1 <xref target="RFC9112"/>, parallel appends use separate connections,
one append per connection at a time. The following rules apply:</t>
        <ul spacing="normal">
          <li>
            <t>If max-parallel is present, a client <bcp14>MUST NOT</bcp14> use more connections
for appends to one upload than that value. Browsers are additionally
limited by their per-origin connection limits.</t>
          </li>
          <li>
            <t>HTTP/1.1 has no per-request flow control. A client <bcp14>MUST NOT</bcp14> start an
append outside the window, and a recipient <bcp14>SHOULD</bcp14> reject such an
append with 409 and "offset-outside-window" rather than delay it.</t>
          </li>
          <li>
            <t>HTTP/1.1 has no priorities. A client keeps the append at the
contiguous offset in progress first and <bcp14>MAY</bcp14> replace it with a new
request on another connection if it stalls (<xref target="client-reqs"/>).</t>
          </li>
          <li>
            <t>Some intermediaries do not forward informational responses. A client
<bcp14>MUST NOT</bcp14> depend on receiving 104 (Upload Resumption Supported) and
<bcp14>SHOULD</bcp14> create the upload with an empty body, taking the upload
resource and limits from the final response.</t>
          </li>
          <li>
            <t>A client <bcp14>MUST NOT</bcp14> pipeline requests.</t>
          </li>
          <li>
            <t>Appends in parallel mode carry Content-Length (<xref target="append-requests"/>)
and therefore do not use chunked transfer coding.</t>
          </li>
          <li>
            <t>A client <bcp14>MAY</bcp14> send Expect: 100-continue, and <bcp14>MUST</bcp14> continue if no 100
(Continue) response arrives, as described in <xref target="RFC9110"/>.</t>
          </li>
        </ul>
        <t>If the upload is not in parallel mode (<xref target="fallback"/>), client and server
use the sequential behavior of <xref target="RESUMABLE"/> unchanged.</t>
      </section>
      <section anchor="fairness">
        <name>Congestion Control and Fairness</name>
        <t>An upload that uses several connections can take more than one
connection's share of a bottleneck it shares with other traffic.
Additional connections are meant for paths where a single connection is
limited by round-trip time or loss, not for gaining a larger share of a
congested link. Therefore:</t>
        <ul spacing="normal">
          <li>
            <t>A client <bcp14>SHOULD</bcp14> start with one connection and open additional
connections only while doing so increases the upload's throughput. It
<bcp14>SHOULD</bcp14> stop adding connections when it does not.</t>
          </li>
          <li>
            <t>A client <bcp14>SHOULD NOT</bcp14> use more connections for one upload than it
needs, and <bcp14>MUST</bcp14> stay within max-parallel when it is present.</t>
          </li>
          <li>
            <t>Servers and intermediaries can limit concurrency for an upload with
max-parallel, and can reject excess appends with 429 (Too Many
Requests) (<xref target="server-window"/>).</t>
          </li>
          <li>
            <t>Each connection runs the congestion control specified for its
transport. This document does not change congestion control.</t>
          </li>
        </ul>
        <t>Multipath extensions to QUIC, under development in the IETF, could
offer a single connection with a separate congestion controller for
each path. This document does not depend on them.</t>
      </section>
    </section>
    <section anchor="problems">
      <name>Problem Types</name>
      <t>Error responses defined in this document use Problem Details
<xref target="RFC9457"/> with the following problem types. Each type URI has the
form https://iana.org/assignments/http-problem-types#NAME.</t>
      <table anchor="tab-problems">
        <name>Problem Types</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Status</th>
            <th align="left">Meaning</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">offset-outside-window</td>
            <td align="left">409</td>
            <td align="left">The append ends beyond the reorder window. The response includes Upload-Offset.</td>
          </tr>
          <tr>
            <td align="left">range-conflict</td>
            <td align="left">409</td>
            <td align="left">The append overlaps received bytes with different content.</td>
          </tr>
          <tr>
            <td align="left">incomplete-ranges</td>
            <td align="left">409</td>
            <td align="left">An explicit commit was sent while gaps remain. The response includes Upload-Received.</td>
          </tr>
          <tr>
            <td align="left">misaligned-append</td>
            <td align="left">400</td>
            <td align="left">The offset or length violates append-alignment.</td>
          </tr>
          <tr>
            <td align="left">too-many-parallel</td>
            <td align="left">429</td>
            <td align="left">More appends are in progress than max-parallel allows, or than the server can currently handle.</td>
          </tr>
          <tr>
            <td align="left">upload-blocked</td>
            <td align="left">403</td>
            <td align="left">An inspecting intermediary blocked the upload by policy.</td>
          </tr>
        </tbody>
      </table>
      <t>A repeated append for a range that is already stored, or for one that
another append is still writing, is not a conflict when the content is
identical; see <xref target="overlap"/>.</t>
      <t>Problem details for "upload-blocked" <bcp14>MUST NOT</bcp14> identify the inspection
engine, signature, or policy rule that matched.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="RESUMABLE"/> apply to this extension as
well.</t>
      <t>A client cannot get more parallelism than every party on the path
allows: intermediaries can only tighten the limits, and they enforce the
limits they tighten (<xref target="tightening"/>), so a client that ignores them
cannot overrun an intermediary's buffers.</t>
      <t>An inspecting intermediary controls whether an upload is committed by
holding its tail append (<xref target="hold-tail"/>). This relies on the intermediary
seeing all of the upload's content in order. An attacker could try to
break that view, for example by steering appends for one upload to
different instances of a load-balanced intermediary, or by provoking a
restart partway through an upload. An intermediary therefore keeps
each upload on one instance or shares its state (<xref target="in-order"/>), and
cancels any upload it cannot inspect completely rather than releasing
it (<xref target="inspect-failure"/>).</t>
      <t>An attacker may try to split content across appends so that no single
append matches an inspection policy. Processing appends in order,
across append boundaries (<xref target="in-order"/>), handles this. Evaluating each
append on its own does not.</t>
      <t>A digest sent by the client is only a claim. Servers and intermediaries
can use it to detect errors or to look up earlier verdicts, but have to
verify it against the actual content before relying on it
(<xref target="verdict-cache"/>).</t>
      <t>The reorder window bounds how much out-of-order data is buffered per
upload, but an attacker can still open many uploads. Servers and
intermediaries need to limit the number of uploads per client, the
total amount of buffered data, and how long they hold delayed appends.
They can respond with 429 (Too Many Requests) when overloaded.</t>
      <t>Incomplete uploads contain gaps and possibly uninspected data. They are
never exposed as the representation of a resource (<xref target="server-storage"/>),
and gaps are never filled with bytes that could reveal other stored
data.</t>
      <t>Detailed inspection results would help an attacker adjust content until
it passes. For that reason Upload-Inspection and "upload-blocked"
responses carry only coarse information (<xref target="problems"/>).</t>
      <t>Parallel mode sends the upload resource URI over more connections. As
in <xref target="RESUMABLE"/>, the URI needs to be hard to guess, and access to it
needs to be tied to the client's authorization.</t>
      <t>Appends are not sent in TLS early data (<xref target="h2h3-other"/>), and repeating
an append with the same content has no effect, so replay does not cause
harm.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-field-names">
        <name>HTTP Field Names</name>
        <t>IANA is asked to register the following fields in the "Hypertext
Transfer Protocol (HTTP) Field Name Registry" established by
<xref target="RFC9110"/>:</t>
        <table anchor="tab-iana-fields">
          <name>Field Registrations</name>
          <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-Parallel</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-parallel"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Received</td>
              <td align="left">permanent</td>
              <td align="left">List</td>
              <td align="left">
                <xref target="upload-received"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Inspection</td>
              <td align="left">permanent</td>
              <td align="left">Dictionary</td>
              <td align="left">
                <xref target="upload-inspection"/> of this document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="upload-limit-parameters">
        <name>Upload-Limit Parameters</name>
        <t><xref target="RESUMABLE"/> does not establish a registry for Upload-Limit
parameters, so the parameters max-parallel, reorder-window,
append-alignment, and commit are defined in <xref target="limits"/> of this document
without a registration. If such a registry is created, IANA is asked to
add these four parameters to it, with a reference to <xref target="limits"/>.</t>
      </section>
      <section anchor="http-problem-types">
        <name>HTTP Problem Types</name>
        <t>IANA is asked to register the problem types listed in <xref target="tab-problems"/>
in the "HTTP Problem Types" registry established by <xref target="RFC9457"/>, each
with a reference to <xref target="problems"/> of this document.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RESUMABLE">
          <front>
            <title>Resumable Uploads for HTTP</title>
            <author fullname="Marius Kleidl" initials="M." surname="Kleidl">
              <organization>Transloadit</organization>
            </author>
            <author fullname="Guoye Zhang" initials="G." surname="Zhang">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="6" month="October" year="2026"/>
            <abstract>
              <t>   HTTP data transfers can encounter interruption due to reasons such as
   canceled requests or dropped connections.  If the intended recipient
   can indicate how much of the data was processed prior to
   interruption, a sender can resume data transfer at that point instead
   of attempting to transfer all of the data again.  HTTP range requests
   support this concept of resumable downloads from server to client.
   This document describes a mechanism that supports resumable uploads
   from client to server using HTTP.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-13"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="RFC9457">
          <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="RFC9530">
          <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="RFC9651">
          <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="RFC8470">
          <front>
            <title>Using Early Data in HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="W. Tarreau" initials="W." surname="Tarreau"/>
            <date month="September" year="2018"/>
            <abstract>
              <t>Using TLS early data creates an exposure to the possibility of a replay attack. This document defines mechanisms that allow clients to communicate with servers about HTTP requests that are sent in early data. Techniques are described that use these mechanisms to mitigate the risk of replay.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8470"/>
          <seriesInfo name="DOI" value="10.17487/RFC8470"/>
        </reference>
        <reference anchor="RFC9218">
          <front>
            <title>Extensible Prioritization Scheme for HTTP</title>
            <author fullname="K. Oku" initials="K." surname="Oku"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document describes a scheme that allows an HTTP client to communicate its preferences for how the upstream server prioritizes responses to its requests, and also allows a server to hint to a downstream intermediary how its responses should be prioritized when they are forwarded. This document defines the Priority header field for communicating the initial priority in an HTTP version-independent manner, as well as HTTP/2 and HTTP/3 frames for reprioritizing responses. These share a common format structure that is designed to provide future extensibility.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9218"/>
          <seriesInfo name="DOI" value="10.17487/RFC9218"/>
        </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="BYTERANGE">
          <front>
            <title>Byte Range PATCH</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   This document specifies a media type for PATCH payloads that
   overwrites a specific byte range, facilitating random access writes
   and segmented uploads of resources.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-patch-byterange-04"/>
        </reference>
        <reference anchor="TUS" target="https://tus.io/protocols/resumable-upload">
          <front>
            <title>tus resumable upload protocol, version 1.0.0</title>
            <author>
              <organization>tus project</organization>
            </author>
            <date year="2016" month="March" day="25"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1153?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document builds on the work of the authors of <xref target="RESUMABLE"/> and
<xref target="BYTERANGE"/>, and on the tus protocol <xref target="TUS"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA5196XbbWJLm//sUGPlH2lkkLXlLp1yubnnJSp1jp92S3J6a
qj59QBIUUSYJNgDaybJdz9LPMk828cVyFwCU3ZM/qmQSvLhL7PFF3PF47Nqy
XRWn2dHbvM5Xq2KVnW23xWbeZIuqzi6KZrfOp6sie7ddVfm8OXL5dFoXH+Mf
DDw0y9viuqr3p1nTzt28mm3yNb1kXueLdtxsP4yXbbudls14q4OMd/zT8fGx
a3bTddk0ZbVp91v60fnLq1/cZreeFvWpm9PAp25WbZpi0+ya06ytd4Wj6dx3
eV3kNK33xTTLN/PsfNMW9aZos6s63zTbqm6P3Keq/nBdV7stPffr1dXbI/eh
2NOH81OXjbPar0Mmg89sftFHJQZeF/Myr/f4N02mLTYtfd5si1lL83Yfi82O
ppll6cuyTFZ09J7mUW6usz/ja3y+zssVfV4W7YK3Zvzp+l8/3Z9U9TW+zevZ
kr7FF83p3bursmmbiXx994y+Kz8Wzd23u+mqnN2Nh7iLH1+X7XI3pZ83+aat
muWW1pNf521b3v3mceD3K9rxpo1e3xtnIq+YlNW3R/z2E5Nlu14Rme3aZVXj
XGgOWbbYrVZCQ5fy+uytfz8/QHuRb8p/5Nh/muz/aWb5qqiP+LtCt1dnPglT
/9drfDWZVeuj/pvOPjTLvM1e58uiWX7K6+9/Uc6/XPsfnvz888P4VW5T1Wsa
4SMTycXLy3evz569ekm0Pn4x8SeIzfE0OTYCzC5+ef7z8fHxqf55chL9eS/8
eT/8+cD+fPDwJ/vz4X3/s0cPT/TPxw9+8p/eO3l86ly5WcRTffaXq5cXZ7/9
uTvVfFvSObaz5Xi6J+7IN9cFPX317vKU98VkTLtrelyWbeuqrWbVapR9LGqw
fXYyOZ4cy462eX1dEPUZ8dEIoDP7TXN3YIOIYYx4Mj0xkhP0avrV34lD+WMW
JNm945NH4+P743sPnZtMJs6Nx+MsnzZtndNz7mpZHJ5vtiraJsuz2aoE+0MM
lMT2JHxERNS7bVvMnfxqlE13bdYu/SjLvMnaKpsWWSPCg6Y5L+pRVm3wzv/a
EdNlRH05bd66mNBUyiYjQbpb4/Hi95ZldAsC9RNqKvkgzInmQsPPs3m5WBQ1
feSI22jW1YLn0hCd24RoBsaJk+yyqHEYLEgjeVcWDcZ0q3Jdttm0apc8jAhn
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
LrH//w86kXqAosQAAA==

-->

</rfc>
