diff options
Diffstat (limited to 'doc/rfc/rfc7233.txt')
-rw-r--r-- | doc/rfc/rfc7233.txt | 1403 |
1 files changed, 1403 insertions, 0 deletions
diff --git a/doc/rfc/rfc7233.txt b/doc/rfc/rfc7233.txt new file mode 100644 index 0000000..af212e7 --- /dev/null +++ b/doc/rfc/rfc7233.txt @@ -0,0 +1,1403 @@ + + + + + + +Internet Engineering Task Force (IETF) R. Fielding, Ed. +Request for Comments: 7233 Adobe +Obsoletes: 2616 Y. Lafon, Ed. +Category: Standards Track W3C +ISSN: 2070-1721 J. Reschke, Ed. + greenbytes + June 2014 + + + Hypertext Transfer Protocol (HTTP/1.1): Range Requests + +Abstract + + The Hypertext Transfer Protocol (HTTP) is a stateless application- + level protocol for distributed, collaborative, hypertext information + systems. This document defines range requests and the rules for + constructing and combining responses to those requests. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc7233. + + + + + + + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 1] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +Copyright Notice + + Copyright (c) 2014 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + This document may contain material from IETF Documents or IETF + Contributions published or made publicly available before November + 10, 2008. The person(s) controlling the copyright in some of this + material may not have granted the IETF Trust the right to allow + modifications of such material outside the IETF Standards Process. + Without obtaining an adequate license from the person(s) controlling + the copyright in such materials, this document may not be modified + outside the IETF Standards Process, and derivative works of it may + not be created outside the IETF Standards Process, except to format + it for publication as an RFC or to translate it into languages other + than English. + + + + + + + + + + + + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 2] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +Table of Contents + + 1. Introduction ....................................................4 + 1.1. Conformance and Error Handling .............................4 + 1.2. Syntax Notation ............................................4 + 2. Range Units .....................................................5 + 2.1. Byte Ranges ................................................5 + 2.2. Other Range Units ..........................................7 + 2.3. Accept-Ranges ..............................................7 + 3. Range Requests ..................................................8 + 3.1. Range ......................................................8 + 3.2. If-Range ...................................................9 + 4. Responses to a Range Request ...................................10 + 4.1. 206 Partial Content .......................................10 + 4.2. Content-Range .............................................12 + 4.3. Combining Ranges ..........................................14 + 4.4. 416 Range Not Satisfiable .................................15 + 5. IANA Considerations ............................................16 + 5.1. Range Unit Registry .......................................16 + 5.1.1. Procedure ..........................................16 + 5.1.2. Registrations ......................................16 + 5.2. Status Code Registration ..................................17 + 5.3. Header Field Registration .................................17 + 5.4. Internet Media Type Registration ..........................17 + 5.4.1. Internet Media Type multipart/byteranges ...........18 + 6. Security Considerations ........................................19 + 6.1. Denial-of-Service Attacks Using Range .....................19 + 7. Acknowledgments ................................................19 + 8. References .....................................................20 + 8.1. Normative References ......................................20 + 8.2. Informative References ....................................20 + Appendix A. Internet Media Type multipart/byteranges ..............21 + Appendix B. Changes from RFC 2616 .................................22 + Appendix C. Imported ABNF .........................................22 + Appendix D. Collected ABNF ........................................23 + Index .............................................................24 + + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 3] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +1. Introduction + + Hypertext Transfer Protocol (HTTP) clients often encounter + interrupted data transfers as a result of canceled requests or + dropped connections. When a client has stored a partial + representation, it is desirable to request the remainder of that + representation in a subsequent request rather than transfer the + entire representation. Likewise, devices with limited local storage + might benefit from being able to request only a subset of a larger + representation, such as a single page of a very large document, or + the dimensions of an embedded image. + + This document defines HTTP/1.1 range requests, partial responses, and + the multipart/byteranges media type. Range requests are an OPTIONAL + feature of HTTP, designed so that recipients not implementing this + feature (or not supporting it for the target resource) can respond as + if it is a normal GET request without impacting interoperability. + Partial responses are indicated by a distinct status code to not be + mistaken for full responses by caches that might not implement the + feature. + + Although the range request mechanism is designed to allow for + extensible range types, this specification only defines requests for + byte ranges. + +1.1. Conformance and Error Handling + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC2119]. + + Conformance criteria and considerations regarding error handling are + defined in Section 2.5 of [RFC7230]. + +1.2. Syntax Notation + + This specification uses the Augmented Backus-Naur Form (ABNF) + notation of [RFC5234] with a list extension, defined in Section 7 of + [RFC7230], that allows for compact definition of comma-separated + lists using a '#' operator (similar to how the '*' operator indicates + repetition). Appendix C describes rules imported from other + documents. Appendix D shows the collected grammar with all list + operators expanded to standard ABNF notation. + + + + + + + + +Fielding, et al. Standards Track [Page 4] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +2. Range Units + + A representation can be partitioned into subranges according to + various structural units, depending on the structure inherent in the + representation's media type. This "range unit" is used in the + Accept-Ranges (Section 2.3) response header field to advertise + support for range requests, the Range (Section 3.1) request header + field to delineate the parts of a representation that are requested, + and the Content-Range (Section 4.2) payload header field to describe + which part of a representation is being transferred. + + range-unit = bytes-unit / other-range-unit + +2.1. Byte Ranges + + Since representation data is transferred in payloads as a sequence of + octets, a byte range is a meaningful substructure for any + representation transferable over HTTP (Section 3 of [RFC7231]). The + "bytes" range unit is defined for expressing subranges of the data's + octet sequence. + + bytes-unit = "bytes" + + A byte-range request can specify a single range of bytes or a set of + ranges within a single representation. + + byte-ranges-specifier = bytes-unit "=" byte-range-set + byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec ) + byte-range-spec = first-byte-pos "-" [ last-byte-pos ] + first-byte-pos = 1*DIGIT + last-byte-pos = 1*DIGIT + + The first-byte-pos value in a byte-range-spec gives the byte-offset + of the first byte in a range. The last-byte-pos value gives the + byte-offset of the last byte in the range; that is, the byte + positions specified are inclusive. Byte offsets start at zero. + + Examples of byte-ranges-specifier values: + + o The first 500 bytes (byte offsets 0-499, inclusive): + + bytes=0-499 + + o The second 500 bytes (byte offsets 500-999, inclusive): + + bytes=500-999 + + + + + +Fielding, et al. Standards Track [Page 5] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + A byte-range-spec is invalid if the last-byte-pos value is present + and less than the first-byte-pos. + + A client can limit the number of bytes requested without knowing the + size of the selected representation. If the last-byte-pos value is + absent, or if the value is greater than or equal to the current + length of the representation data, the byte range is interpreted as + the remainder of the representation (i.e., the server replaces the + value of last-byte-pos with a value that is one less than the current + length of the selected representation). + + A client can request the last N bytes of the selected representation + using a suffix-byte-range-spec. + + suffix-byte-range-spec = "-" suffix-length + suffix-length = 1*DIGIT + + If the selected representation is shorter than the specified + suffix-length, the entire representation is used. + + Additional examples, assuming a representation of length 10000: + + o The final 500 bytes (byte offsets 9500-9999, inclusive): + + bytes=-500 + + Or: + + bytes=9500- + + o The first and last bytes only (bytes 0 and 9999): + + bytes=0-0,-1 + + o Other valid (but not canonical) specifications of the second 500 + bytes (byte offsets 500-999, inclusive): + + bytes=500-600,601-999 + bytes=500-700,601-999 + + If a valid byte-range-set includes at least one byte-range-spec with + a first-byte-pos that is less than the current length of the + representation, or at least one suffix-byte-range-spec with a + non-zero suffix-length, then the byte-range-set is satisfiable. + Otherwise, the byte-range-set is unsatisfiable. + + + + + + +Fielding, et al. Standards Track [Page 6] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + In the byte-range syntax, first-byte-pos, last-byte-pos, and + suffix-length are expressed as decimal number of octets. Since there + is no predefined limit to the length of a payload, recipients MUST + anticipate potentially large decimal numerals and prevent parsing + errors due to integer conversion overflows. + +2.2. Other Range Units + + Range units are intended to be extensible. New range units ought to + be registered with IANA, as defined in Section 5.1. + + other-range-unit = token + +2.3. Accept-Ranges + + The "Accept-Ranges" header field allows a server to indicate that it + supports range requests for the target resource. + + Accept-Ranges = acceptable-ranges + acceptable-ranges = 1#range-unit / "none" + + An origin server that supports byte-range requests for a given target + resource MAY send + + Accept-Ranges: bytes + + to indicate what range units are supported. A client MAY generate + range requests without having received this header field for the + resource involved. Range units are defined in Section 2. + + A server that does not support any kind of range request for the + target resource MAY send + + Accept-Ranges: none + + to advise the client not to attempt a range request. + + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 7] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +3. Range Requests + +3.1. Range + + The "Range" header field on a GET request modifies the method + semantics to request transfer of only one or more subranges of the + selected representation data, rather than the entire selected + representation data. + + Range = byte-ranges-specifier / other-ranges-specifier + other-ranges-specifier = other-range-unit "=" other-range-set + other-range-set = 1*VCHAR + + A server MAY ignore the Range header field. However, origin servers + and intermediate caches ought to support byte ranges when possible, + since Range supports efficient recovery from partially failed + transfers and partial retrieval of large representations. A server + MUST ignore a Range header field received with a request method other + than GET. + + An origin server MUST ignore a Range header field that contains a + range unit it does not understand. A proxy MAY discard a Range + header field that contains a range unit it does not understand. + + A server that supports range requests MAY ignore or reject a Range + header field that consists of more than two overlapping ranges, or a + set of many small ranges that are not listed in ascending order, + since both are indications of either a broken client or a deliberate + denial-of-service attack (Section 6.1). A client SHOULD NOT request + multiple ranges that are inherently less efficient to process and + transfer than a single range that encompasses the same data. + + A client that is requesting multiple ranges SHOULD list those ranges + in ascending order (the order in which they would typically be + received in a complete representation) unless there is a specific + need to request a later part earlier. For example, a user agent + processing a large representation with an internal catalog of parts + might need to request later parts first, particularly if the + representation consists of pages stored in reverse order and the user + agent wishes to transfer one page at a time. + + The Range header field is evaluated after evaluating the precondition + header fields defined in [RFC7232], and only if the result in absence + of the Range header field would be a 200 (OK) response. In other + words, Range is ignored when a conditional GET would result in a 304 + (Not Modified) response. + + + + + +Fielding, et al. Standards Track [Page 8] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + The If-Range header field (Section 3.2) can be used as a precondition + to applying the Range header field. + + If all of the preconditions are true, the server supports the Range + header field for the target resource, and the specified range(s) are + valid and satisfiable (as defined in Section 2.1), the server SHOULD + send a 206 (Partial Content) response with a payload containing one + or more partial representations that correspond to the satisfiable + ranges requested, as defined in Section 4. + + If all of the preconditions are true, the server supports the Range + header field for the target resource, and the specified range(s) are + invalid or unsatisfiable, the server SHOULD send a 416 (Range Not + Satisfiable) response. + +3.2. If-Range + + If a client has a partial copy of a representation and wishes to have + an up-to-date copy of the entire representation, it could use the + Range header field with a conditional GET (using either or both of + If-Unmodified-Since and If-Match.) However, if the precondition + fails because the representation has been modified, the client would + then have to make a second request to obtain the entire current + representation. + + The "If-Range" header field allows a client to "short-circuit" the + second request. Informally, its meaning is as follows: if the + representation is unchanged, send me the part(s) that I am requesting + in Range; otherwise, send me the entire representation. + + If-Range = entity-tag / HTTP-date + + A client MUST NOT generate an If-Range header field in a request that + does not contain a Range header field. A server MUST ignore an + If-Range header field received in a request that does not contain a + Range header field. An origin server MUST ignore an If-Range header + field received in a request for a target resource that does not + support Range requests. + + A client MUST NOT generate an If-Range header field containing an + entity-tag that is marked as weak. A client MUST NOT generate an + If-Range header field containing an HTTP-date unless the client has + no entity-tag for the corresponding representation and the date is a + strong validator in the sense defined by Section 2.2.2 of [RFC7232]. + + A server that evaluates an If-Range precondition MUST use the strong + comparison function when comparing entity-tags (Section 2.3.2 of + [RFC7232]) and MUST evaluate the condition as false if an HTTP-date + + + +Fielding, et al. Standards Track [Page 9] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + validator is provided that is not a strong validator in the sense + defined by Section 2.2.2 of [RFC7232]. A valid entity-tag can be + distinguished from a valid HTTP-date by examining the first two + characters for a DQUOTE. + + If the validator given in the If-Range header field matches the + current validator for the selected representation of the target + resource, then the server SHOULD process the Range header field as + requested. If the validator does not match, the server MUST ignore + the Range header field. Note that this comparison by exact match, + including when the validator is an HTTP-date, differs from the + "earlier than or equal to" comparison used when evaluating an + If-Unmodified-Since conditional. + +4. Responses to a Range Request + +4.1. 206 Partial Content + + The 206 (Partial Content) status code indicates that the server is + successfully fulfilling a range request for the target resource by + transferring one or more parts of the selected representation that + correspond to the satisfiable ranges found in the request's Range + header field (Section 3.1). + + If a single part is being transferred, the server generating the 206 + response MUST generate a Content-Range header field, describing what + range of the selected representation is enclosed, and a payload + consisting of the range. For example: + + HTTP/1.1 206 Partial Content + Date: Wed, 15 Nov 1995 06:25:24 GMT + Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT + Content-Range: bytes 21010-47021/47022 + Content-Length: 26012 + Content-Type: image/gif + + ... 26012 bytes of partial image data ... + + If multiple parts are being transferred, the server generating the + 206 response MUST generate a "multipart/byteranges" payload, as + defined in Appendix A, and a Content-Type header field containing the + multipart/byteranges media type and its required boundary parameter. + To avoid confusion with single-part responses, a server MUST NOT + generate a Content-Range header field in the HTTP header section of a + multiple part response (this field will be sent in each part + instead). + + + + + +Fielding, et al. Standards Track [Page 10] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + Within the header area of each body part in the multipart payload, + the server MUST generate a Content-Range header field corresponding + to the range being enclosed in that body part. If the selected + representation would have had a Content-Type header field in a 200 + (OK) response, the server SHOULD generate that same Content-Type + field in the header area of each body part. For example: + + HTTP/1.1 206 Partial Content + Date: Wed, 15 Nov 1995 06:25:24 GMT + Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT + Content-Length: 1741 + Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES + + --THIS_STRING_SEPARATES + Content-Type: application/pdf + Content-Range: bytes 500-999/8000 + + ...the first range... + --THIS_STRING_SEPARATES + Content-Type: application/pdf + Content-Range: bytes 7000-7999/8000 + + ...the second range + --THIS_STRING_SEPARATES-- + + When multiple ranges are requested, a server MAY coalesce any of the + ranges that overlap, or that are separated by a gap that is smaller + than the overhead of sending multiple parts, regardless of the order + in which the corresponding byte-range-spec appeared in the received + Range header field. Since the typical overhead between parts of a + multipart/byteranges payload is around 80 bytes, depending on the + selected representation's media type and the chosen boundary + parameter length, it can be less efficient to transfer many small + disjoint parts than it is to transfer the entire selected + representation. + + A server MUST NOT generate a multipart response to a request for a + single range, since a client that does not request multiple parts + might not support multipart responses. However, a server MAY + generate a multipart/byteranges payload with only a single body part + if multiple ranges were requested and only one range was found to be + satisfiable or only one range remained after coalescing. A client + that cannot process a multipart/byteranges response MUST NOT generate + a request that asks for multiple ranges. + + When a multipart response payload is generated, the server SHOULD + send the parts in the same order that the corresponding + byte-range-spec appeared in the received Range header field, + + + +Fielding, et al. Standards Track [Page 11] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + excluding those ranges that were deemed unsatisfiable or that were + coalesced into other ranges. A client that receives a multipart + response MUST inspect the Content-Range header field present in each + body part in order to determine which range is contained in that body + part; a client cannot rely on receiving the same ranges that it + requested, nor the same order that it requested. + + When a 206 response is generated, the server MUST generate the + following header fields, in addition to those required above, if the + field would have been sent in a 200 (OK) response to the same + request: Date, Cache-Control, ETag, Expires, Content-Location, and + Vary. + + If a 206 is generated in response to a request with an If-Range + header field, the sender SHOULD NOT generate other representation + header fields beyond those required above, because the client is + understood to already have a prior response containing those header + fields. Otherwise, the sender MUST generate all of the + representation header fields that would have been sent in a 200 (OK) + response to the same request. + + A 206 response is cacheable by default; i.e., unless otherwise + indicated by explicit cache controls (see Section 4.2.2 of + [RFC7234]). + +4.2. Content-Range + + The "Content-Range" header field is sent in a single part 206 + (Partial Content) response to indicate the partial range of the + selected representation enclosed as the message payload, sent in each + part of a multipart 206 response to indicate the range enclosed + within each body part, and sent in 416 (Range Not Satisfiable) + responses to provide information about the selected representation. + + Content-Range = byte-content-range + / other-content-range + + byte-content-range = bytes-unit SP + ( byte-range-resp / unsatisfied-range ) + + byte-range-resp = byte-range "/" ( complete-length / "*" ) + byte-range = first-byte-pos "-" last-byte-pos + unsatisfied-range = "*/" complete-length + + complete-length = 1*DIGIT + + other-content-range = other-range-unit SP other-range-resp + other-range-resp = *CHAR + + + +Fielding, et al. Standards Track [Page 12] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + If a 206 (Partial Content) response contains a Content-Range header + field with a range unit (Section 2) that the recipient does not + understand, the recipient MUST NOT attempt to recombine it with a + stored representation. A proxy that receives such a message SHOULD + forward it downstream. + + For byte ranges, a sender SHOULD indicate the complete length of the + representation from which the range has been extracted, unless the + complete length is unknown or difficult to determine. An asterisk + character ("*") in place of the complete-length indicates that the + representation length was unknown when the header field was + generated. + + The following example illustrates when the complete length of the + selected representation is known by the sender to be 1234 bytes: + + Content-Range: bytes 42-1233/1234 + + and this second example illustrates when the complete length is + unknown: + + Content-Range: bytes 42-1233/* + + A Content-Range field value is invalid if it contains a + byte-range-resp that has a last-byte-pos value less than its + first-byte-pos value, or a complete-length value less than or equal + to its last-byte-pos value. The recipient of an invalid + Content-Range MUST NOT attempt to recombine the received content with + a stored representation. + + A server generating a 416 (Range Not Satisfiable) response to a + byte-range request SHOULD send a Content-Range header field with an + unsatisfied-range value, as in the following example: + + Content-Range: bytes */1234 + + The complete-length in a 416 response indicates the current length of + the selected representation. + + The Content-Range header field has no meaning for status codes that + do not explicitly describe its semantic. For this specification, + only the 206 (Partial Content) and 416 (Range Not Satisfiable) status + codes describe a meaning for Content-Range. + + + + + + + + +Fielding, et al. Standards Track [Page 13] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + The following are examples of Content-Range values in which the + selected representation contains a total of 1234 bytes: + + o The first 500 bytes: + + Content-Range: bytes 0-499/1234 + + o The second 500 bytes: + + Content-Range: bytes 500-999/1234 + + o All except for the first 500 bytes: + + Content-Range: bytes 500-1233/1234 + + o The last 500 bytes: + + Content-Range: bytes 734-1233/1234 + +4.3. Combining Ranges + + A response might transfer only a subrange of a representation if the + connection closed prematurely or if the request used one or more + Range specifications. After several such transfers, a client might + have received several ranges of the same representation. These + ranges can only be safely combined if they all have in common the + same strong validator (Section 2.1 of [RFC7232]). + + A client that has received multiple partial responses to GET requests + on a target resource MAY combine those responses into a larger + continuous range if they share the same strong validator. + + If the most recent response is an incomplete 200 (OK) response, then + the header fields of that response are used for any combined response + and replace those of the matching stored responses. + + If the most recent response is a 206 (Partial Content) response and + at least one of the matching stored responses is a 200 (OK), then the + combined response header fields consist of the most recent 200 + response's header fields. If all of the matching stored responses + are 206 responses, then the stored response with the most recent + header fields is used as the source of header fields for the combined + response, except that the client MUST use other header fields + provided in the new response, aside from Content-Range, to replace + all instances of the corresponding header fields in the stored + response. + + + + + +Fielding, et al. Standards Track [Page 14] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + The combined response message body consists of the union of partial + content ranges in the new response and each of the selected + responses. If the union consists of the entire range of the + representation, then the client MUST process the combined response as + if it were a complete 200 (OK) response, including a Content-Length + header field that reflects the complete length. Otherwise, the + client MUST process the set of continuous ranges as one of the + following: an incomplete 200 (OK) response if the combined response + is a prefix of the representation, a single 206 (Partial Content) + response containing a multipart/byteranges body, or multiple 206 + (Partial Content) responses, each with one continuous range that is + indicated by a Content-Range header field. + +4.4. 416 Range Not Satisfiable + + The 416 (Range Not Satisfiable) status code indicates that none of + the ranges in the request's Range header field (Section 3.1) overlap + the current extent of the selected resource or that the set of ranges + requested has been rejected due to invalid ranges or an excessive + request of small or overlapping ranges. + + For byte ranges, failing to overlap the current extent means that the + first-byte-pos of all of the byte-range-spec values were greater than + the current length of the selected representation. When this status + code is generated in response to a byte-range request, the sender + SHOULD generate a Content-Range header field specifying the current + length of the selected representation (Section 4.2). + + For example: + + HTTP/1.1 416 Range Not Satisfiable + Date: Fri, 20 Jan 2012 15:41:54 GMT + Content-Range: bytes */47022 + + Note: Because servers are free to ignore Range, many + implementations will simply respond with the entire selected + representation in a 200 (OK) response. That is partly because + most clients are prepared to receive a 200 (OK) to complete the + task (albeit less efficiently) and partly because clients might + not stop making an invalid partial request until they have + received a complete representation. Thus, clients cannot depend + on receiving a 416 (Range Not Satisfiable) response even when it + is most appropriate. + + + + + + + + +Fielding, et al. Standards Track [Page 15] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +5. IANA Considerations + +5.1. Range Unit Registry + + The "HTTP Range Unit Registry" defines the namespace for the range + unit names and refers to their corresponding specifications. The + registry has been created and is now maintained at + <http://www.iana.org/assignments/http-parameters>. + +5.1.1. Procedure + + Registration of an HTTP Range Unit MUST include the following fields: + + o Name + + o Description + + o Pointer to specification text + + Values to be added to this namespace require IETF Review (see + [RFC5226], Section 4.1). + +5.1.2. Registrations + + The initial range unit registry contains the registrations below: + + +-------------+---------------------------------------+-------------+ + | Range Unit | Description | Reference | + | Name | | | + +-------------+---------------------------------------+-------------+ + | bytes | a range of octets | Section 2.1 | + | none | reserved as keyword, indicating no | Section 2.3 | + | | ranges are supported | | + +-------------+---------------------------------------+-------------+ + + The change controller is: "IETF (iesg@ietf.org) - Internet + Engineering Task Force". + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 16] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +5.2. Status Code Registration + + The "Hypertext Transfer Protocol (HTTP) Status Code Registry" located + at <http://www.iana.org/assignments/http-status-codes> has been + updated to include the registrations below: + + +-------+-----------------------+-------------+ + | Value | Description | Reference | + +-------+-----------------------+-------------+ + | 206 | Partial Content | Section 4.1 | + | 416 | Range Not Satisfiable | Section 4.4 | + +-------+-----------------------+-------------+ + +5.3. Header Field Registration + + HTTP header fields are registered within the "Message Headers" + registry maintained at + <http://www.iana.org/assignments/message-headers/>. + + This document defines the following HTTP header fields, so their + associated registry entries have been updated according to the + permanent registrations below (see [BCP90]): + + +-------------------+----------+----------+-------------+ + | Header Field Name | Protocol | Status | Reference | + +-------------------+----------+----------+-------------+ + | Accept-Ranges | http | standard | Section 2.3 | + | Content-Range | http | standard | Section 4.2 | + | If-Range | http | standard | Section 3.2 | + | Range | http | standard | Section 3.1 | + +-------------------+----------+----------+-------------+ + + The change controller is: "IETF (iesg@ietf.org) - Internet + Engineering Task Force". + +5.4. Internet Media Type Registration + + IANA maintains the registry of Internet media types [BCP13] at + <http://www.iana.org/assignments/media-types>. + + This document serves as the specification for the Internet media type + "multipart/byteranges". The following has been registered with IANA. + + + + + + + + + +Fielding, et al. Standards Track [Page 17] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +5.4.1. Internet Media Type multipart/byteranges + + Type name: multipart + + Subtype name: byteranges + + Required parameters: boundary + + Optional parameters: N/A + + Encoding considerations: only "7bit", "8bit", or "binary" are + permitted + + Security considerations: see Section 6 + + Interoperability considerations: N/A + + Published specification: This specification (see Appendix A). + + Applications that use this media type: HTTP components supporting + multiple ranges in a single request. + + Fragment identifier considerations: N/A + + Additional information: + + Deprecated alias names for this type: N/A + + Magic number(s): N/A + + File extension(s): N/A + + Macintosh file type code(s): N/A + + Person and email address to contact for further information: See + Authors' Addresses section. + + Intended usage: COMMON + + Restrictions on usage: N/A + + Author: See Authors' Addresses section. + + Change controller: IESG + + + + + + + +Fielding, et al. Standards Track [Page 18] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +6. Security Considerations + + This section is meant to inform developers, information providers, + and users of known security concerns specific to the HTTP range + request mechanisms. More general security considerations are + addressed in HTTP messaging [RFC7230] and semantics [RFC7231]. + +6.1. Denial-of-Service Attacks Using Range + + Unconstrained multiple range requests are susceptible to denial-of- + service attacks because the effort required to request many + overlapping ranges of the same data is tiny compared to the time, + memory, and bandwidth consumed by attempting to serve the requested + data in many parts. Servers ought to ignore, coalesce, or reject + egregious range requests, such as requests for more than two + overlapping ranges or for many small ranges in a single set, + particularly when the ranges are requested out of order for no + apparent reason. Multipart range requests are not designed to + support random access. + +7. Acknowledgments + + See Section 10 of [RFC7230]. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 19] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +8. References + +8.1. Normative References + + [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part Two: Media Types", RFC 2046, + November 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, January 2008. + + [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer + Protocol (HTTP/1.1): Message Syntax and Routing", + RFC 7230, June 2014. + + [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer + Protocol (HTTP/1.1): Semantics and Content", RFC 7231, + June 2014. + + [RFC7232] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer + Protocol (HTTP/1.1): Conditional Requests", RFC 7232, + June 2014. + + [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, + Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", + RFC 7234, June 2014. + +8.2. Informative References + + [BCP13] Freed, N., Klensin, J., and T. Hansen, "Media Type + Specifications and Registration Procedures", BCP 13, + RFC 6838, January 2013. + + [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration + Procedures for Message Header Fields", BCP 90, RFC 3864, + September 2004. + + [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., + Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext + Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. + + [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an + IANA Considerations Section in RFCs", BCP 26, RFC 5226, + May 2008. + + + + +Fielding, et al. Standards Track [Page 20] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +Appendix A. Internet Media Type multipart/byteranges + + When a 206 (Partial Content) response message includes the content of + multiple ranges, they are transmitted as body parts in a multipart + message body ([RFC2046], Section 5.1) with the media type of + "multipart/byteranges". + + The multipart/byteranges media type includes one or more body parts, + each with its own Content-Type and Content-Range fields. The + required boundary parameter specifies the boundary string used to + separate each body part. + + Implementation Notes: + + 1. Additional CRLFs might precede the first boundary string in the + body. + + 2. Although [RFC2046] permits the boundary string to be quoted, some + existing implementations handle a quoted boundary string + incorrectly. + + 3. A number of clients and servers were coded to an early draft of + the byteranges specification that used a media type of multipart/ + x-byteranges, which is almost (but not quite) compatible with + this type. + + Despite the name, the "multipart/byteranges" media type is not + limited to byte ranges. The following example uses an "exampleunit" + range unit: + + HTTP/1.1 206 Partial Content + Date: Tue, 14 Nov 1995 06:25:24 GMT + Last-Modified: Tue, 14 July 04:58:08 GMT + Content-Length: 2331785 + Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES + + --THIS_STRING_SEPARATES + Content-Type: video/example + Content-Range: exampleunit 1.2-4.3/25 + + ...the first range... + --THIS_STRING_SEPARATES + Content-Type: video/example + Content-Range: exampleunit 11.2-14.3/25 + + ...the second range + --THIS_STRING_SEPARATES-- + + + + +Fielding, et al. Standards Track [Page 21] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +Appendix B. Changes from RFC 2616 + + Servers are given more leeway in how they respond to a range request, + in order to mitigate abuse by malicious (or just greedy) clients. + (Section 3.1) + + A weak validator cannot be used in a 206 response. (Section 4.1) + + The Content-Range header field only has meaning when the status code + explicitly defines its use. (Section 4.2) + + This specification introduces a Range Unit Registry. (Section 5.1) + + multipart/byteranges can consist of a single part. (Appendix A) + +Appendix C. Imported ABNF + + The following core rules are included by reference, as defined in + Appendix B.1 of [RFC5234]: ALPHA (letters), CR (carriage return), + CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double + quote), HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any + 8-bit sequence of data), SP (space), and VCHAR (any visible US-ASCII + character). + + Note that all rules derived from token are to be compared + case-insensitively, like range-unit and acceptable-ranges. + + The rules below are defined in [RFC7230]: + + OWS = <OWS, see [RFC7230], Section 3.2.3> + token = <token, see [RFC7230], Section 3.2.6> + + The rules below are defined in other parts: + + HTTP-date = <HTTP-date, see [RFC7231], Section 7.1.1.1> + entity-tag = <entity-tag, see [RFC7232], Section 2.3> + + + + + + + + + + + + + + + +Fielding, et al. Standards Track [Page 22] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + +Appendix D. Collected ABNF + + In the collected ABNF below, list rules are expanded as per Section + 1.2 of [RFC7230]. + + Accept-Ranges = acceptable-ranges + + Content-Range = byte-content-range / other-content-range + + HTTP-date = <HTTP-date, see [RFC7231], Section 7.1.1.1> + + If-Range = entity-tag / HTTP-date + + OWS = <OWS, see [RFC7230], Section 3.2.3> + + Range = byte-ranges-specifier / other-ranges-specifier + + acceptable-ranges = ( *( "," OWS ) range-unit *( OWS "," [ OWS + range-unit ] ) ) / "none" + + byte-content-range = bytes-unit SP ( byte-range-resp / + unsatisfied-range ) + byte-range = first-byte-pos "-" last-byte-pos + byte-range-resp = byte-range "/" ( complete-length / "*" ) + byte-range-set = *( "," OWS ) ( byte-range-spec / + suffix-byte-range-spec ) *( OWS "," [ OWS ( byte-range-spec / + suffix-byte-range-spec ) ] ) + byte-range-spec = first-byte-pos "-" [ last-byte-pos ] + byte-ranges-specifier = bytes-unit "=" byte-range-set + bytes-unit = "bytes" + + complete-length = 1*DIGIT + + entity-tag = <entity-tag, see [RFC7232], Section 2.3> + + first-byte-pos = 1*DIGIT + + last-byte-pos = 1*DIGIT + + other-content-range = other-range-unit SP other-range-resp + other-range-resp = *CHAR + other-range-set = 1*VCHAR + other-range-unit = token + other-ranges-specifier = other-range-unit "=" other-range-set + + range-unit = bytes-unit / other-range-unit + + suffix-byte-range-spec = "-" suffix-length + + + +Fielding, et al. Standards Track [Page 23] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + suffix-length = 1*DIGIT + + token = <token, see [RFC7230], Section 3.2.6> + + unsatisfied-range = "*/" complete-length + +Index + + 2 + 206 Partial Content (status code) 10 + + 4 + 416 Range Not Satisfiable (status code) 15 + + A + Accept-Ranges header field 7 + + C + Content-Range header field 12 + + G + Grammar + Accept-Ranges 7 + acceptable-ranges 7 + byte-content-range 12 + byte-range 12 + byte-range-resp 12 + byte-range-set 5 + byte-range-spec 5 + byte-ranges-specifier 5 + bytes-unit 5 + complete-length 12 + Content-Range 12 + first-byte-pos 5 + If-Range 9 + last-byte-pos 5 + other-content-range 12 + other-range-resp 12 + other-range-unit 5, 7 + Range 8 + range-unit 5 + ranges-specifier 5 + suffix-byte-range-spec 6 + suffix-length 6 + unsatisfied-range 12 + + + + + + +Fielding, et al. Standards Track [Page 24] + +RFC 7233 HTTP/1.1 Range Requests June 2014 + + + I + If-Range header field 9 + + M + Media Type + multipart/byteranges 18, 21 + multipart/x-byteranges 19 + multipart/byteranges Media Type 18, 21 + multipart/x-byteranges Media Type 21 + + R + Range header field 8 + +Authors' Addresses + + Roy T. Fielding (editor) + Adobe Systems Incorporated + 345 Park Ave + San Jose, CA 95110 + USA + + EMail: fielding@gbiv.com + URI: http://roy.gbiv.com/ + + + Yves Lafon (editor) + World Wide Web Consortium + W3C / ERCIM + 2004, rte des Lucioles + Sophia-Antipolis, AM 06902 + France + + EMail: ylafon@w3.org + URI: http://www.raubacapeu.net/people/yves/ + + + Julian F. Reschke (editor) + greenbytes GmbH + Hafenweg 16 + Muenster, NW 48155 + Germany + + EMail: julian.reschke@greenbytes.de + URI: http://greenbytes.de/tech/webdav/ + + + + + + + +Fielding, et al. Standards Track [Page 25] + |