<?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.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpapi-patch-byterange-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-patch-byterange-00"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2023" month="September" day="06"/>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>HTTP</keyword>
    <abstract>
      <?line 33?>

<t>This document specifies a media type for PATCH payloads that overwrites a specific byte range, to allow random access writes, or allow a resource to be uploaded in several segments.</t>
    </abstract>
  </front>
  <middle>
    <?line 39?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Filesystem interfaces typically provide some way to write at a specific position in a file. While HTTP supports reading byte range offsets using the Range header (<xref section="14" sectionFormat="of" target="RFC9110"/>), this technique cannot generally be used in PUT, because the server may ignore the Content-Range header while executing the write, causing data corruption. However, by using a method and media type that the server must understand, writes to byte ranges with Content-Range semantics becomes possible even when server support is undetermined.</t>
      <t>This media type is intended for use in a wide variety of applications where overwriting specific parts of the file is desired. This includes idempotently writing data to a stream, appending data to a file, overwriting specific byte ranges, or writing to multiple regions in a single operation (for example, appending audio to a recording in progress while updating metadata at the beginning of the file).</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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>
        <t>This document uses ABNF as defined in <xref target="RFC5234"/> and imports grammar rules from <xref target="RFC9112"/>.</t>
        <t>For brevity, example HTTP requests or responses may add newlines or whitespace,
or omit some headers necessary for message transfer.</t>
        <t>The term "byte" is used in the <xref target="RFC9110"/> sense to mean "octet." Ranges are zero-indexed and inclusive. For example, "bytes 0-0" means the first byte of the document, and "bytes 1-2" is a range with two bytes, starting one byte into the document. Ranges of zero bytes are described by an address offset rather than a range. For example, "at byte 5" would separate the byte ranges 0-4 and 5-9.</t>
      </section>
    </section>
    <section anchor="modifying-a-content-range-with-patch">
      <name>Modifying a content range with PATCH</name>
      <t>The Content-Range field in a PUT request requires support by the server in order to be processed correctly. Without specific support, the server's normal behavior would be to ignore the header, replacing the entire resource with just the part that changed, causing data corruption. To mitigate this, Content-Range may be used in conjunction with the PATCH method <xref target="RFC5789"/> as part of a media type whose semantics are to write at the specified byte offset. This document re-uses the "multipart/byteranges" media type, and defines the "message/byterange" media type, for this purpose.</t>
      <t>A byte range patch lists one or more <em>parts</em>. Each part specifies two essential components:</t>
      <ol spacing="normal" type="1"><li>Part fields: a list of HTTP fields that specify metadata, including the range being written to, the length of the body, and information about the target document that cannot be listed in the PATCH headers, e.g. Content-Type (where it would describe the patch itself, rather than the document being updated).</li>
        <li>A part body: the actual data to write to the specified location.</li>
      </ol>
      <t>Each part MUST indicate a single contiguous range to be written to. Servers MUST reject byte range patches that don't contain a known range with a 422 or 400 error. (This would mean the client may be using a yet-undefined mechanism to specify the target range.)</t>
      <t>The simplest form to represent a byte range patch is the "message/byterange" media type, which is similar to an HTTP message:</t>
      <sourcecode type="http"><![CDATA[
Content-Range: bytes 2-5/12

cdef
]]></sourcecode>
      <t>This patch represents an instruction to write the four bytes "cdef" at an offset of 2 bytes. A document listing the digits 0-9 in a row, would look like this after applying the patch:</t>
      <artwork><![CDATA[
01cdef6789␍␊
]]></artwork>
      <t>Although this example is a text document with a line terminator, patches are only carried as binary data, and can potentially carry or overwrite parts of multi-byte characters.</t>
      <section anchor="the-content-range-field">
        <name>The Content-Range field</name>
        <t>The Content-Range field (as seen inside a patch document) is used to specify where in the target document the part body will be written.</t>
        <t>The client MAY indicate the anticipated final size of the document by providing the complete-length form, for example <tt>bytes 0-11/12</tt>. This value of complete-length does not affect the write, however the server MAY use it for other purposes, especially for preallocating an optimal amount of space, and deciding when an upload in multiple parts has finished.</t>
        <t>If the client does not know or care about the final length of the document, it MAY use <tt>*</tt> in place of complete-length. For example, <tt>bytes 0-11/*</tt>. Most random access writes will follow this form.</t>
        <t>As a special case, a Content-Range where the "last-pos" is omitted indicates that the upload length is indeterminate, and only the starting offset is known:</t>
        <sourcecode type="abnf"><![CDATA[
Content-Range =/ range-unit SP first-pos "-/" ( complete-length / "*" )
]]></sourcecode>
        <t>The unsatisfied-range form (e.g. <tt>bytes */1000</tt>) is not meaningful, it MUST be treated as a syntax error. <cref anchor="_1">This form could potentially be used to specify the intended size of the target resource, without providing any data at all.</cref></t>
      </section>
      <section anchor="the-content-length-field">
        <name>The Content-Length field</name>
        <t>A "Content-Length" part field, if provided, describes the length of the part body. (To describe the size of the entire target resource, see the Content-Range field.)</t>
        <t>If provided, it MUST exactly match the length of the range specified in the Content-Range field, and servers MUST error when the Content-Length mismatches the length of the range.</t>
      </section>
      <section anchor="the-content-type-field">
        <name>The Content-Type field</name>
        <t>A "Content-Type" part field MUST have the same effect as if provided in a PUT request uploading the entire resource (patch applied).
