<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.21 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wright-http-patch-byterange-01" category="exp" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-wright-http-patch-byterange-01"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2023" month="January" day="23"/>
    <workgroup>HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>HTTP</keyword>
    <abstract>
      <t>This document specifies a media type for PATCH payloads that overwrites a specific byte range, to allow random access writes, or allow a resource to be uploaded in several segments.</t>
    </abstract>
  </front>
  <middle>
    <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.</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>
      <t>It is particularly designed to recover from interrupted uploads. Since HTTP is stateless, clients can recover from an interrupted connection by making a request that completes the partial state change. For downloads, the Range header allows a client to download only the unknown data. However, if an upload is interrupted, no mechanism exists to upload only the remaining data; the entire request must be retried.</t>
      <t>Byte range patches may be used to "fill in these gaps."</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>This document uses ABNF as defined in <xref target="RFC5234"/> and imports grammar rules from <xref target="RFC9112"/>.</t>
        <t>For brevity, example HTTP 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 15".</t>
      </section>
    </section>
    <section anchor="modifying-a-content-range-with-patch">
      <name>Modifying a content range with PATCH</name>
      <t>Although the Content-Range field cannot be used in the request headers without risking data corruption, it may be used in conjunction with the PATCH method <xref target="RFC5789"/> as part of a media type whose semantics writes a subset of a document, at a particular byte offset. This document re-uses the "multipart/byteranges" media type, and defines the "message/byterange" media type, for this purpose.</t>
      <t>A byte range patch lists one or more <em>parts</em>. Each part specifies two essential components:</t>
      <ol spacing="normal" type="1"><li>Part fields: a list of HTTP fields that specify metadata, including the range being written to, the length of the body, and information about the target document that cannot be listed in the PATCH headers, e.g. Content-Type (where it would describe the patch itself, rather than the document being updated).</li>
        <li>A part body: the actual data to write to the indicated location.</li>
      </ol>
      <t>Each part MUST indicate a single contiguous range to be written to. Servers MUST reject byte range patches that don't contain a known range with a 422 or 400 error. (This would mean the client may be using a yet-undefined mechanism to specify the target range.)</t>
      <t>The Content-Range field is used to specify the range to write to for each part:</t>
      <t>The unsatisfied-range form (e.g. <tt>bytes */1000</tt>) is not meaningful, it MUST be treated as a syntax error.</t>
      <t>The client MAY indicate the anticipated final size of the document by providing the complete-length form, for example <tt>bytes 0-11/12</tt>. This value does not affect the success of the write, however the server MAY use it for other purposes, especially for preallocating an optimal amount of space, and deciding when an upload in multiple parts has finished.</t>
      <t>If the client does not know or care about the final length of the document, it MAY use <tt>*</tt> in place of complete-length. For example, <tt>bytes 0-11/*</tt>. Most random access writes will follow this form.</t>
      <t>Other "Content-" fields in the patch document have the same meaning as if used in PUT request with the complete document (patch applied).</t>
      <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 contents of existing storage.</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 expecting the longer length. This may involve rolling back the entire request, or saving as many bytes as possible. The client can then recover the same way it would recover from a network error.</t>
      <section anchor="the-multipartbyteranges-media-type">
        <name>The multipart/byteranges media type</name>
        <t>The following is a request with a "multipart/byteranges" body to write two ranges in a document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
Content-Length: 206
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

--THIS_STRING_SEPARATES
Content-Range: bytes 2-6/25
Content-Type: text/plain

23456
--THIS_STRING_SEPARATES
Content-Range: bytes 17-21/25
Content-Type: text/plain

78901
--THIS_STRING_SEPARATES--
]]></sourcecode>
        <t>The syntax for multipart messages is defined in <xref section="5.1.1" sectionFormat="comma" target="RFC2046"/>. While the body cannot contain the boundary, servers MAY use the Content-Length field to skip to the boundary (potentially ignoring a boundary in the body, which would be an error by the client).</t>
        <t>The body of each range MUST be exactly as long as indicated by the Content-Range, unless indicated otherwise by a Content-Length header.</t>
        <t>The multipart/byteranges type may be used for operations where multiple regions must be updated at the same time; clients may have an expectation that if there's an interruption, all of the parts will be rolled back.</t>
      </section>
      <section anchor="the-messagebyterange-media-type">
        <name>The message/byterange media type</name>
        <t>When making a request with a single byte range, there is no need for a multipart boundary marker. This document defines a new media type "message/byterange" with the same semantics as a single byte range in a multipart/byteranges message, but with a simplified syntax.</t>
        <t>The "message/byterange" form may be used in a request as so:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 272
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Content-Range: bytes 100-299/600
Content-Type: text/plain

[200 bytes...]
]]></sourcecode>
        <t>This represents a request to modify a 600-byte document, overwriting 200 bytes of it, starting at a 100-byte offset.</t>
        <t>The syntax is defined in <xref target="messagebyterange-media-type"/>.</t>
      </section>
      <section anchor="the-messagebyterangebhttp-media-type">
        <name>The message/byterange+bhttp media type</name>
        <t>The "message/byterange+bhttp" has the same semantics as "message/byterange" but follows a binary format similar "message/bhttp" <xref target="RFC9292"/>, and may be more suitable for some clients and servers, as all variable length strings are tagged with their length.</t>
      </section>
      <section anchor="appending">
        <name>Appending</name>
        <t>An append is when the range being replaced starts inside or at the end of the target document, but extends beyond the end, increasing the document length. For example, writing to bytes 10-19 of a 15 byte document, resulting in a 20 byte document.</t>
        <t>Aside from the fact the document size increases, it may be handled the same as an overwrite (below).</t>
      </section>
      <section anchor="splicing">
        <name>Splicing</name>
        <t>A splice is when the range being replaced is a different length than the replacement, shifting the position of the bytes that come after. For example, deleting bytes 0-9 in a 20 byte document, resulting in a 10 byte document. Or prepending 10 bytes to a 20 byte document, resulting in a 30 byte document.</t>
        <t>This can be an expensive operation that servers are not expected to support. Servers that do not support splicing will emit an error to clients as they attempt to process the request as an overwrite operation (see below).</t>
        <t>As a special case, the "Content-Range" field may omit the "-" and last-pos to indicate insertion that does not overwrite any bytes:</t>
        <sourcecode type="abnf"><![CDATA[
Content-Range =/ range-unit SP first-pos "/" ( complete-length / "*" )
]]></sourcecode>
        <t>Splicing operations MUST include a Content-Length field, to indicate the expected length of the part body.</t>
        <t>Clients intending to perform a splice MUST include a Content-Length field, so a server can compute if a patch will be a splice or not before.</t>
        <t><cref anchor="_1">This whole section may need to be removed, and re-introduced using a new field, maybe called "Content-Range-Target" since "Content-Range" was never intended to do anything resembling splicing.</cref></t>
      </section>
      <section anchor="overwriting">
        <name>Overwriting</name>
        <t>An overwrite only changes existing bytes, and so does not change the length of the document.</t>
        <t>Overwriting operations MAY include a Content-Length field. If provided in overwriting operations, it MUST exactly match the length of the range specified in the Content-Range field. Servers that do not support splicing MUST error when the Content-Length mismatches the length of the range.</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. Units that change the overall length of the document might always be classified as "splice" operations.</t>
      </section>
    </section>
    <section anchor="segmented-document-creation-with-patch">
      <name>Segmented document creation with PATCH</name>
      <t>As an alternative to using PUT to create a new resource, the contents of a resource may be uploaded in segments, written across several PATCH requests.</t>
      <t>A user-agent may also use PATCH to recover from an interrupted PUT request, if it was expected to create a new resource. The server will store the data sent to it by the user agent, but will not finalize the upload until the final length of the document is known and received.</t>
      <ol spacing="normal" type="1"><li>The client makes a PUT or PATCH request to a URL, a portion of which is generated by the client, to be unpredictable to other clients. This first request creates the resource, and should include <tt>If-None-Match: *</tt> to verify the target does not exist. If a PUT request, the server reads the Content-Length header and stores the intended final length of the document. If a PATCH request, the "Content-Range" field in the "message/byterange" patch is read for the final length. The final length may also be undefined, and defined in a later request.</li>
        <li>If any request is interrupted, the client may make a HEAD request to determine how much, if any, of the previous response was stored, and resumes uploading from that point. The server will return 200 (OK), but this may only indicate the write has been saved; the server is not obligated to begin acting on the upload until it is complete.</li>
        <li>If the client sees from the HEAD response that additional data remains to be uploaded, it may make a PATCH request to resume uploading. Even if no data was uploaded or the resource was not created, the client should attempt creating the resource with PATCH to mitigate the possibility of another interrupted connection with a server that does not save incomplete transfers. However if in response to PATCH, the server reports 405 (Method Not Allowed), 415 (Unsupported Media Type), or 501 (Not Implemented), then the client must resort to a PUT request.</li>
        <li>The server detects the completion of the final request when the current received data matches the indicated final length. For example, a <tt>Content-Range: 500-599/600</tt> field is a write at the end of the resource. The server processes the upload and returns a response for it.</li>
      </ol>
      <t>For building POST endpoints that support large uploads, clients can first upload the data to a scratch file as described above, and then process by submitting a POST request that links to the scratch file.</t>
      <t>For updating an existing large file, the client can upload to a scratch file, then execute a MOVE (<xref section="9.9" sectionFormat="of" target="RFC4918"/>) over the intended target.</t>
      <section anchor="example">
        <name>Example</name>
        <t>A single PUT request that creates a new resource may be split apart into multiple PATCH requests. Here is an example that uploads a 600-byte document across three 200-byte segments.</t>
        <t>The first PATCH request creates the resource:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 281
If-None-Match: *

Content-Range: bytes 0-199/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This request allocates a 600 byte document, and uploading the first 200 bytes of it. The server responds with 200, indicating that the complete upload was stored.</t>
        <t>Additional requests upload the remainder of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This second request also returns 200 (OK).</t>
        <t>A third request uploads the final portion of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>The server responds with 200 (OK). Since this completely writes out the 600-byte document, the server may also perform final processing, for example, checking that the document is well formed. The server MAY return an error code if there is a syntax or other error, or in an earlier response as soon as it it able to detect an error, however the exact behavior is left undefined.</t>
      </section>
    </section>
    <section anchor="registrations">
      <name>Registrations</name>
      <section anchor="messagebyterange-media-type">
        <name>message/byterange media type</name>
        <t>The "message/byterange" media type patches the defined byte range to some specified contents.  It is similar to the "multipart/byteranges" media type, except it omits the multipart separator, and so only allows a single range to be specified.</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 anchor="messagebyterangebhttp-media-type">
        <name>message/byterange+bhttp media type</name>
        <t>The "message/byterange+bhttp" media type patches the defined byte range to some specified contents.  It has the same semantics as "message/byterange", but follows a syntax closely resembling "message/bhttp" <xref target="RFC9292"/></t>
        <artwork><![CDATA[
Request {
  Framing Indicator (i) = 8,
  Known-Length Field Section (..),
  Known-Length Content (..),
  Padding (..),
}

Known-Length Field Section {
  Length (i),
  Field Line (..) ...,
}

Known-Length Content {
  Content Length (i),
  Content (..),
}

Field Line {
  Name Length (i) = 1..,
  Name (..),
  Value Length (i),
  Value (..),
}
]]></artwork>
      </section>
    </section>
    <section anchor="caveats">
      <name>Caveats</name>
      <t><cref anchor="_2">This section may be removed before final publication.</cref></t>
      <section anchor="indeterminate-length-uploads">
        <name>Indeterminate Length Uploads</name>
        <t>There is no standard way for a Content-Range header to indicate an unknown or indeterminate-length body starting at a certain offset; the design of partial content messages requires that the sender know the total length before transmission. However it seems it should be possible to generate an indeterminate-length partial content response (e.g. return a continuously growing audio file starting at a 4MB offset). Fixing this would require a new header, update to HTTP, or a revision of HTTP.</t>
        <t>Ideally, this would look something like:</t>
        <sourcecode type="abnf"><![CDATA[
Content-Range =/ range-unit SP first-pos "-*/" ( complete-length / "*" )
]]></sourcecode>
        <t>For example: "<tt>Content-Range: bytes 200-*/*</tt>" would indicate overwriting or appending content, starting at a 200 byte offset.</t>
        <t>And "<tt>Content-Range: bytes 200-*/4000</tt>" would indicate overwriting an unknown amount of content, but not past 4000 bytes, starting at a 200 byte offset.</t>
        <t>Note these are different than "<tt>Content-Range: bytes 200/*</tt>" which would indicate splicing in content at a 200 byte offset.</t>
      </section>
      <section anchor="sparse-documents">
        <name>Sparse Documents</name>
        <t>This pattern can enable multiple, parallel uploads to a document at the same time. For example, uploading a large log file from multiple devices. However, this document does not define any ways for clients to track the unwritten regions in sparse documents, and the existing conditional request headers are designed to cause conflicts. Parallel uploads may requires a byte-level locking scheme or conflict-free operators. This may be addressed in a later document.</t>
      </section>
      <section anchor="recovering-from-interrupted-put">
        <name>Recovering from interrupted PUT</name>
        <t>Servers do not necessarily save the results of an incomplete upload; since most clients prefer atomic writes, many servers will discard an incomplete upload. A mechanism to indicate a preference for atomic vs. non-atomic writes may be defined at a later time.</t>
        <t>Byte range PATCH cannot by itself be used to recover from an interrupted PUT that updates an existing document. If the server operation is atomic, the entire operation will be lost. If the server saves the upload, it may not possible to know how much of the request was received by the server, and what was old content that already existed.</t>
        <t>One technique would be to use a 1xx interim response to indicate a location where the partial upload is being stored. If PUT request is interrupted, the client can make PATCH requests to this temporary, non-atomic location to complete the upload. When the last part is uploaded, the original interrupted PUT request will appear.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="unallocated-ranges">
        <name>Unallocated ranges</name>
        <t>The byterange media type technically permits writes to offsets beyond the bound of the file. This may have behavior not be predictable by the user.</t>
        <t>Servers will normally only allow patch ranges to start inside or at the immediate end of the representation. Servers supporting sparse files MUST NOT return uninitialized memory or storage contents. Uninitialized regions may be initialized prior to executing the sparse write, or this may be left to the filesystem if it can guarantee this behavior.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns. </t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC4918">
          <front>
            <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
            <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault">
              <organization/>
            </author>
            <date month="June" year="2007"/>
            <abstract>
              <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
              <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4918"/>
          <seriesInfo name="DOI" value="10.17487/RFC4918"/>
        </reference>
        <reference anchor="RFC5789">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification.  The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
        <reference anchor="RFC9292">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson">
              <organization/>
            </author>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood">
              <organization/>
            </author>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a binary format for representing HTTP messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9292"/>
          <seriesInfo name="DOI" value="10.17487/RFC9292"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIADjyzmMAA91cW1cbx5Z+16+oUR4OeCQhYXACXmetwTY+ZmIMY3CyZmVl
