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

<t>This document specifies a media type for PATCH payloads that overwrites a specific byte range, facilitating random access writes and segmented uploads of resources.</t>
    </abstract>
  </front>
  <middle>
    <?line 41?>

<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>Sending a Content-Range field in a PUT request (A "partial PUT", <xref section="14.5" sectionFormat="comma" target="RFC9110"/>) requires server support to be processed correctly. Without such support, the server's normal behavior would be to ignore the header, replacing the entire resource with just the part that changed, potentially causing corruption. To mitigate this, Content-Range may be used in conjunction with the PATCH method <xref target="RFC5789"/> and 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" and "application/byteranges" media types, to opportunistically carry this field.</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 on a line, 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, part bodies are only interperted as binary data, and can potentially overwrite individual bytes 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 the "12" in <tt>bytes 0-11/12</tt>. The complete-length does not affect the write by itself, however the server MAY use it for other purposes, especially for preallocating disk space, or 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 take 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 invert an append operation), to allocate space for a document without specifying any of its contents, or to signal that an upload has ended when the previous part or request did not specify a complete-length. The part body MUST be empty.</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. A missing "complete-length" is equivelant to providing <tt>*</tt> in Content-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 resource creation.</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 body. For example, the "Content-Type" or "Content-Location" fields.</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="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="byterange-media-types">
      <name>Byterange Media Types</name>
      <section anchor="the-multipartbyteranges-media-type">
        <name>The multipart/byteranges media type</name>
        <t>The following illustrates 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). Content-Range MUST NOT be used in place of Content-Length for this purpose.</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 will be rolled back together. However, the exact behavior is at the discretion of the server.</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 that only needs to be parsed to the first empty line.</t>
        <t>The "message/byterange" form may be used in a PATCH 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, starting at a 100-byte offset, overwriting 200 bytes of it.</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>
    <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 error halfway through an upload.</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 prefer the incomplete upload to be preserved as much as possible, so they may resume 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 commit 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 committed, 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 might consider signaling this in a 103 (Early Hints) response <xref target="RFC8297"/>, 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 complete 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 randomized, to be unpredictable to other clients. This first request creates the resource, and should include <tt>Prefer: transaction=persist</tt> (to continuously commit the upload) and <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 complete length of the document. If a PATCH request, the "Content-Range" field in the "message/byterange" patch is read for the complete length. The complete 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 retrying the PUT request.</t>
        </li>
        <li>
          <t>The server detects the completion of the final request when the current received data matches the indicated complete 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>If the client does not know the complete length of its upload (for example, an upload of live audio), it may use the indeterminate length form "*" to append data to the document. The end of the upload is then signaled with an "unsatisfied-range" form (e.g. <tt>Content-Range: */1000</tt>), which instructs the server that the upload is complete if it has received all 1000 bytes.</t>
      <t>For building POST endpoints that support large uploads, clients can first upload the data to a scratch file as described above, and then submit a link to the file in a POST request.</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="complete-length-example">
        <name>Complete Length 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="uninitialized-ranges">
        <name>Uninitialized 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>
      </section>
      <section anchor="initializing-large-documents">
        <name>Initializing large documents</name>
        <t>A byte range patch typically only requires server resources proportional to the patch size. One exception is pre-initializing space when growing a file. This occurs when a complete-length is specified in the Content-Range field, which hints at the final upload size, or when writing to an offset far after the end of the file, and the server initializes the space in between. This initialization could be a very expensive operation compared to the actual size of the patch.</t>
        <t>In general, servers SHOULD treat an initialization towards resource limits, and issue a 400 (Client Error) as appropriate. Note that 413 (Payload Too Large) would be misleading in this situation, as it would indicate the patch itself is too large, and the client should break up the patches into smaller chunks, rather than the intended signal that the final upload size isd too large.</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="RFC8297">
          <front>
            <title>An HTTP Status Code for Indicating Hints</title>
            <author fullname="K. Oku" initials="K." surname="Oku"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>This memo introduces an informational HTTP status code that can be used to convey hints that help a client make preparations for processing the final response.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8297"/>
          <seriesInfo name="DOI" value="10.17487/RFC8297"/>
        </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 557?>

<section anchor="discussion">
      <name>Discussion</name>
      <t><cref anchor="_4">This section to be removed before final publication.</cref></t>
      <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 provide recovery from an interrupted PUT to an existing document, as it is not generally possible to distinguish what was received by the server from what 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>
        <t>Another technique would be to send a 1xx interim response to indicate how much of the upload has been committed. When a client receives this, it can skip that many bytes from the next attempt in a PATCH request.</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 anchor="ending-indeterminate-length-uploads">
        <name>Ending Indeterminate Length Uploads</name>
        <t>When uploading a patch with indeterminate-length form, Since the server doesn't know the complete-length, it might not be able to assume that the end of the request is also the end of the whole document, even if the request ended cleanly (the client may have reasons to split apart the upload). This needs to be signaled by a subsequent request with an unsatisfied-range specifying the final length of the document.</t>
      </section>
      <section anchor="reading-content-range-and-content-offset-in-the-headers">
        <name>Reading Content-Range and Content-Offset in the headers</name>
        <t>Some parties may prefer that the message body need not be parsed at all, but instead leverage existing HTTP mechanisms to carry the part field data. Similar to how a 206 status code indicates that the response body is partial, a reserved value of Content-Type (in a PATCH request) could signal the server to read the Content-Range from the request headers, and the whole request body is the part body.</t>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
HdcwOJLMjvq1LtSTgHqzk/8BjdbxxOltAAA=

-->

</rfc>
