<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpapi-patch-byterange-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-patch-byterange-03"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <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 mechanisms to write at a specific position in a file. While HTTP supports reading byte ranges using the Range header (<xref section="14" sectionFormat="of" target="RFC9110"/>), this technique cannot generally be used with PUT, as the server may ignore the Content-Range header, potentially causing data corruption. By using the PATCH method with a media type that the server understands, writing to byte ranges with Content-Range semantics becomes possible, even when server support is uncertain.</t>
      <t>This media type is intended for use in a wide variety of applications including idempotently writing 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><strong>Part fields</strong>: 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><strong>A part body</strong>: 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="example"><![CDATA[
Content-Range: bytes 2-5/12

wxyz
]]></sourcecode>
      <t>This patch instructs the server to write the four bytes "wxyz" at an offset of 2 bytes. Given a document containing the digits 0-9 terminated by a CRLF, the result after applying the patch would be:</t>
      <artwork><![CDATA[
01wxyz6789␍␊
]]></artwork>
      <t>Although this example is a text document, part bodies are as binary data, and may 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 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 provided in Content-Range.</t>
      </section>
      <section anchor="the-content-offset-field">
        <name>The Content-Offset Field</name>
        <t>The Content-Offset 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 equivalent to providing <tt>unit=bytes</tt>.</t>
        <t>The "complete-length" parameter is equivalent 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 equivalent 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 reading the 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 persist 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. A <tt>Content-Length</tt> response header indicates what the size of an equivalent GET request would have been. Since this will be content uploaded in the interrupted attempt, this is the offset where the next request can resume uploading from.</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>This example shows how to upload a 600-byte document over multiple requests with PATCH, 200 bytes at a time.</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 anchor="sec-combined-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 556?>

<section anchor="discussion">
      <name>Discussion</name>
      <t><cref anchor="_4">This section to be removed before final publication.</cref></t>
      <section anchor="sparse-and-noncontiguous-resources">
        <name>Sparse and Noncontiguous Resources</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:
H4sIAAAAAAAAA+1d3XIbN5a+51NgmYtILpIWZTmxlMnUyrYca8eyvZacqa1U
NgLZINVRs5vTaEpiXJ4H2KqtmmecJ9nzC6CblJLdmb2Zmlw4EtkNHADn/3wH
Gg6HvSZvCndknq8bZz7Ycu7M++OLF697WTUt7QK+yWo7a4a5a2bDq6ZZ2mU+
XNpmejWcwCs1vjHce9Lzq8ki9z6vyma9hLdOTy5e9aa2cfOqXh8Z32S9fFkf
maZe+WZ/b+9wb793W9XX87paLY9M//kqL7K8nJvnRTW99mZW1eb1xcV7c/z+
1Pd7124NT2dHPWOG5rSEiUvXDF8iafQRPtrzjS2zn2xRlUDA2vneMj8yPzTV
dGB8VTe1m3n4ab3AH37s9eyquapqGHIIQxiTl/7IHI/MH+t8ftXQR7wBx0Bx
Xqafu4XNiyNjrf3XyS+zuxHQ0uuVVb2wTX7jkMgPr17sj8eHsLA/uLVB0nlJ
K+9gIvwaFkWPHY7He/AYrfUcBi6bfKrfPTs8GMN357Bp02ZVu8y8yl2Rme9t
sXJxj+JI+zLS4/Fo3O/18nLWJWrv4Ct45mxVNPlyVS8roEe305zBqszJXeNK
PEdvds5Oz052zXtbN+bitjoyZy7LrbmAA1YKDw7Hz5T65E2k7I9uYl7mvqnz
yaoB0o9pu/GI4ZTM967GR/HXHXjy5fH3uzLk06+f4b4RF8KM8FLWXemz/cOv
4ZHjklnkvLHNypsXVeboydMyy4H1cOzXedmEnd4/xP15npe2XpsPblk770p4
F+gw1YzHOnPe2zmuD/4bDofGTmAJdgoHfHGVewNisVrAW8Yv3TSf5XAM1ixo
X5DxaX4mfWnXRWXh3Jsr25jqxtW3dd7Q8/Lu1KAIGZKhgZnZaV7kDdMNn2XV
wtjpFOgx+iLsm3dznB72c7Xk4YFyWEi1quHRkVK9yLOscL3eF3i6dZUB/8Aq
e71XeeH82jduAWwIxw6TwsBAOWxYUazNsq5uctjGhZte2TL3C/iy4vkNrCIh
HVgnp50DdrZmBuOC6FzB/3gf/Wq5BJnzQJsluY5L9SAF+ElzpRrnCp5xtdn5
9OncEaFmfIDrEvH4/Hl3AE/D7jdAVpn/aeXM1JZl1Zi5K0EHIeUTh8KVmdu8
uTLvP14MjPU0hXc17L1Z2LXJ5yCkjj59AYoK9nGYEjCAReGHOQ04tUxmZhtr
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

-->

</rfc>
