<?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.34 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wright-http-patch-byterange-03" category="exp" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.2 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-wright-http-patch-byterange-03"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2023" month="June" day="06"/>
    <workgroup>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 messages 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

wxyz
]]></sourcecode>
      <t>This patch represents an instruction to write the four bytes "wxyz" 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[
01wxyz6789␍␊
]]></artwork>
      <t>Although this example is an ASCII document, patches are carried as binary data, and can carry, or partially overwrite, 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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood">
              <organization/>
            </author>
            <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="truncation">
        <name>Truncation</name>
        <t>One currently unspecified operation that could be useful is the ability to resize the document without specifying any content for it. Especially truncating the document to zero bytes, or some other length. The unsatisfied-range form could potentially be used this:</t>
        <sourcecode type="example"><![CDATA[
PATCH /logs.txt HTTP/1.1
Content-Type: message/byterange
Content-Length: 28
If-Match: "foo"

Content-Range: bytes */0

]]></sourcecode>
      </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:
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

-->

</rfc>
