<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.7 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpapi-patch-byterange-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-patch-byterange-01"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2024" month="March" day="19"/>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>HTTP</keyword>
    <abstract>
      <?line 34?>

<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 40?>

<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="RFC8941"/> and <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>
          <t>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).</t>
        </li>
        <li>
          <t>A part body: the actual data to write to the specified location.</t>
        </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>The unsatisfied-range form (e.g. <tt>bytes */1000</tt>) sets the size of the document, but without writing any data. It may be used to truncate a document (to represent inverse of an append operation), or to allocate space for a document without specifying any of its contents.</t>
        <t>If the "last-pos" is is unknown because the upload is indeterminate length (the Content-Length of the request is not known from the start, or the upload might continue indefinitely), then the Content-Offset field must be used instead.</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-offset-field">
        <name>The Content-Offset field</name>
        <t>The Content-Range field specifies an offset to write the content at, when the end of the write is not known. It is used instead of Content-Range when the Content-Length is not known.</t>
        <t>Its syntax is specified as a Structured Field <xref target="RFC8941"/>:</t>
        <sourcecode type="abnf"><![CDATA[
Content-Offset = sf-item
]]></sourcecode>
        <t>The value indicates how much of the target document is to be skipped over, typically the number of bytes. It MUST be an sf-integer.</t>
        <t>It accepts two parameters:</t>
        <t>The "unit" parameter indicates the unit associated with the value. A missing "unit" parameter is equivelant to providing <tt>unit=bytes</tt>.</t>
        <t>The "complete-length" parameter is equivelant to the complete-length value in Content-Range. When provided, it MUST be an sf-integer specifying the intended final length of the document. When missing, the complete-length is unknown.</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 it is a message-level header 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 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 as it would recover from a network interruption.</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 expect all the changes to be recorded as a single operation, or that if there's an interruption, all of the parts from the request 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="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). Clients need not need 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 recovering from an interruption. In these cases, clients will want an incomplete upload 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 before the end of 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 signaling this in a 103 Early Hints response, since once the final response is written, this may no longer be useful information.</t>
    </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>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </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="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="content-offset">
        <name>Content-Offset</name>
        <dl>
          <dt>Field name:</dt>
          <dd>
            <t>Content-Offset</t>
          </dd>
        </dl>
        <t>Status: permanent</t>
        <dl>
          <dt>Specification document:</dt>
          <dd>
            <t>This document.</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 anchor="sec-normative-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="RFC8941">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </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 anchor="sec-informative-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 556?>

<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:
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

-->

</rfc>