Its use is typically limited to creating resources.</t>
      </section>
      <section anchor="other-fields">
        <name>Other fields</name>
        <t>Other part fields in the patch document SHOULD have the same meaning as if provided in a PUT request uploading the entire resource (patch applied).</t>
        <t>Use of such fields SHOULD be limited to cases where the meaning in the HTTP request headers would be different, where they would describe the entire patch, rather than the part. For example, the "Content-Type" field.</t>
      </section>
      <section anchor="applying-a-patch">
        <name>Applying a patch</name>
        <t>Servers SHOULD NOT accept requests that write beyond, and not adjacent to, the end of the resource. This would create a sparse file, where some bytes are undefined. For example, writing at byte 601 of a resource where bytes 0-599 are defined; this would leave byte 600 undefined. Servers that accept sparse writes MUST NOT disclose existing content, and SHOULD fill in undefined regions with zeros.</t>
        <t>The expected length of the write can be computed from the part fields. If the actual length of the part body mismatches the expected length, this MUST be treated the same as a network interruption at the shorter length, but anticipating the longer length. Recovering from this interruption may involve rolling back the entire request, or saving as many bytes as possible. The client can then recover the same way it would recover from a network error.</t>
      </section>
      <section anchor="the-multipartbyteranges-media-type">
        <name>The multipart/byteranges media type</name>
        <t>The following is a request with a "multipart/byteranges" body to write two ranges in a document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
Content-Length: 206
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

--THIS_STRING_SEPARATES
Content-Range: bytes 2-6/25
Content-Type: text/plain

23456
--THIS_STRING_SEPARATES
Content-Range: bytes 17-21/25
Content-Type: text/plain

78901
--THIS_STRING_SEPARATES--
]]></sourcecode>
        <t>The syntax for multipart messages is defined in <xref section="5.1.1" sectionFormat="comma" target="RFC2046"/>. While the body cannot contain the boundary, servers MAY use the Content-Length field to skip to the boundary (potentially ignoring a boundary in the body, which would be an error by the client).</t>
        <t>The multipart/byteranges type may be used for operations where multiple regions must be updated at the same time; clients may have an expectation that if there's an interruption, all of the parts will be rolled back.</t>
      </section>
      <section anchor="message-byterange">
        <name>The message/byterange media type</name>
        <t>When making a request with a single byte range, there is no need for a multipart boundary marker. This document defines a new media type "message/byterange" with the same semantics as a single byte range in a multipart/byteranges message, but with a simplified syntax.</t>
        <t>The "message/byterange" form may be used in a request as so:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 272
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Content-Range: bytes 100-299/600
Content-Type: text/plain

