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

<t>This document specifies a media type for PATCH to overwrite a specific byte range, allowing random access writes, or splitting an upload into multiple 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 be used opportunistically in PUT, because the server may ignore the Content-Range header, 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>) represents an instruction to set the size of the target document. A header of the form <tt>bytes */0</tt> truncates the target document to zero bytes.</t>
        <t>Servers do not have to support every type of value; servers MAY reject unsupported forms with a 400 error. For example, they may reject an unsatisfied-range part that grows the size of the target, or they may even decline to support truncation at all.</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, use the complete-length component of the Content-Range field.)</t>
        <t>If provided, it MUST exactly match the length of the range specified in the Content-Range field. 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 bytes 200-299 of a resource where bytes 0-99 are defined; this would leave bytes 100-199 undefined. Servers that accept sparse writes MUST NOT disclose uninitialized 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 parsing for 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; note that 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 "PUT / HTTP/1.1".</t>
          <t>It follows the syntax of HTTP message headers and body. It MUST include the Content-Range field. If the part body length is known by the sender, it SHOULD contain the Content-Length field. Unknown or nonapplicable 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 reading the Framing Indicator.</t>
          <t>The remainder of the message is parsed by reading part fields, then the part content, 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 field 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 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) if it is too large. (413 (Payload Too Large) would not be appropriate for this situation, as it would indicate the patch is too large and the client should try multiple smaller requests, rather than indicating the final upload size is too large.)</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 530?>

<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 field 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 field, update to HTTP, or a revision of HTTP.</t>
        <t>Support in responses could be achieved with a header (or Preference) stating that the client supports indeterminate length Partial Content responses.</t>
        <t>See also https://www.ietf.org/rfc/rfc8673.html which uses a very large value for the complete-length as a substitute for an indeterminate length range response.</t>
      </section>
      <section anchor="compatibility-with-206-partial-content-responses">
        <name>Compatibility with 206 (Partial Content) Responses</name>
        <t>The binary format <xref target="message-binary"/> is designed to be compatible as a binary version of multipart 206 (Partial Content) response. Servers could detect client support by use of a header (perhaps by listing the media type in an "Accept-Multipart-Range" header), and clients would detect the multipart response by observing the 206 status code, but lack of any Content-Range header in the response.</t>
        <t>The binary format itself is designed to maximize compatibility with message/bhttp, with the 4th (8-valued) bit of the Framing Indicator selected to mean "start-line omitted". However this also indicates other changes, including lack of trailers, and that another message may follow after.</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. The "transaction" preference is intended as a way for a client to indicate it prefers partial writes that won't be lost in the event of an interruption.</t>
        <t>While partial writes may work for uploading new resources, this cannot by itself be used to recover from an interrupted PUT that's overwriting an existing document, since it is difficult to know how much of the request was received by the server, versus 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 target resource will be in the same state as if it had finished without interruption.</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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
pc9rAAA=

-->

</rfc>