Qqm7JHVodWu6ugHFy/nts2916ZbAyUzOy+TBAdRdtWtfv30pDYfDXp3VuTlW
r9a1UR91MTfq8uT69bteWiaFXsInaaVn9fC+yuaLerio69VwpetkMZzCGxW+
MBxPeraZLjNrs7Ko1yt4KStSszLwT1H3El2beVmtj5V5WPWyVXWs6qqx9f54
fDTe792X1e28KpvVsXp3fX2pTi7PbO/WrOHv6XFPqaE6K2CnwtTDN0gK/Qmf
7NlaF+kvOi8L2HFtbG+VHauf6jIZKFtWdWVmFn5aL/GHn3s93dSLsoIlh7CE
AhLtsToZqR/pZPQnPvAJ0JYV8d/NUmf5sdJa/9v0t9nDCGjp9YqyWuo6uzNI
5Me3r/cnk6Nj9b1ZK6TcqllZqcYa2Ac/tfzQ0WQylnNewapFnSXhk33+ZG8y
mvR6WTHrbjA+eHGs+udNXmerplqVsLhjjToHCtXpQ20KFIJVO+dn56e76lJX
tbq+L4/VuUkzra5BOrbP6x0cTb6D9YiY6E2k+0czVW8yW1fZtKlNCixB1mXF
XAHH1Q+mwkfx1x148s3JD7uy5OG33wEP+qRBsCO8lNJ6uIc8crR/BOfsv8oK
Xa3VR7OqjAUtgYOWhSpnzJtzY62eI6Xw33A4VHoKxOgE2H69yKwC5WyW8Jay
K5Nks8xYpdWSToj6R3syESu9zksN4qgXulblnalAk2t6Xt5NFGqyIlUeqLpU
Os/Le/w9LZdKJwnQovilgYJ1+WOtgO6yqRKDr0yNala4D/AK5G0N7KNz+P8c
qbQjd4xllqa56fW+QcFVZdokeOxe722WG7u2tVnC6yDRmYZd8ShZAtut1aoq
77LUgFovjbrXa9yTSFJwqOgkoBMZMRKI0GoGq4J+L+B/zFbbrFZgGBZo1ymK
L5wcWD+zBj5qLH5QL5w3WMCjplI7nz9fGaJWTQ5QTqLMX77sAtNQJrVJFkX2
341RiS6KslZzUyAXgHxkj2XWXH66HsDviUbTwF2sqYBZagmHyuZgU/zX1+BI
gHPDFg33dBLzYJKmdkQSFwYK18M/pbrWKimrqlkhrSP1rrxHYcCeazkaKgop
JqpypDOkIDFF4AZUAy6sIj8zEB0gcXu2gWZk9aJDrnWWjQcFiVmUi82mIA3R
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
0nF/JF9ihTdEev8DMLlrIztOAAA=

-->

</rfc>