[200 bytes...]
]]></sourcecode>
        <t>This represents a request to modify a 600-byte document, overwriting 200 bytes of it, starting at a 100-byte offset.</t>
        <section anchor="syntax">
          <name>Syntax</name>
          <t>The syntax re-uses concepts from the "multipart/byteranges" media type, except it omits the multipart separator, and so only allows a single range to be specified. It is also similar to the "message/http" media type, except the first line (the status line or request line) is omitted; a message/byterange document can be fed into a message/http parser by first prepending a line like "PATCH / HTTP/1.1".</t>
          <t>It follows the syntax of HTTP message headers and body. It MUST include the Content-Range header field. If the message length is known by the sender, it SHOULD contain the Content-Length header field. Unknown or nonapplicable header fields MUST be ignored.</t>
          <t>The field-line and message-body productions are specified in <xref target="RFC9112"/>.</t>
          <sourcecode type="abnf"><![CDATA[
byterange-document = *( field-line CRLF )
                     CRLF
                     [ message-body ]
]]></sourcecode>
          <t>This document has the same semantics as a single part in a "multipart/byteranges" document (<xref section="5.1.1" sectionFormat="of" target="RFC2046"/>) or any response with a 206 (Partial Content) status code (<xref section="15.3.7" sectionFormat="of" target="RFC9110"/>). A "message/byterange" document may be trivially transformed into a "multipart/byteranges" document by prepending a dash-boundary and CRLF, and appending a close-delimiter (a CRLF, dash-boundary, terminating "<tt>--</tt>", and optional CRLF).</t>
        </section>
      </section>
      <section anchor="message-binary">
        <name>The application/byteranges media type</name>
        <t>The "application/byteranges" has the same semantics as "multipart/byteranges" but follows a binary format similar to "message/bhttp" <xref target="RFC9292"/>, which may be more suitable for some clients and servers, as all variable length strings are tagged with their length.</t>
        <section anchor="syntax-1">
          <name>Syntax</name>
          <t>Parsing starts by looking for a "Known-Length Message" or an "Indeterminate-Length Message". One or the other is distinguished by the different Framing Indicator.</t>
          <t>The remainder of the message is parsed by reading fields, then the content, by a method depending on if the message is known-length or indeterminate-length. If there are additional parts, they begin immediately after the end of a Content.</t>
          <t>The "Known-Length Field Section", "Known-Length Content", "Indeterminate-Length Field Section", "Indeterminate-Length Content", "Indeterminate-Length Content Chunk", "Field Line" definitions are identical to their definition in message/bhttp. They are used in one or more Known-Length Message and/or Indeterminate-Length Message productions, concatenated together.</t>
          <artwork><![CDATA[
Patch {
  Message (..) ...
}

Known-Length Message {
  Framing Indicator (i) = 8,
  Known-Length Field Section (..),
  Known-Length Content (..),
}

Indeterminate-Length Message  {
  Framing Indicator (i) = 10,
  Indeterminate-Length Field Section (..),
  Indeterminate-Length Content (..),
}

Known-Length Field Section {
  Length (i),
  Field Line (..) ...,
}

Known-Length Content {
  Content Length (i),
  Content (..),
}

Indeterminate-Length Field Section {
  Field Line (..) ...,
  Content Terminator (i) = 0,
}

Indeterminate-Length Content {
  Indeterminate-Length Content Chunk (..) ...,
  Content Terminator (i) = 0,
}

Indeterminate-Length Content Chunk {
  Chunk Length (i) = 1..,
  Chunk (..),
}

Field Line {
  Name Length (i) = 1..,
  Name (..),
  Value Length (i),
  Value (..),
}
]]></artwork>
        </section>
      </section>
      <section anchor="range-units">
        <name>Range units</name>
        <t>Currently, the only defined range unit is "bytes", however this may be other, yet-to-be-defined values.</t>
        <t>In the case of "bytes", the bytes that are read are exactly the same as the bytes that are changed. However, other units may define write semantics different from a read, if symmetric behavior would not make sense. For example, if a Content-Range field adds an item in a JSON array, this write may add a leading or trailing comma, not technically part of the item itself, in order to keep the resulting document well-formed.</t>
        <t>Even though the length in alternate units isn't changed, the byte length might. This might only be acceptable to servers storing these values in a database or memory structure, rather than on a byte-based filesystem.</t>
      </section>
    </section>
    <section anchor="segmented-document-creation-with-patch">
      <name>Segmented document creation with PATCH</name>
      <t>As an alternative to using PUT to create a new resource, the contents of a resource may be uploaded in segments, written across several PATCH requests.</t>
      <t>A user-agent may also use PATCH to recover from an interrupted PUT request, if it was expected to create a new resource. The server will store the data sent to it by the user agent, but will not finalize the upload until the final length of the document is known and received.</t>
      <ol spacing="normal" type="1"><li>The client makes a PUT or PATCH request to a URL, a portion of which is generated by the client, to be unpredictable to other clients. This first request creates the resource, and should include <tt>If-None-Match: *</tt> to verify the target does not exist. If a PUT request, the server reads the Content-Length header and stores the intended final length of the document. If a PATCH request, the "Content-Range" field in the "message/byterange" patch is read for the final length. The final length may also be undefined, and defined in a later request.</li>
        <li>If any request is interrupted, the client may make a HEAD request to determine how much, if any, of the previous response was stored, and resumes uploading from that point. The server will return 200 (OK), but this may only indicate the write has been saved; the server is not obligated to begin acting on the upload until it is complete.</li>
        <li>If the client sees from the HEAD response that additional data remains to be uploaded, it may make a PATCH request to resume uploading. Even if no data was uploaded or the resource was not created, the client should attempt creating the resource with PATCH to mitigate the possibility of another interrupted connection with a server that does not save incomplete transfers. However if in response to PATCH, the server reports 405 (Method Not Allowed), 415 (Unsupported Media Type), or 501 (Not Implemented), then the client must resort to a PUT request.</li>
        <li>The server detects the completion of the final request when the current received data matches the indicated final length. For example, a <tt>Content-Range: 500-599/600</tt> field is a write at the end of the resource. The server processes the upload and returns a response for it.</li>
      </ol>
      <t>For building POST endpoints that support large uploads, clients can first upload the data to a scratch file as described above, and then process by submitting a POST request that links to the scratch file.</t>
      <t>For updating an existing large file, the client can upload to a scratch file, then execute a MOVE (<xref section="9.9" sectionFormat="of" target="RFC4918"/>) over the intended target.</t>
      <section anchor="example">
        <name>Example</name>
        <t>A single PUT request that creates a new resource may be split apart into multiple PATCH requests. Here is an example that uploads a 600-byte document across three 200-byte segments.</t>
        <t>The first PATCH request creates the resource:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 281
If-None-Match: *

Content-Range: bytes 0-199/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This request allocates a 600 byte document, and uploading the first 200 bytes of it. The server responds with 200, indicating that the complete upload was stored.</t>
        <t>Additional requests upload the remainder of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This second request also returns 200 (OK).</t>
        <t>A third request uploads the final portion of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>The server responds with 200 (OK). Since this completely writes out the 600-byte document, the server may also perform final processing, for example, checking that the document is well formed. The server MAY return an error code if there is a syntax or other error, or in an earlier response as soon as it it able to detect an error, however the exact behavior is left undefined.</t>
      </section>
    </section>
    <section anchor="prefer-transaction">
      <name>Preserving Incomplete Uploads with "Prefer: transaction"</name>
      <t>The stateless design of HTTP generally implies that a request is atomic (otherwise parties would need to keep track of the state of a request while it's in progress). A benefit of this design is that a client does not need to be concerned with the side-effects of only the first half of an upload being honored, if there's an error partway through.</t>
      <t>However, some clients may desire partial state changes, particularly when remaking the upload is more expensive than the complexity of recovering from an interruption. In these cases, clients will want an incomplete request to be preserved as much as possible, so they may re-synchronize the state and pick up from where the incomplete request was terminated.</t>
      <t>The client's preference for atomic or upload-preserving behavior may be signaled by a Prefer header:</t>
      <artwork><![CDATA[
Prefer: transaction=atomic
Prefer: transaction=persist
]]></artwork>
      <t>The <tt>transaction=atomic</tt> preference indicates that the request SHOULD apply only when a successful response is returned, and not any time during the upload.</t>
      <t>The <tt>transaction=persist</tt> preference indicates that uploaded data SHOULD be continuously stored as soon as possible, so that if the upload is interrupted, it is possible to resume the upload from where it left off.</t>
      <t>This preference is generally applicable to any HTTP request (and not merely for PATCH or byte range patches). Servers SHOULD indicate when this preference was honored, using a "Preference-Applied" response header. For example:</t>
      <artwork><![CDATA[
Preference-Applied: transaction=persist
]]></artwork>
      <t>Servers may consider broadcasting this in a 103 Early Hints response, since once point the final response is written, this may no longer be useful to know.</t>
    </section>
    <section anchor="registrations">
      <name>Registrations</name>
      <section anchor="messagebyterange">
        <name>message/byterange</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>byterange</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"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>See <xref target="message-byterange"/> of this document</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>HTTP applications that process filesystem-like writes to locations within a resource.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>None.</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IESG</t>
          </dd>
        </dl>
      </section>
      <section anchor="applicationbyteranges">
        <name>application/byteranges</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>byteranges</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"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>See <xref target="message-binary"/> of this document</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>HTTP applications that process filesystem-like writes to locations within a resource.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>None.</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IESG</t>
          </dd>
        </dl>
      </section>
      <section anchor="transaction-preference">
        <name>"transaction" preference</name>
        <dl>
          <dt>Preference:</dt>
          <dd>
            <t>transaction</t>
          </dd>
          <dt>Value:</dt>
          <dd>
            <t>either "atomic" or "persist"</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Specify if the client would prefer incomplete uploads to be saved, or committed only on success.</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="prefer-transaction"/></t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="unallocated-ranges">
        <name>Unallocated ranges</name>
        <t>A byterange patch may permit writes to offsets beyond the end of the resource. This may have non-obvious behavior.</t>
        <t>Servers supporting sparse files MUST NOT return uninitialized memory or storage contents. Uninitialized regions may be initialized prior to executing the write, or this may be left to the filesystem if it can guarantee that unallocated space will be read as a constant value.</t>
        <t>If a server fills in unallocated space by initializing it, servers SHOULD protect against patches that make writes to very large offsets. Servers may account for this by treating it as a write by the client, similar to "Document Size Hints" below.</t>
      </section>
      <section anchor="document-size-hints">
        <name>Document Size Hints</name>
        <t>A byte range patch is, overall, designed to require server resources that's proportional to the patch size. One possible exception to this rule is the complete-length part of the Content-Range field, which hints at the final upload size. Generally, this does not require the server to (immediately) allocate this amount of data. However, some servers may choose to begin preallocating disk space right away, which could be a very expensive operation compared to the actual size of the request.</t>
        <t>In general, servers SHOULD treat the complete-length hint the same as a PUT request of that size, and issue a 400 (Client Error). <cref anchor="_3">413 (Payload Too Large) might not be appropriate for this situation, as it would indicate the patch is too large and the client should break up the patches into smaller chunks, rather than the intended final upload size being too large.</cref></t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <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="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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC4918">
          <front>
            <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
            <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault"/>
            <date month="June" year="2007"/>
            <abstract>
              <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
              <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4918"/>
          <seriesInfo name="DOI" value="10.17487/RFC4918"/>
        </reference>
        <reference anchor="RFC5789">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification. The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
        <reference anchor="RFC9292">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a binary format for representing HTTP messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9292"/>
          <seriesInfo name="DOI" value="10.17487/RFC9292"/>
        </reference>
      </references>
    </references>
    <?line 532?>

<section anchor="discussion">
      <name>Discussion</name>
      <t><cref anchor="_4">This section to be removed before final publication.</cref></t>
      <section anchor="indeterminate-length-uploads">
        <name>Indeterminate Length Uploads</name>
        <t>There is no standard way for a Content-Range header to indicate an unknown or indeterminate-length body starting at a certain offset; the design of partial content messages requires that the sender know the total length before transmission. However it seems it should be possible to generate an indeterminate-length partial content response (e.g. return a continuously growing audio file starting at a 4MB offset). Fixing this would require a new header, update to HTTP, or a revision of HTTP.</t>
      </section>
      <section anchor="sparse-documents">
        <name>Sparse Documents</name>
        <t>This pattern can enable multiple, parallel uploads to a document at the same time. For example, uploading a large log file from multiple devices. However, this document does not define any ways for clients to track the unwritten regions in sparse documents, and the existing conditional request headers are designed to cause conflicts. Parallel uploads may require a byte-level locking scheme or conflict-free operators. This may be addressed in a later document.</t>
      </section>
      <section anchor="recovering-from-interrupted-put">
        <name>Recovering from interrupted PUT</name>
        <t>Servers do not necessarily save the results of an incomplete upload; since most clients prefer atomic writes, many servers will discard an incomplete upload. A mechanism to indicate a preference for atomic vs. non-atomic writes may be defined at a later time.</t>
        <t>Byte range PATCH cannot by itself be used to recover from an interrupted PUT that updates an existing document. If the server operation is atomic, the entire operation will be lost. If the server saves the upload, it may not possible to know how much of the request was received by the server, and what was old content that already existed.</t>
        <t>One technique would be to use a 1xx interim response to indicate a location where the partial upload is being stored. If PUT request is interrupted, the client can make PATCH requests to this temporary, non-atomic location to complete the upload. When the last part is uploaded, the original interrupted PUT request will finish.</t>
      </section>
      <section anchor="splicing-and-binary-diff">
        <name>Splicing and Binary Diff</name>
        <t>Operations more complicated than standard filesystem operations are out of scope for this media type. A feature of byte range patch is an upper limit on the complexity of applying the patch. In contrast, prepending, splicing, replace, or other complicated file operations could potentially require the entire file on disk be rewritten.</t>
        <t>Consider registering a media type for VCDIFF in this document, under the topic of "Media type registrations for byte-level patching".</t>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1d23Ibx3Z9n6/oQA8mXQAIUJRt0seuUCJlMRZFRaTsSrkc
qzHTAMYczCDTMyRhFf0BqUrV+cbzJdm3vgwAUk7ivJw6epAATE9fdu+99rVb
g8EgafKmMEfq+aox6p0uZ0a9Pb568SrJqrTUC3iS1XraDHLTTAfzplnqZT5Y
6iadDybwSo1vDEajxLaTRW5tXpXNaglvnZ1evUxS3ZhZVa+OlG2yJF/WR6qp
W9vsj0aHo/3ktqqvZ3XVLo9U73mbF1leztTzokqvrZpWtXp1dfVWHb89s73k
2qygdXaUKDVQZyUMXJpmcIJTo5+waWIbXWa/6KIqYQIrY5NlfqR+aqq0r2xV
N7WZWvi0WuCHn5NEt828qqHLAXShVF7aI3U8VD/W+Wze0E9MgGOYcV7Gv5uF
zosjpbX+58lv07shzCVJyqpe6Ca/MTjJdy9f7I/Hh0fqe7NSOHNeUWsNjINP
LTc6HI9HR7zQS+i1bPI0PNnnJ3vj4ThJ8nK6PsDo4Aug3HlbNPmyrZcVdO5I
o85hhur0rjEl7olVO+dn56e76q2uG3V1Wx2pc5PlWl3BZgF5qb+Dw/FX0B9N
JnoT5/2jmaiT3DZ1PmkbkwFJkHS4XUBx9YOpsSl+3YGWJ8c/7EqXz778CmjQ
I46CEeGlzO+sNDncP9zH/c9LXa/UO7OsjTVlAwutSlVNmTbnxlo9w5nCn8Fg
oPQEJqNTIPvVPLcKmLVdwFvKLk2aT3NjlVYLWiGyI43Jk1jqVVFp2I5mrhtV
3Zj6ts4bai/vpgoZWxFn91VTKV0U1S1+z6qF0mkKc1H8Ul9Bv/xYK5h31dap
wVcmRrVLHAdoBfttDYyjC/h3hrO0Q7eMRZ5lhUmSJ7hxdZW1KS47SV7mhbEr
25gFvA47OtUwKi4lT2G4lVrW1U2eGWDrhVG3eoVj0pQULCpaCfBEToSESWg1
hV6Bv+fwD5PVtsslCIaFuWsSvrByIP3UGnjUWnzQzB06zKGpqdXOx4+Xhmar
xge4T8LM9/e7QDTck8ak8zL/j9aoVJdl1aiZKZEKMH0kj2XSvH1/1YfvqUbR
wFGsqYFYagGLymcgU/zrC8AVoNygM4dbWom5M2nbuEkSFfoK+8OfMt1olVZ1
3S5xrkP1qrrFzYAxV7I0ZBRiTGTliGeIQeIZAQyotoSBCWf6wgO03Z5swBl5
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
AA==

-->

</rfc>
