Changeset 2142


Ignore:
Timestamp:
Jan 20, 2013, 6:51:00 AM (7 years ago)
Author:
fielding@…
Message:

(editorial) move header fields to where they are used; no text changes

Location:
draft-ietf-httpbis/latest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • draft-ietf-httpbis/latest/p5-range.html

    r2141 r2142  
    476476      <link rel="Chapter" title="4 Status Code Definitions" href="#rfc.section.4">
    477477      <link rel="Chapter" title="5 Responses to a Range Request" href="#rfc.section.5">
    478       <link rel="Chapter" title="6 Header Field Definitions" href="#rfc.section.6">
    479       <link rel="Chapter" title="7 IANA Considerations" href="#rfc.section.7">
    480       <link rel="Chapter" title="8 Security Considerations" href="#rfc.section.8">
    481       <link rel="Chapter" title="9 Acknowledgments" href="#rfc.section.9">
    482       <link rel="Chapter" href="#rfc.section.10" title="10 References">
     478      <link rel="Chapter" title="6 IANA Considerations" href="#rfc.section.6">
     479      <link rel="Chapter" title="7 Security Considerations" href="#rfc.section.7">
     480      <link rel="Chapter" title="8 Acknowledgments" href="#rfc.section.8">
     481      <link rel="Chapter" href="#rfc.section.9" title="9 References">
    483482      <link rel="Appendix" title="A Internet Media Type multipart/byteranges" href="#rfc.section.A">
    484483      <link rel="Appendix" title="B Changes from RFC 2616" href="#rfc.section.B">
     
    580579               <li><a href="#rfc.section.2.1">2.1</a>&nbsp;&nbsp;&nbsp;<a href="#byte.ranges">Byte Ranges</a></li>
    581580               <li><a href="#rfc.section.2.2">2.2</a>&nbsp;&nbsp;&nbsp;<a href="#range.units.other">Other Range Units</a></li>
     581               <li><a href="#rfc.section.2.3">2.3</a>&nbsp;&nbsp;&nbsp;<a href="#header.accept-ranges">Accept-Ranges</a></li>
    582582            </ul>
    583583         </li>
    584          <li><a href="#rfc.section.3">3.</a>&nbsp;&nbsp;&nbsp;<a href="#range.requests">Range Requests</a></li>
     584         <li><a href="#rfc.section.3">3.</a>&nbsp;&nbsp;&nbsp;<a href="#range.requests">Range Requests</a><ul>
     585               <li><a href="#rfc.section.3.1">3.1</a>&nbsp;&nbsp;&nbsp;<a href="#header.range">Range</a></li>
     586               <li><a href="#rfc.section.3.2">3.2</a>&nbsp;&nbsp;&nbsp;<a href="#header.if-range">If-Range</a></li>
     587            </ul>
     588         </li>
    585589         <li><a href="#rfc.section.4">4.</a>&nbsp;&nbsp;&nbsp;<a href="#status.code.definitions">Status Code Definitions</a><ul>
    586590               <li><a href="#rfc.section.4.1">4.1</a>&nbsp;&nbsp;&nbsp;<a href="#status.206">206 Partial Content</a></li>
     
    590594         <li><a href="#rfc.section.5">5.</a>&nbsp;&nbsp;&nbsp;<a href="#range.response">Responses to a Range Request</a><ul>
    591595               <li><a href="#rfc.section.5.1">5.1</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.section.5.1">Response to a Single and Multiple Ranges Request</a></li>
    592                <li><a href="#rfc.section.5.2">5.2</a>&nbsp;&nbsp;&nbsp;<a href="#combining.byte.ranges">Combining Ranges</a></li>
     596               <li><a href="#rfc.section.5.2">5.2</a>&nbsp;&nbsp;&nbsp;<a href="#header.content-range">Content-Range</a></li>
     597               <li><a href="#rfc.section.5.3">5.3</a>&nbsp;&nbsp;&nbsp;<a href="#combining.byte.ranges">Combining Ranges</a></li>
    593598            </ul>
    594599         </li>
    595          <li><a href="#rfc.section.6">6.</a>&nbsp;&nbsp;&nbsp;<a href="#header.field.definitions">Header Field Definitions</a><ul>
    596                <li><a href="#rfc.section.6.1">6.1</a>&nbsp;&nbsp;&nbsp;<a href="#header.accept-ranges">Accept-Ranges</a></li>
    597                <li><a href="#rfc.section.6.2">6.2</a>&nbsp;&nbsp;&nbsp;<a href="#header.content-range">Content-Range</a></li>
    598                <li><a href="#rfc.section.6.3">6.3</a>&nbsp;&nbsp;&nbsp;<a href="#header.if-range">If-Range</a></li>
    599                <li><a href="#rfc.section.6.4">6.4</a>&nbsp;&nbsp;&nbsp;<a href="#header.range">Range</a></li>
    600             </ul>
    601          </li>
    602          <li><a href="#rfc.section.7">7.</a>&nbsp;&nbsp;&nbsp;<a href="#IANA.considerations">IANA Considerations</a><ul>
    603                <li><a href="#rfc.section.7.1">7.1</a>&nbsp;&nbsp;&nbsp;<a href="#range.unit.registry">Range Unit Registry</a><ul>
    604                      <li><a href="#rfc.section.7.1.1">7.1.1</a>&nbsp;&nbsp;&nbsp;<a href="#range.unit.registry.procedure">Procedure</a></li>
    605                      <li><a href="#rfc.section.7.1.2">7.1.2</a>&nbsp;&nbsp;&nbsp;<a href="#range.unit.registration">Registrations</a></li>
     600         <li><a href="#rfc.section.6">6.</a>&nbsp;&nbsp;&nbsp;<a href="#IANA.considerations">IANA Considerations</a><ul>
     601               <li><a href="#rfc.section.6.1">6.1</a>&nbsp;&nbsp;&nbsp;<a href="#range.unit.registry">Range Unit Registry</a><ul>
     602                     <li><a href="#rfc.section.6.1.1">6.1.1</a>&nbsp;&nbsp;&nbsp;<a href="#range.unit.registry.procedure">Procedure</a></li>
     603                     <li><a href="#rfc.section.6.1.2">6.1.2</a>&nbsp;&nbsp;&nbsp;<a href="#range.unit.registration">Registrations</a></li>
    606604                  </ul>
    607605               </li>
    608                <li><a href="#rfc.section.7.2">7.2</a>&nbsp;&nbsp;&nbsp;<a href="#status.code.registration">Status Code Registration</a></li>
    609                <li><a href="#rfc.section.7.3">7.3</a>&nbsp;&nbsp;&nbsp;<a href="#header.field.registration">Header Field Registration</a></li>
     606               <li><a href="#rfc.section.6.2">6.2</a>&nbsp;&nbsp;&nbsp;<a href="#status.code.registration">Status Code Registration</a></li>
     607               <li><a href="#rfc.section.6.3">6.3</a>&nbsp;&nbsp;&nbsp;<a href="#header.field.registration">Header Field Registration</a></li>
    610608            </ul>
    611609         </li>
    612          <li><a href="#rfc.section.8">8.</a>&nbsp;&nbsp;&nbsp;<a href="#security.considerations">Security Considerations</a><ul>
    613                <li><a href="#rfc.section.8.1">8.1</a>&nbsp;&nbsp;&nbsp;<a href="#overlapping.ranges">Overlapping Ranges</a></li>
     610         <li><a href="#rfc.section.7">7.</a>&nbsp;&nbsp;&nbsp;<a href="#security.considerations">Security Considerations</a><ul>
     611               <li><a href="#rfc.section.7.1">7.1</a>&nbsp;&nbsp;&nbsp;<a href="#overlapping.ranges">Overlapping Ranges</a></li>
    614612            </ul>
    615613         </li>
    616          <li><a href="#rfc.section.9">9.</a>&nbsp;&nbsp;&nbsp;<a href="#acks">Acknowledgments</a></li>
    617          <li><a href="#rfc.section.10">10.</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.references">References</a><ul>
    618                <li><a href="#rfc.section.10.1">10.1</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.references.1">Normative References</a></li>
    619                <li><a href="#rfc.section.10.2">10.2</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.references.2">Informative References</a></li>
     614         <li><a href="#rfc.section.8">8.</a>&nbsp;&nbsp;&nbsp;<a href="#acks">Acknowledgments</a></li>
     615         <li><a href="#rfc.section.9">9.</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.references">References</a><ul>
     616               <li><a href="#rfc.section.9.1">9.1</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.references.1">Normative References</a></li>
     617               <li><a href="#rfc.section.9.2">9.2</a>&nbsp;&nbsp;&nbsp;<a href="#rfc.references.2">Informative References</a></li>
    620618            </ul>
    621619         </li>
     
    659657      <h1 id="rfc.section.2"><a href="#rfc.section.2">2.</a>&nbsp;<a id="range.units" href="#range.units">Range Units</a></h1>
    660658      <p id="rfc.section.2.p.1">A representation can be partitioned into subranges according to various structural units, depending on the structure inherent
    661          in the representation's media type. Such a <dfn>range unit</dfn> can be used in the <a href="#header.range" class="smpl">Range</a> (<a href="#header.range" id="rfc.xref.header.range.1" title="Range">Section&nbsp;6.4</a>) and <a href="#header.content-range" class="smpl">Content-Range</a> (<a href="#header.content-range" id="rfc.xref.header.content-range.1" title="Content-Range">Section&nbsp;6.2</a>) header fields to delineate the parts of a representation that are either requested or transferred, respectively.
     659         in the representation's media type. Such a <dfn>range unit</dfn> can be used in the <a href="#header.range" class="smpl">Range</a> (<a href="#header.range" id="rfc.xref.header.range.1" title="Range">Section&nbsp;3.1</a>) and <a href="#header.content-range" class="smpl">Content-Range</a> (<a href="#header.content-range" id="rfc.xref.header.content-range.1" title="Content-Range">Section&nbsp;5.2</a>) header fields to delineate the parts of a representation that are either requested or transferred, respectively.
    662660      </p>
    663661      <div id="rfc.figure.u.1"></div><pre class="inline"><span id="rfc.iref.g.1"></span><span id="rfc.iref.g.2"></span><span id="rfc.iref.g.3"></span>  <a href="#range.units" class="smpl">range-unit</a>       = <a href="#range.units" class="smpl">bytes-unit</a> / <a href="#range.units" class="smpl">other-range-unit</a>
     
    724722      </ul>
    725723      <h2 id="rfc.section.2.2"><a href="#rfc.section.2.2">2.2</a>&nbsp;<a id="range.units.other" href="#range.units.other">Other Range Units</a></h2>
    726       <p id="rfc.section.2.2.p.1">The only range unit defined by HTTP/1.1 is "bytes" (<a href="#byte.ranges" title="Byte Ranges">Section&nbsp;2.1</a>). Additional units can be defined as described in <a href="#range.unit.registry" title="Range Unit Registry">Section&nbsp;7.1</a>.
    727       </p>
     724      <p id="rfc.section.2.2.p.1">The only range unit defined by HTTP/1.1 is "bytes" (<a href="#byte.ranges" title="Byte Ranges">Section&nbsp;2.1</a>). Additional units can be defined as described in <a href="#range.unit.registry" title="Range Unit Registry">Section&nbsp;6.1</a>.
     725      </p>
     726      <div id="rfc.iref.a.1"></div>
     727      <h2 id="rfc.section.2.3"><a href="#rfc.section.2.3">2.3</a>&nbsp;<a id="header.accept-ranges" href="#header.accept-ranges">Accept-Ranges</a></h2>
     728      <p id="rfc.section.2.3.p.1">The "Accept-Ranges" header field allows a resource to indicate its acceptance of range requests.</p>
     729      <div id="rfc.figure.u.10"></div><pre class="inline"><span id="rfc.iref.g.12"></span><span id="rfc.iref.g.13"></span>  <a href="#header.accept-ranges" class="smpl">Accept-Ranges</a>     = <a href="#header.accept-ranges" class="smpl">acceptable-ranges</a>
     730  <a href="#header.accept-ranges" class="smpl">acceptable-ranges</a> = 1#<a href="#range.units" class="smpl">range-unit</a> / "none"
     731</pre><p id="rfc.section.2.3.p.3">Origin servers that accept byte-range requests <em class="bcp14">MAY</em> send
     732      </p>
     733      <div id="rfc.figure.u.11"></div><pre class="text">  Accept-Ranges: bytes
     734</pre><p id="rfc.section.2.3.p.5">but are not required to do so. Clients <em class="bcp14">MAY</em> generate range requests without having received this header field for the resource involved. Range units are defined in <a href="#range.units" title="Range Units">Section&nbsp;2</a>.
     735      </p>
     736      <p id="rfc.section.2.3.p.6">Servers that do not accept any kind of range request for a resource <em class="bcp14">MAY</em> send
     737      </p>
     738      <div id="rfc.figure.u.12"></div><pre class="text">  Accept-Ranges: none
     739</pre><p id="rfc.section.2.3.p.8">to advise the client not to attempt a range request.</p>
    728740      <h1 id="rfc.section.3"><a href="#rfc.section.3">3.</a>&nbsp;<a id="range.requests" href="#range.requests">Range Requests</a></h1>
     741      <div id="rfc.iref.r.1"></div>
     742      <h2 id="rfc.section.3.1"><a href="#rfc.section.3.1">3.1</a>&nbsp;<a id="header.range" href="#header.range">Range</a></h2>
     743      <p id="rfc.section.3.1.p.1">The "Range" header field on a GET request modifies the method semantics to request transfer of only one or more sub-ranges
     744         of the selected representation data in a successful response, rather than the entire representation data.
     745      </p>
     746      <div id="rfc.figure.u.13"></div><pre class="inline"><span id="rfc.iref.g.14"></span>  <a href="#header.range" class="smpl">Range</a> = <a href="#rule.ranges-specifier" class="smpl">byte-ranges-specifier</a> / <a href="#header.range" class="smpl">other-ranges-specifier</a>
     747  <a href="#header.range" class="smpl">other-ranges-specifier</a> = <a href="#range.units" class="smpl">other-range-unit</a> "=" <a href="#header.range" class="smpl">other-range-set</a>
     748  <a href="#header.range" class="smpl">other-range-set</a> = 1*<a href="#imported.abnf" class="smpl">CHAR</a>
     749</pre><p id="rfc.section.3.1.p.3">A server <em class="bcp14">MAY</em> ignore the Range header field. However, origin servers and intermediate caches ought to support byte ranges when possible,
     750         since Range supports efficient recovery from partially failed transfers and partial retrieval of large representations. A
     751         server <em class="bcp14">MUST</em> ignore a Range header field received with a request method other than GET.
     752      </p>
     753      <p id="rfc.section.3.1.p.4">An origin server <em class="bcp14">MUST</em> ignore a <a href="#header.range" class="smpl">Range</a> header field that contains a range unit it does not understand. A proxy <em class="bcp14">MAY</em> either discard a <a href="#header.range" class="smpl">Range</a> header field that contains a range unit it does not understand or pass it to the next inbound server when forwarding the request.
     754      </p>
     755      <p id="rfc.section.3.1.p.5">The Range header field is evaluated after evaluating the preconditions of <a href="#Part4" id="rfc.xref.Part4.1"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a> and only if the result of their evaluation is leading toward a <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response. In other words, Range is ignored when a conditional GET would result in a <a href="p4-conditional.html#status.304" class="smpl">304 (Not Modified)</a> response.
     756      </p>
     757      <p id="rfc.section.3.1.p.6">The If-Range header field (<a href="#header.if-range" id="rfc.xref.header.if-range.1" title="If-Range">Section&nbsp;3.2</a>) can be used as a precondition to applying the Range header field.
     758      </p>
     759      <p id="rfc.section.3.1.p.7">If all of the preconditions are true, the server supports the Range header field for the target resource, the specified range(s)
     760         are syntactically correct (as defined in <a href="#byte.ranges" title="Byte Ranges">Section&nbsp;2.1</a>), and at least one of the ranges has a non-empty intersection with the current selected representation extent, then the server <em class="bcp14">MAY</em> respond with a status code of <a href="#status.206" class="smpl">206 (Partial Content)</a> and a payload containing one or more partial representations that correspond to those requested, as defined in <a href="#range.response" title="Responses to a Range Request">Section&nbsp;5</a>.
     761      </p>
     762      <div id="rfc.iref.i.1"></div>
     763      <h2 id="rfc.section.3.2"><a href="#rfc.section.3.2">3.2</a>&nbsp;<a id="header.if-range" href="#header.if-range">If-Range</a></h2>
     764      <p id="rfc.section.3.2.p.1">If a client has a partial copy of a representation and wishes to have an up-to-date copy of the entire representation, it
     765         could use the <a href="#header.range" class="smpl">Range</a> header field with a conditional GET (using either or both of <a href="p4-conditional.html#header.if-unmodified-since" class="smpl">If-Unmodified-Since</a> and <a href="p4-conditional.html#header.if-match" class="smpl">If-Match</a>.) However, if the condition fails because the representation has been modified, the client would then have to make a second
     766         request to obtain the entire current representation.
     767      </p>
     768      <p id="rfc.section.3.2.p.2">The "If-Range" header field allows a client to "short-circuit" the second request. Informally, its meaning is: if the representation
     769         is unchanged, send me the part(s) that I am requesting in Range; otherwise, send me the entire representation.
     770      </p>
     771      <div id="rfc.figure.u.14"></div><pre class="inline"><span id="rfc.iref.g.15"></span>  <a href="#header.if-range" class="smpl">If-Range</a> = <a href="#imported.abnf" class="smpl">entity-tag</a> / <a href="#imported.abnf" class="smpl">HTTP-date</a>
     772</pre><p id="rfc.section.3.2.p.4">Clients <em class="bcp14">MUST NOT</em> use an entity-tag marked as weak in an If-Range field value and <em class="bcp14">MUST NOT</em> use a <a href="p4-conditional.html#header.last-modified" class="smpl">Last-Modified</a> date in an If-Range field value unless it has no entity-tag for the representation and the Last-Modified date it does have
     773         for the representation is strong in the sense defined by <a href="p4-conditional.html#lastmod.comparison" title="Comparison">Section 2.2.2</a> of <a href="#Part4" id="rfc.xref.Part4.2"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>.
     774      </p>
     775      <p id="rfc.section.3.2.p.5">A server that evaluates a conditional range request that is applicable to one of its representations <em class="bcp14">MUST</em> evaluate the condition as false if the entity-tag used as a validator is marked as weak or, when an HTTP-date is used as the
     776         validator, if the date value is not strong in the sense defined by <a href="p4-conditional.html#lastmod.comparison" title="Comparison">Section 2.2.2</a> of <a href="#Part4" id="rfc.xref.Part4.3"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>. (A server can distinguish between a valid HTTP-date and any form of entity-tag by examining the first two characters.)
     777      </p>
     778      <p id="rfc.section.3.2.p.6">The If-Range header field <em class="bcp14">SHOULD</em> only be sent by clients together with a Range header field. The If-Range header field <em class="bcp14">MUST</em> be ignored if it is received in a request that does not include a Range header field. The If-Range header field <em class="bcp14">MUST</em> be ignored by a server that does not support the sub-range operation.
     779      </p>
     780      <p id="rfc.section.3.2.p.7">If the validator given in the If-Range header field matches the current validator for the selected representation of the target
     781         resource, then the server <em class="bcp14">SHOULD</em> send the specified sub-range of the representation using a <a href="#status.206" class="smpl">206 (Partial Content)</a> response. If the validator does not match, then the server <em class="bcp14">SHOULD</em> send the entire representation using a <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response.
     782      </p>
    729783      <h1 id="rfc.section.4"><a href="#rfc.section.4">4.</a>&nbsp;<a id="status.code.definitions" href="#status.code.definitions">Status Code Definitions</a></h1>
    730       <div id="rfc.iref.11"></div>
     784      <div id="rfc.iref.18"></div>
    731785      <h2 id="rfc.section.4.1"><a href="#rfc.section.4.1">4.1</a>&nbsp;<a id="status.206" href="#status.206">206 Partial Content</a></h2>
    732       <p id="rfc.section.4.1.p.1">The <dfn>206 (Partial Content)</dfn> status code indicates that the server has fulfilled the partial GET request for the resource. The request <em class="bcp14">MUST</em> have included a <a href="#header.range" class="smpl">Range</a> header field (<a href="#header.range" id="rfc.xref.header.range.2" title="Range">Section&nbsp;6.4</a>) indicating the desired range, and <em class="bcp14">MAY</em> have included an <a href="#header.if-range" class="smpl">If-Range</a> header field (<a href="#header.if-range" id="rfc.xref.header.if-range.1" title="If-Range">Section&nbsp;6.3</a>) to make the request conditional.
     786      <p id="rfc.section.4.1.p.1">The <dfn>206 (Partial Content)</dfn> status code indicates that the server has fulfilled the partial GET request for the resource. The request <em class="bcp14">MUST</em> have included a <a href="#header.range" class="smpl">Range</a> header field (<a href="#header.range" id="rfc.xref.header.range.2" title="Range">Section&nbsp;3.1</a>) indicating the desired range, and <em class="bcp14">MAY</em> have included an <a href="#header.if-range" class="smpl">If-Range</a> header field (<a href="#header.if-range" id="rfc.xref.header.if-range.2" title="If-Range">Section&nbsp;3.2</a>) to make the request conditional.
    733787      </p>
    734788      <p id="rfc.section.4.1.p.2">When a 206 response is generated, the sender <em class="bcp14">MUST</em> generate the following header fields:
    735789      </p>
    736790      <ul>
    737          <li>Either a <a href="#header.content-range" class="smpl">Content-Range</a> header field (<a href="#header.content-range" id="rfc.xref.header.content-range.2" title="Content-Range">Section&nbsp;6.2</a>) indicating the range included with this response, or a multipart/byteranges <a href="p2-semantics.html#header.content-type" class="smpl">Content-Type</a> including Content-Range fields for each part. If a <a href="p1-messaging.html#header.content-length" class="smpl">Content-Length</a> header field is present in the response, its value <em class="bcp14">MUST</em> match the actual number of octets transmitted in the message body.
     791         <li>Either a <a href="#header.content-range" class="smpl">Content-Range</a> header field (<a href="#header.content-range" id="rfc.xref.header.content-range.2" title="Content-Range">Section&nbsp;5.2</a>) indicating the range included with this response, or a multipart/byteranges <a href="p2-semantics.html#header.content-type" class="smpl">Content-Type</a> including Content-Range fields for each part. If a <a href="p1-messaging.html#header.content-length" class="smpl">Content-Length</a> header field is present in the response, its value <em class="bcp14">MUST</em> match the actual number of octets transmitted in the message body.
    738792         </li>
    739793         <li>Date</li>
     
    745799      <p id="rfc.section.4.1.p.4">Caches <em class="bcp14">MAY</em> use a heuristic (see <a href="p6-cache.html#heuristic.freshness" title="Calculating Heuristic Freshness">Section 4.1.2</a> of <a href="#Part6" id="rfc.xref.Part6.1"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Caching">[Part6]</cite></a>) to determine freshness for 206 responses.
    746800      </p>
    747       <div id="rfc.iref.11"></div>
     801      <div id="rfc.iref.18"></div>
    748802      <h2 id="rfc.section.4.2"><a href="#rfc.section.4.2">4.2</a>&nbsp;<a id="status.416" href="#status.416">416 Range Not Satisfiable</a></h2>
    749       <p id="rfc.section.4.2.p.1">The <dfn>416 (Range Not Satisfiable)</dfn> status code indicates that none of the ranges-specifier values in the request's <a href="#header.range" class="smpl">Range</a> header field (<a href="#header.range" id="rfc.xref.header.range.3" title="Range">Section&nbsp;6.4</a>) overlap the current extent of the selected resource and the request did not include an <a href="#header.if-range" class="smpl">If-Range</a> header field (<a href="#header.if-range" id="rfc.xref.header.if-range.2" title="If-Range">Section&nbsp;6.3</a>). (For byte-ranges, this means that the first-byte-pos of all of the byte-range-spec values were greater than the current
     803      <p id="rfc.section.4.2.p.1">The <dfn>416 (Range Not Satisfiable)</dfn> status code indicates that none of the ranges-specifier values in the request's <a href="#header.range" class="smpl">Range</a> header field (<a href="#header.range" id="rfc.xref.header.range.3" title="Range">Section&nbsp;3.1</a>) overlap the current extent of the selected resource and the request did not include an <a href="#header.if-range" class="smpl">If-Range</a> header field (<a href="#header.if-range" id="rfc.xref.header.if-range.3" title="If-Range">Section&nbsp;3.2</a>). (For byte-ranges, this means that the first-byte-pos of all of the byte-range-spec values were greater than the current
    750804         length of the selected representation.)
    751805      </p>
    752       <p id="rfc.section.4.2.p.2">When this status code is sent in response to a byte-range request, the sender <em class="bcp14">SHOULD</em> generate a <a href="#header.content-range" class="smpl">Content-Range</a> header field specifying the current length of the selected representation (see <a href="#header.content-range" id="rfc.xref.header.content-range.3" title="Content-Range">Section&nbsp;6.2</a>).
    753       </p>
    754       <div id="rfc.figure.u.10"></div>
     806      <p id="rfc.section.4.2.p.2">When this status code is sent in response to a byte-range request, the sender <em class="bcp14">SHOULD</em> generate a <a href="#header.content-range" class="smpl">Content-Range</a> header field specifying the current length of the selected representation (see <a href="#header.content-range" id="rfc.xref.header.content-range.3" title="Content-Range">Section&nbsp;5.2</a>).
     807      </p>
     808      <div id="rfc.figure.u.15"></div>
    755809      <p>For example:</p>  <pre class="text">HTTP/1.1 416 Range Not Satisfiable
    756810Date: Mon, 20 Jan 2012 15:41:54 GMT
     
    768822         a request for a set of ranges that overlap without any holes), this content is transmitted with a <a href="#header.content-range" class="smpl">Content-Range</a> header field, and a <a href="p1-messaging.html#header.content-length" class="smpl">Content-Length</a> header field showing the number of bytes actually transferred. For example,
    769823      </p>
    770       <div id="rfc.figure.u.11"></div><pre class="text">HTTP/1.1 206 Partial Content
     824      <div id="rfc.figure.u.16"></div><pre class="text">HTTP/1.1 206 Partial Content
    771825Date: Wed, 15 Nov 1995 06:25:24 GMT
    772826Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
     
    778832         as defined in <a href="#internet.media.type.multipart.byteranges" title="Internet Media Type multipart/byteranges">Appendix&nbsp;A</a>.
    779833      </p>
    780       <p id="rfc.section.5.1.p.4">A server <em class="bcp14">MAY</em> combine requested ranges when those ranges are overlapping (see <a href="#overlapping.ranges" title="Overlapping Ranges">Section&nbsp;8.1</a>).
     834      <p id="rfc.section.5.1.p.4">A server <em class="bcp14">MAY</em> combine requested ranges when those ranges are overlapping (see <a href="#overlapping.ranges" title="Overlapping Ranges">Section&nbsp;7.1</a>).
    781835      </p>
    782836      <p id="rfc.section.5.1.p.5">A response to a request for a single range <em class="bcp14">MUST NOT</em> be sent using the multipart/byteranges media type. A response to a request for multiple ranges, whose result is a single range, <em class="bcp14">MAY</em> be sent as a multipart/byteranges media type with one part. A client that cannot decode a multipart/byteranges message <em class="bcp14">MUST NOT</em> ask for multiple ranges in a single request.
     
    784838      <p id="rfc.section.5.1.p.6">When a client asks for multiple ranges in one request, the server <em class="bcp14">SHOULD</em> send them in the order that they appeared in the request.
    785839      </p>
    786       <h2 id="rfc.section.5.2"><a href="#rfc.section.5.2">5.2</a>&nbsp;<a id="combining.byte.ranges" href="#combining.byte.ranges">Combining Ranges</a></h2>
    787       <p id="rfc.section.5.2.p.1">A response might transfer only a subrange of a representation if the connection closed prematurely or if the request used
    788          one or more Range specifications. After several such transfers, a client might have received several ranges of the same representation.
    789          These ranges can only be safely combined if they all have in common the same strong validator, where "strong validator" is
    790          defined to be either an entity-tag that is not marked as weak (<a href="p4-conditional.html#header.etag" title="ETag">Section 2.3</a> of <a href="#Part4" id="rfc.xref.Part4.1"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>) or, if no entity-tag is provided, a <a href="p4-conditional.html#header.last-modified" class="smpl">Last-Modified</a> value that is strong in the sense defined by <a href="p4-conditional.html#lastmod.comparison" title="Comparison">Section 2.2.2</a> of <a href="#Part4" id="rfc.xref.Part4.2"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>.
    791       </p>
    792       <p id="rfc.section.5.2.p.2">When a client receives an incomplete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response or a <a href="#status.206" class="smpl">206 (Partial Content)</a> response, and already has one or more partial responses for the same method and effective request URI that have the same strong
    793          validator as present in the new response, the recipient <em class="bcp14">MAY</em> combine some or all of those responses into a set of continuous ranges. A client <em class="bcp14">MUST NOT</em> combine responses that differ in the strong validator or that do not have a strong validator.
    794       </p>
    795       <p id="rfc.section.5.2.p.3">If the new response is an incomplete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response, then the header fields of that new response are used for any combined response and replace those of the matching
    796          stored responses.
    797       </p>
    798       <p id="rfc.section.5.2.p.4">If the new response is a <a href="#status.206" class="smpl">206 (Partial Content)</a> response and at least one of the matching stored responses is a <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a>, then the combined response header fields consist of the most recent 200 response's header fields. If all of the matching
    799          stored responses are 206 responses, then the stored response with the most recent header fields is used as the source of header
    800          fields for the combined response, except that the client <em class="bcp14">MUST</em> use other header fields provided in the new response, aside from <a href="#header.content-range" class="smpl">Content-Range</a>, to replace all instances of the corresponding header fields in the stored response.
    801       </p>
    802       <p id="rfc.section.5.2.p.5">The combined response message body consists of the union of partial content ranges in the new response and each of the selected
    803          responses. If the union consists of the entire range of the representation, then the client <em class="bcp14">MUST</em> record the combined response as if it were a complete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response, including a <a href="p1-messaging.html#header.content-length" class="smpl">Content-Length</a> header field that reflects the complete length. Otherwise, the client <em class="bcp14">MUST</em> record the set of continuous ranges as one of the following: an incomplete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response if the combined response is a prefix of the representation, a single <a href="#status.206" class="smpl">206 (Partial Content)</a> response containing a multipart/byteranges body, or multiple <a href="#status.206" class="smpl">206 (Partial Content)</a> responses, each with one continuous range that is indicated by a <a href="#header.content-range" class="smpl">Content-Range</a> header field.
    804       </p>
    805       <h1 id="rfc.section.6"><a href="#rfc.section.6">6.</a>&nbsp;<a id="header.field.definitions" href="#header.field.definitions">Header Field Definitions</a></h1>
    806       <p id="rfc.section.6.p.1">This section defines the syntax and semantics of HTTP/1.1 header fields related to range requests and partial responses.</p>
    807       <div id="rfc.iref.a.1"></div>
    808       <h2 id="rfc.section.6.1"><a href="#rfc.section.6.1">6.1</a>&nbsp;<a id="header.accept-ranges" href="#header.accept-ranges">Accept-Ranges</a></h2>
    809       <p id="rfc.section.6.1.p.1">The "Accept-Ranges" header field allows a resource to indicate its acceptance of range requests.</p>
    810       <div id="rfc.figure.u.12"></div><pre class="inline"><span id="rfc.iref.g.12"></span><span id="rfc.iref.g.13"></span>  <a href="#header.accept-ranges" class="smpl">Accept-Ranges</a>     = <a href="#header.accept-ranges" class="smpl">acceptable-ranges</a>
    811   <a href="#header.accept-ranges" class="smpl">acceptable-ranges</a> = 1#<a href="#range.units" class="smpl">range-unit</a> / "none"
    812 </pre><p id="rfc.section.6.1.p.3">Origin servers that accept byte-range requests <em class="bcp14">MAY</em> send
    813       </p>
    814       <div id="rfc.figure.u.13"></div><pre class="text">  Accept-Ranges: bytes
    815 </pre><p id="rfc.section.6.1.p.5">but are not required to do so. Clients <em class="bcp14">MAY</em> generate range requests without having received this header field for the resource involved. Range units are defined in <a href="#range.units" title="Range Units">Section&nbsp;2</a>.
    816       </p>
    817       <p id="rfc.section.6.1.p.6">Servers that do not accept any kind of range request for a resource <em class="bcp14">MAY</em> send
    818       </p>
    819       <div id="rfc.figure.u.14"></div><pre class="text">  Accept-Ranges: none
    820 </pre><p id="rfc.section.6.1.p.8">to advise the client not to attempt a range request.</p>
    821840      <div id="rfc.iref.c.1"></div>
    822       <h2 id="rfc.section.6.2"><a href="#rfc.section.6.2">6.2</a>&nbsp;<a id="header.content-range" href="#header.content-range">Content-Range</a></h2>
    823       <p id="rfc.section.6.2.p.1">The "Content-Range" header field is sent with a partial representation to specify where in the full representation the payload
     841      <h2 id="rfc.section.5.2"><a href="#rfc.section.5.2">5.2</a>&nbsp;<a id="header.content-range" href="#header.content-range">Content-Range</a></h2>
     842      <p id="rfc.section.5.2.p.1">The "Content-Range" header field is sent with a partial representation to specify where in the full representation the payload
    824843         body is intended to be applied.
    825844      </p>
    826       <div id="rfc.figure.u.15"></div><pre class="inline"><span id="rfc.iref.g.14"></span><span id="rfc.iref.g.15"></span><span id="rfc.iref.g.16"></span><span id="rfc.iref.g.17"></span><span id="rfc.iref.g.18"></span><span id="rfc.iref.g.19"></span><span id="rfc.iref.g.20"></span><span id="rfc.iref.g.21"></span>  <a href="#header.content-range" class="smpl">Content-Range</a>       = <a href="#header.content-range" class="smpl">byte-content-range</a>
     845      <div id="rfc.figure.u.17"></div><pre class="inline"><span id="rfc.iref.g.16"></span><span id="rfc.iref.g.17"></span><span id="rfc.iref.g.18"></span><span id="rfc.iref.g.19"></span><span id="rfc.iref.g.20"></span><span id="rfc.iref.g.21"></span><span id="rfc.iref.g.22"></span><span id="rfc.iref.g.23"></span>  <a href="#header.content-range" class="smpl">Content-Range</a>       = <a href="#header.content-range" class="smpl">byte-content-range</a>
    827846                      / <a href="#header.content-range" class="smpl">other-content-range</a>
    828847                         
     
    838857  <a href="#header.content-range" class="smpl">other-content-range</a> = <a href="#range.units" class="smpl">other-range-unit</a> <a href="#imported.abnf" class="smpl">SP</a> <a href="#header.content-range" class="smpl">other-range-resp</a>
    839858  <a href="#header.content-range" class="smpl">other-range-resp</a>    = *<a href="#imported.abnf" class="smpl">CHAR</a>
    840 </pre><p id="rfc.section.6.2.p.3">Range units are defined in <a href="#range.units" title="Range Units">Section&nbsp;2</a>. A recipient of a <a href="#status.206" class="smpl">206 (Partial Content)</a> response containing a <a href="#header.content-range" class="smpl">Content-Range</a> header field with a <a href="#range.units" class="smpl">range unit</a> that the recipient does not understand <em class="bcp14">MUST NOT</em> attempt to recombine it with a stored representation. A proxy that receives such a message <em class="bcp14">SHOULD</em> forward it downstream.
    841       </p>
    842       <p id="rfc.section.6.2.p.4">For byte ranges, a sender <em class="bcp14">SHOULD</em> indicate the complete length of the representation from which the range has been extracted unless the complete length is unknown
     859</pre><p id="rfc.section.5.2.p.3">Range units are defined in <a href="#range.units" title="Range Units">Section&nbsp;2</a>. A recipient of a <a href="#status.206" class="smpl">206 (Partial Content)</a> response containing a <a href="#header.content-range" class="smpl">Content-Range</a> header field with a <a href="#range.units" class="smpl">range unit</a> that the recipient does not understand <em class="bcp14">MUST NOT</em> attempt to recombine it with a stored representation. A proxy that receives such a message <em class="bcp14">SHOULD</em> forward it downstream.
     860      </p>
     861      <p id="rfc.section.5.2.p.4">For byte ranges, a sender <em class="bcp14">SHOULD</em> indicate the complete length of the representation from which the range has been extracted unless the complete length is unknown
    843862         or difficult to determine. An asterisk character ("*") in place of the complete-length indicates that the representation length
    844863         was unknown when the header field was generated.
    845864      </p>
    846       <p id="rfc.section.6.2.p.5">A Content-Range field value with a <a href="#header.content-range" class="smpl">byte-range-resp</a> that has a <a href="#rule.ranges-specifier" class="smpl">last-byte-pos</a> value less than its <a href="#rule.ranges-specifier" class="smpl">first-byte-pos</a> value, or a <a href="#header.content-range" class="smpl">complete-length</a> value less than or equal to its <a href="#rule.ranges-specifier" class="smpl">last-byte-pos</a> value, is invalid. The recipient of an invalid <a href="#header.content-range" class="smpl">Content-Range</a>  <em class="bcp14">MUST NOT</em> attempt to recombine the received content with a stored representation.
    847       </p>
    848       <p id="rfc.section.6.2.p.6">A server generating a <a href="#status.206" class="smpl">206 (Partial Content)</a> response to a byte range request <em class="bcp14">MUST</em> send, in each body-part of a multipart response or in the header block of a single part response, a Content-Range header field
     865      <p id="rfc.section.5.2.p.5">A Content-Range field value with a <a href="#header.content-range" class="smpl">byte-range-resp</a> that has a <a href="#rule.ranges-specifier" class="smpl">last-byte-pos</a> value less than its <a href="#rule.ranges-specifier" class="smpl">first-byte-pos</a> value, or a <a href="#header.content-range" class="smpl">complete-length</a> value less than or equal to its <a href="#rule.ranges-specifier" class="smpl">last-byte-pos</a> value, is invalid. The recipient of an invalid <a href="#header.content-range" class="smpl">Content-Range</a>  <em class="bcp14">MUST NOT</em> attempt to recombine the received content with a stored representation.
     866      </p>
     867      <p id="rfc.section.5.2.p.6">A server generating a <a href="#status.206" class="smpl">206 (Partial Content)</a> response to a byte range request <em class="bcp14">MUST</em> send, in each body-part of a multipart response or in the header block of a single part response, a Content-Range header field
    849868         containing a <a href="#header.content-range" class="smpl">byte-range-resp</a> value that reflects the corresponding range being sent. The following example would apply when the complete length of the
    850869         selected representation is known by the sender to be 1234 bytes:
    851870      </p>
    852       <div id="rfc.figure.u.16"></div><pre class="text">  Content-Range: bytes 42-1233/1234
    853 </pre><p id="rfc.section.6.2.p.8">or this second example would apply when the complete length is unknown:</p>
    854       <div id="rfc.figure.u.17"></div><pre class="text">  Content-Range: bytes 42-1233/*
    855 </pre><p id="rfc.section.6.2.p.10">A server generating a <a href="#status.416" class="smpl">416 (Range Not Satisfiable)</a> response to a byte range request <em class="bcp14">SHOULD</em> send a Content-Range header field with an <a href="#header.content-range" class="smpl">unsatisfied-range</a> value, as in the following example:
    856       </p>
    857       <div id="rfc.figure.u.18"></div><pre class="text">  Content-Range: bytes */1234
    858 </pre><p id="rfc.section.6.2.p.12">The complete-length in a 416 response indicates the current length of the selected representation, which will be known by
     871      <div id="rfc.figure.u.18"></div><pre class="text">  Content-Range: bytes 42-1233/1234
     872</pre><p id="rfc.section.5.2.p.8">or this second example would apply when the complete length is unknown:</p>
     873      <div id="rfc.figure.u.19"></div><pre class="text">  Content-Range: bytes 42-1233/*
     874</pre><p id="rfc.section.5.2.p.10">A server generating a <a href="#status.416" class="smpl">416 (Range Not Satisfiable)</a> response to a byte range request <em class="bcp14">SHOULD</em> send a Content-Range header field with an <a href="#header.content-range" class="smpl">unsatisfied-range</a> value, as in the following example:
     875      </p>
     876      <div id="rfc.figure.u.20"></div><pre class="text">  Content-Range: bytes */1234
     877</pre><p id="rfc.section.5.2.p.12">The complete-length in a 416 response indicates the current length of the selected representation, which will be known by
    859878         the server generating the response because that is how it determined the range to be unsatisfiable.
    860879      </p>
    861       <p id="rfc.section.6.2.p.13">The "Content-Range" header field has no meaning for status codes that do not explicitly describe its semantic. For this specification,
     880      <p id="rfc.section.5.2.p.13">The "Content-Range" header field has no meaning for status codes that do not explicitly describe its semantic. For this specification,
    862881         only the <a href="#status.206" class="smpl">206 (Partial Content)</a> and <a href="#status.416" class="smpl">416 (Range Not Satisfiable)</a> status codes describe a meaning for Content-Range.
    863882      </p>
    864       <p id="rfc.section.6.2.p.14">More examples of Content-Range values, assuming that the representation contains a total of 1234 bytes: </p>
     883      <p id="rfc.section.5.2.p.14">More examples of Content-Range values, assuming that the representation contains a total of 1234 bytes: </p>
    865884      <ul>
    866885         <li>The first 500 bytes:
    867             <div id="rfc.figure.u.19"></div><pre class="text">  Content-Range: bytes 0-499/1234
     886            <div id="rfc.figure.u.21"></div><pre class="text">  Content-Range: bytes 0-499/1234
    868887</pre> </li>
    869888         <li>The second 500 bytes:
    870             <div id="rfc.figure.u.20"></div><pre class="text">  Content-Range: bytes 500-999/1234
     889            <div id="rfc.figure.u.22"></div><pre class="text">  Content-Range: bytes 500-999/1234
    871890</pre> </li>
    872891         <li>All except for the first 500 bytes:
    873             <div id="rfc.figure.u.21"></div><pre class="text">  Content-Range: bytes 500-1233/1234
     892            <div id="rfc.figure.u.23"></div><pre class="text">  Content-Range: bytes 500-1233/1234
    874893</pre> </li>
    875894         <li>The last 500 bytes:
    876             <div id="rfc.figure.u.22"></div><pre class="text">  Content-Range: bytes 734-1233/1234
     895            <div id="rfc.figure.u.24"></div><pre class="text">  Content-Range: bytes 734-1233/1234
    877896</pre> </li>
    878897      </ul>
    879       <div id="rfc.iref.i.1"></div>
    880       <h2 id="rfc.section.6.3"><a href="#rfc.section.6.3">6.3</a>&nbsp;<a id="header.if-range" href="#header.if-range">If-Range</a></h2>
    881       <p id="rfc.section.6.3.p.1">If a client has a partial copy of a representation and wishes to have an up-to-date copy of the entire representation, it
    882          could use the <a href="#header.range" class="smpl">Range</a> header field with a conditional GET (using either or both of <a href="p4-conditional.html#header.if-unmodified-since" class="smpl">If-Unmodified-Since</a> and <a href="p4-conditional.html#header.if-match" class="smpl">If-Match</a>.) However, if the condition fails because the representation has been modified, the client would then have to make a second
    883          request to obtain the entire current representation.
    884       </p>
    885       <p id="rfc.section.6.3.p.2">The "If-Range" header field allows a client to "short-circuit" the second request. Informally, its meaning is: if the representation
    886          is unchanged, send me the part(s) that I am requesting in Range; otherwise, send me the entire representation.
    887       </p>
    888       <div id="rfc.figure.u.23"></div><pre class="inline"><span id="rfc.iref.g.22"></span>  <a href="#header.if-range" class="smpl">If-Range</a> = <a href="#imported.abnf" class="smpl">entity-tag</a> / <a href="#imported.abnf" class="smpl">HTTP-date</a>
    889 </pre><p id="rfc.section.6.3.p.4">Clients <em class="bcp14">MUST NOT</em> use an entity-tag marked as weak in an If-Range field value and <em class="bcp14">MUST NOT</em> use a <a href="p4-conditional.html#header.last-modified" class="smpl">Last-Modified</a> date in an If-Range field value unless it has no entity-tag for the representation and the Last-Modified date it does have
    890          for the representation is strong in the sense defined by <a href="p4-conditional.html#lastmod.comparison" title="Comparison">Section 2.2.2</a> of <a href="#Part4" id="rfc.xref.Part4.3"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>.
    891       </p>
    892       <p id="rfc.section.6.3.p.5">A server that evaluates a conditional range request that is applicable to one of its representations <em class="bcp14">MUST</em> evaluate the condition as false if the entity-tag used as a validator is marked as weak or, when an HTTP-date is used as the
    893          validator, if the date value is not strong in the sense defined by <a href="p4-conditional.html#lastmod.comparison" title="Comparison">Section 2.2.2</a> of <a href="#Part4" id="rfc.xref.Part4.4"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>. (A server can distinguish between a valid HTTP-date and any form of entity-tag by examining the first two characters.)
    894       </p>
    895       <p id="rfc.section.6.3.p.6">The If-Range header field <em class="bcp14">SHOULD</em> only be sent by clients together with a Range header field. The If-Range header field <em class="bcp14">MUST</em> be ignored if it is received in a request that does not include a Range header field. The If-Range header field <em class="bcp14">MUST</em> be ignored by a server that does not support the sub-range operation.
    896       </p>
    897       <p id="rfc.section.6.3.p.7">If the validator given in the If-Range header field matches the current validator for the selected representation of the target
    898          resource, then the server <em class="bcp14">SHOULD</em> send the specified sub-range of the representation using a <a href="#status.206" class="smpl">206 (Partial Content)</a> response. If the validator does not match, then the server <em class="bcp14">SHOULD</em> send the entire representation using a <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response.
    899       </p>
    900       <div id="rfc.iref.r.1"></div>
    901       <h2 id="rfc.section.6.4"><a href="#rfc.section.6.4">6.4</a>&nbsp;<a id="header.range" href="#header.range">Range</a></h2>
    902       <p id="rfc.section.6.4.p.1">The "Range" header field on a GET request modifies the method semantics to request transfer of only one or more sub-ranges
    903          of the selected representation data in a successful response, rather than the entire representation data.
    904       </p>
    905       <div id="rfc.figure.u.24"></div><pre class="inline"><span id="rfc.iref.g.23"></span>  <a href="#header.range" class="smpl">Range</a> = <a href="#rule.ranges-specifier" class="smpl">byte-ranges-specifier</a> / <a href="#header.range" class="smpl">other-ranges-specifier</a>
    906   <a href="#header.range" class="smpl">other-ranges-specifier</a> = <a href="#range.units" class="smpl">other-range-unit</a> "=" <a href="#header.range" class="smpl">other-range-set</a>
    907   <a href="#header.range" class="smpl">other-range-set</a> = 1*<a href="#imported.abnf" class="smpl">CHAR</a>
    908 </pre><p id="rfc.section.6.4.p.3">A server <em class="bcp14">MAY</em> ignore the Range header field. However, origin servers and intermediate caches ought to support byte ranges when possible,
    909          since Range supports efficient recovery from partially failed transfers and partial retrieval of large representations. A
    910          server <em class="bcp14">MUST</em> ignore a Range header field received with a request method other than GET.
    911       </p>
    912       <p id="rfc.section.6.4.p.4">An origin server <em class="bcp14">MUST</em> ignore a <a href="#header.range" class="smpl">Range</a> header field that contains a range unit it does not understand. A proxy <em class="bcp14">MAY</em> either discard a <a href="#header.range" class="smpl">Range</a> header field that contains a range unit it does not understand or pass it to the next inbound server when forwarding the request.
    913       </p>
    914       <p id="rfc.section.6.4.p.5">The Range header field is evaluated after evaluating the preconditions of <a href="#Part4" id="rfc.xref.Part4.5"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a> and only if the result of their evaluation is leading toward a <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response. In other words, Range is ignored when a conditional GET would result in a <a href="p4-conditional.html#status.304" class="smpl">304 (Not Modified)</a> response.
    915       </p>
    916       <p id="rfc.section.6.4.p.6">The If-Range header field (<a href="#header.if-range" id="rfc.xref.header.if-range.3" title="If-Range">Section&nbsp;6.3</a>) can be used as a precondition to applying the Range header field.
    917       </p>
    918       <p id="rfc.section.6.4.p.7">If all of the preconditions are true, the server supports the Range header field for the target resource, the specified range(s)
    919          are syntactically correct (as defined in <a href="#byte.ranges" title="Byte Ranges">Section&nbsp;2.1</a>), and at least one of the ranges has a non-empty intersection with the current selected representation extent, then the server <em class="bcp14">MAY</em> respond with a status code of <a href="#status.206" class="smpl">206 (Partial Content)</a> and a payload containing one or more partial representations that correspond to those requested, as defined in <a href="#range.response" title="Responses to a Range Request">Section&nbsp;5</a>.
    920       </p>
    921       <h1 id="rfc.section.7"><a href="#rfc.section.7">7.</a>&nbsp;<a id="IANA.considerations" href="#IANA.considerations">IANA Considerations</a></h1>
    922       <h2 id="rfc.section.7.1"><a href="#rfc.section.7.1">7.1</a>&nbsp;<a id="range.unit.registry" href="#range.unit.registry">Range Unit Registry</a></h2>
    923       <p id="rfc.section.7.1.p.1">The HTTP Range Unit Registry defines the name space for the range unit names and refers to their corresponding specifications.
     898      <h2 id="rfc.section.5.3"><a href="#rfc.section.5.3">5.3</a>&nbsp;<a id="combining.byte.ranges" href="#combining.byte.ranges">Combining Ranges</a></h2>
     899      <p id="rfc.section.5.3.p.1">A response might transfer only a subrange of a representation if the connection closed prematurely or if the request used
     900         one or more Range specifications. After several such transfers, a client might have received several ranges of the same representation.
     901         These ranges can only be safely combined if they all have in common the same strong validator, where "strong validator" is
     902         defined to be either an entity-tag that is not marked as weak (<a href="p4-conditional.html#header.etag" title="ETag">Section 2.3</a> of <a href="#Part4" id="rfc.xref.Part4.4"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>) or, if no entity-tag is provided, a <a href="p4-conditional.html#header.last-modified" class="smpl">Last-Modified</a> value that is strong in the sense defined by <a href="p4-conditional.html#lastmod.comparison" title="Comparison">Section 2.2.2</a> of <a href="#Part4" id="rfc.xref.Part4.5"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[Part4]</cite></a>.
     903      </p>
     904      <p id="rfc.section.5.3.p.2">When a client receives an incomplete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response or a <a href="#status.206" class="smpl">206 (Partial Content)</a> response, and already has one or more partial responses for the same method and effective request URI that have the same strong
     905         validator as present in the new response, the recipient <em class="bcp14">MAY</em> combine some or all of those responses into a set of continuous ranges. A client <em class="bcp14">MUST NOT</em> combine responses that differ in the strong validator or that do not have a strong validator.
     906      </p>
     907      <p id="rfc.section.5.3.p.3">If the new response is an incomplete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response, then the header fields of that new response are used for any combined response and replace those of the matching
     908         stored responses.
     909      </p>
     910      <p id="rfc.section.5.3.p.4">If the new response is a <a href="#status.206" class="smpl">206 (Partial Content)</a> response and at least one of the matching stored responses is a <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a>, then the combined response header fields consist of the most recent 200 response's header fields. If all of the matching
     911         stored responses are 206 responses, then the stored response with the most recent header fields is used as the source of header
     912         fields for the combined response, except that the client <em class="bcp14">MUST</em> use other header fields provided in the new response, aside from <a href="#header.content-range" class="smpl">Content-Range</a>, to replace all instances of the corresponding header fields in the stored response.
     913      </p>
     914      <p id="rfc.section.5.3.p.5">The combined response message body consists of the union of partial content ranges in the new response and each of the selected
     915         responses. If the union consists of the entire range of the representation, then the client <em class="bcp14">MUST</em> record the combined response as if it were a complete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response, including a <a href="p1-messaging.html#header.content-length" class="smpl">Content-Length</a> header field that reflects the complete length. Otherwise, the client <em class="bcp14">MUST</em> record the set of continuous ranges as one of the following: an incomplete <a href="p2-semantics.html#status.200" class="smpl">200 (OK)</a> response if the combined response is a prefix of the representation, a single <a href="#status.206" class="smpl">206 (Partial Content)</a> response containing a multipart/byteranges body, or multiple <a href="#status.206" class="smpl">206 (Partial Content)</a> responses, each with one continuous range that is indicated by a <a href="#header.content-range" class="smpl">Content-Range</a> header field.
     916      </p>
     917      <h1 id="rfc.section.6"><a href="#rfc.section.6">6.</a>&nbsp;<a id="IANA.considerations" href="#IANA.considerations">IANA Considerations</a></h1>
     918      <h2 id="rfc.section.6.1"><a href="#rfc.section.6.1">6.1</a>&nbsp;<a id="range.unit.registry" href="#range.unit.registry">Range Unit Registry</a></h2>
     919      <p id="rfc.section.6.1.p.1">The HTTP Range Unit Registry defines the name space for the range unit names and refers to their corresponding specifications.
    924920         The registry is maintained at &lt;<a href="http://www.iana.org/assignments/http-range-specifiers">http://www.iana.org/assignments/http-range-specifiers</a>&gt;.
    925921      </p>
    926       <h3 id="rfc.section.7.1.1"><a href="#rfc.section.7.1.1">7.1.1</a>&nbsp;<a id="range.unit.registry.procedure" href="#range.unit.registry.procedure">Procedure</a></h3>
    927       <p id="rfc.section.7.1.1.p.1">Registration of an HTTP Range Unit <em class="bcp14">MUST</em> include the following fields:
     922      <h3 id="rfc.section.6.1.1"><a href="#rfc.section.6.1.1">6.1.1</a>&nbsp;<a id="range.unit.registry.procedure" href="#range.unit.registry.procedure">Procedure</a></h3>
     923      <p id="rfc.section.6.1.1.p.1">Registration of an HTTP Range Unit <em class="bcp14">MUST</em> include the following fields:
    928924      </p>
    929925      <ul>
     
    932928         <li>Pointer to specification text</li>
    933929      </ul>
    934       <p id="rfc.section.7.1.1.p.2">Values to be added to this name space require IETF Review (see <a href="#RFC5226" id="rfc.xref.RFC5226.1"><cite title="Guidelines for Writing an IANA Considerations Section in RFCs">[RFC5226]</cite></a>, <a href="http://tools.ietf.org/html/rfc5226#section-4.1">Section 4.1</a>).
    935       </p>
    936       <h3 id="rfc.section.7.1.2"><a href="#rfc.section.7.1.2">7.1.2</a>&nbsp;<a id="range.unit.registration" href="#range.unit.registration">Registrations</a></h3>
    937       <p id="rfc.section.7.1.2.p.1">The initial HTTP Range Unit Registry shall contain the registrations below:</p>
     930      <p id="rfc.section.6.1.1.p.2">Values to be added to this name space require IETF Review (see <a href="#RFC5226" id="rfc.xref.RFC5226.1"><cite title="Guidelines for Writing an IANA Considerations Section in RFCs">[RFC5226]</cite></a>, <a href="http://tools.ietf.org/html/rfc5226#section-4.1">Section 4.1</a>).
     931      </p>
     932      <h3 id="rfc.section.6.1.2"><a href="#rfc.section.6.1.2">6.1.2</a>&nbsp;<a id="range.unit.registration" href="#range.unit.registration">Registrations</a></h3>
     933      <p id="rfc.section.6.1.2.p.1">The initial HTTP Range Unit Registry shall contain the registrations below:</p>
    938934      <div id="rfc.table.1">
    939935         <div id="iana.range.units.table"></div>
     
    955951                  <td class="left">none</td>
    956952                  <td class="left">reserved as keyword, indicating no ranges are supported</td>
    957                   <td class="left"><a href="#header.accept-ranges" id="rfc.xref.header.accept-ranges.1" title="Accept-Ranges">Section&nbsp;6.1</a></td>
     953                  <td class="left"><a href="#header.accept-ranges" id="rfc.xref.header.accept-ranges.1" title="Accept-Ranges">Section&nbsp;2.3</a></td>
    958954               </tr>
    959955            </tbody>
    960956         </table>
    961957      </div>
    962       <p id="rfc.section.7.1.2.p.2">The change controller is: "IETF (iesg@ietf.org) - Internet Engineering Task Force".</p>
    963       <h2 id="rfc.section.7.2"><a href="#rfc.section.7.2">7.2</a>&nbsp;<a id="status.code.registration" href="#status.code.registration">Status Code Registration</a></h2>
    964       <p id="rfc.section.7.2.p.1">The HTTP Status Code Registry located at &lt;<a href="http://www.iana.org/assignments/http-status-codes">http://www.iana.org/assignments/http-status-codes</a>&gt; shall be updated with the registrations below:
     958      <p id="rfc.section.6.1.2.p.2">The change controller is: "IETF (iesg@ietf.org) - Internet Engineering Task Force".</p>
     959      <h2 id="rfc.section.6.2"><a href="#rfc.section.6.2">6.2</a>&nbsp;<a id="status.code.registration" href="#status.code.registration">Status Code Registration</a></h2>
     960      <p id="rfc.section.6.2.p.1">The HTTP Status Code Registry located at &lt;<a href="http://www.iana.org/assignments/http-status-codes">http://www.iana.org/assignments/http-status-codes</a>&gt; shall be updated with the registrations below:
    965961      </p>
    966962      <div id="rfc.table.2">
     
    990986         </table>
    991987      </div>
    992       <h2 id="rfc.section.7.3"><a href="#rfc.section.7.3">7.3</a>&nbsp;<a id="header.field.registration" href="#header.field.registration">Header Field Registration</a></h2>
    993       <p id="rfc.section.7.3.p.1">The Message Header Field Registry located at &lt;<a href="http://www.iana.org/assignments/message-headers/message-header-index.html">http://www.iana.org/assignments/message-headers/message-header-index.html</a>&gt; shall be updated with the permanent registrations below (see <a href="#BCP90" id="rfc.xref.BCP90.1"><cite title="Registration Procedures for Message Header Fields">[BCP90]</cite></a>):
     988      <h2 id="rfc.section.6.3"><a href="#rfc.section.6.3">6.3</a>&nbsp;<a id="header.field.registration" href="#header.field.registration">Header Field Registration</a></h2>
     989      <p id="rfc.section.6.3.p.1">The Message Header Field Registry located at &lt;<a href="http://www.iana.org/assignments/message-headers/message-header-index.html">http://www.iana.org/assignments/message-headers/message-header-index.html</a>&gt; shall be updated with the permanent registrations below (see <a href="#BCP90" id="rfc.xref.BCP90.1"><cite title="Registration Procedures for Message Header Fields">[BCP90]</cite></a>):
    994990      </p>
    995991      <div id="rfc.table.3">
     
    10091005                  <td class="left">http</td>
    10101006                  <td class="left">standard</td>
    1011                   <td class="left"> <a href="#header.accept-ranges" id="rfc.xref.header.accept-ranges.2" title="Accept-Ranges">Section&nbsp;6.1</a>
     1007                  <td class="left"> <a href="#header.accept-ranges" id="rfc.xref.header.accept-ranges.2" title="Accept-Ranges">Section&nbsp;2.3</a>
    10121008                  </td>
    10131009               </tr>
     
    10161012                  <td class="left">http</td>
    10171013                  <td class="left">standard</td>
    1018                   <td class="left"> <a href="#header.content-range" id="rfc.xref.header.content-range.4" title="Content-Range">Section&nbsp;6.2</a>
     1014                  <td class="left"> <a href="#header.content-range" id="rfc.xref.header.content-range.4" title="Content-Range">Section&nbsp;5.2</a>
    10191015                  </td>
    10201016               </tr>
     
    10231019                  <td class="left">http</td>
    10241020                  <td class="left">standard</td>
    1025                   <td class="left"> <a href="#header.if-range" id="rfc.xref.header.if-range.4" title="If-Range">Section&nbsp;6.3</a>
     1021                  <td class="left"> <a href="#header.if-range" id="rfc.xref.header.if-range.4" title="If-Range">Section&nbsp;3.2</a>
    10261022                  </td>
    10271023               </tr>
     
    10301026                  <td class="left">http</td>
    10311027                  <td class="left">standard</td>
    1032                   <td class="left"> <a href="#header.range" id="rfc.xref.header.range.4" title="Range">Section&nbsp;6.4</a>
     1028                  <td class="left"> <a href="#header.range" id="rfc.xref.header.range.4" title="Range">Section&nbsp;3.1</a>
    10331029                  </td>
    10341030               </tr>
     
    10361032         </table>
    10371033      </div>
    1038       <p id="rfc.section.7.3.p.2">The change controller is: "IETF (iesg@ietf.org) - Internet Engineering Task Force".</p>
    1039       <h1 id="rfc.section.8"><a href="#rfc.section.8">8.</a>&nbsp;<a id="security.considerations" href="#security.considerations">Security Considerations</a></h1>
    1040       <p id="rfc.section.8.p.1">This section is meant to inform developers, information providers, and users of known security concerns specific to the HTTP/1.1
     1034      <p id="rfc.section.6.3.p.2">The change controller is: "IETF (iesg@ietf.org) - Internet Engineering Task Force".</p>
     1035      <h1 id="rfc.section.7"><a href="#rfc.section.7">7.</a>&nbsp;<a id="security.considerations" href="#security.considerations">Security Considerations</a></h1>
     1036      <p id="rfc.section.7.p.1">This section is meant to inform developers, information providers, and users of known security concerns specific to the HTTP/1.1
    10411037         range request mechanisms. More general security considerations are addressed in HTTP messaging <a href="#Part1" id="rfc.xref.Part1.3"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing">[Part1]</cite></a> and semantics <a href="#Part2" id="rfc.xref.Part2.1"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content">[Part2]</cite></a>.
    10421038      </p>
    1043       <h2 id="rfc.section.8.1"><a href="#rfc.section.8.1">8.1</a>&nbsp;<a id="overlapping.ranges" href="#overlapping.ranges">Overlapping Ranges</a></h2>
    1044       <p id="rfc.section.8.1.p.1">Range requests containing overlapping ranges can lead to a situation where the server is sending far more data than the size
     1039      <h2 id="rfc.section.7.1"><a href="#rfc.section.7.1">7.1</a>&nbsp;<a id="overlapping.ranges" href="#overlapping.ranges">Overlapping Ranges</a></h2>
     1040      <p id="rfc.section.7.1.p.1">Range requests containing overlapping ranges can lead to a situation where the server is sending far more data than the size
    10451041         of the complete resource representation.
    10461042      </p>
    1047       <h1 id="rfc.section.9"><a href="#rfc.section.9">9.</a>&nbsp;<a id="acks" href="#acks">Acknowledgments</a></h1>
    1048       <p id="rfc.section.9.p.1">See <a href="p1-messaging.html#acks" title="Acknowledgments">Section 9</a> of <a href="#Part1" id="rfc.xref.Part1.4"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing">[Part1]</cite></a>.
    1049       </p>
    1050       <h1 id="rfc.references"><a id="rfc.section.10" href="#rfc.section.10">10.</a> References
     1043      <h1 id="rfc.section.8"><a href="#rfc.section.8">8.</a>&nbsp;<a id="acks" href="#acks">Acknowledgments</a></h1>
     1044      <p id="rfc.section.8.p.1">See <a href="p1-messaging.html#acks" title="Acknowledgments">Section 9</a> of <a href="#Part1" id="rfc.xref.Part1.4"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing">[Part1]</cite></a>.
     1045      </p>
     1046      <h1 id="rfc.references"><a id="rfc.section.9" href="#rfc.section.9">9.</a> References
    10511047      </h1>
    1052       <h2 id="rfc.references.1"><a href="#rfc.section.10.1" id="rfc.section.10.1">10.1</a> Normative References
     1048      <h2 id="rfc.references.1"><a href="#rfc.section.9.1" id="rfc.section.9.1">9.1</a> Normative References
    10531049      </h2>
    10541050      <table>             
     
    10891085         </tr>
    10901086      </table>
    1091       <h2 id="rfc.references.2"><a href="#rfc.section.10.2" id="rfc.section.10.2">10.2</a> Informative References
     1087      <h2 id="rfc.references.2"><a href="#rfc.section.9.2" id="rfc.section.9.2">9.2</a> Informative References
    10921088      </h2>
    10931089      <table>       
     
    12261222      <p id="rfc.section.B.p.1">A weak validator cannot be used in a <a href="#status.206" class="smpl">206</a> response. (<a href="#status.206" id="rfc.xref.status.206.2" title="206 Partial Content">Section&nbsp;4.1</a>)
    12271223      </p>
    1228       <p id="rfc.section.B.p.2">The Content-Range header field only has meaning when the status code explicitly defines its use. (<a href="#header.content-range" id="rfc.xref.header.content-range.5" title="Content-Range">Section&nbsp;6.2</a>)
     1224      <p id="rfc.section.B.p.2">The Content-Range header field only has meaning when the status code explicitly defines its use. (<a href="#header.content-range" id="rfc.xref.header.content-range.5" title="Content-Range">Section&nbsp;5.2</a>)
    12291225      </p>
    12301226      <p id="rfc.section.B.p.3">Servers are given more leeway in how they respond to a range request, in order to mitigate abuse by malicious (or just greedy)
     
    12331229      <p id="rfc.section.B.p.4">multipart/byteranges can consist of a single part. (<a href="#internet.media.type.multipart.byteranges" title="Internet Media Type multipart/byteranges">Appendix&nbsp;A</a>)
    12341230      </p>
    1235       <p id="rfc.section.B.p.5">This specification introduces a Range Specifier Registry. (<a href="#range.unit.registry" title="Range Unit Registry">Section&nbsp;7.1</a>)
     1231      <p id="rfc.section.B.p.5">This specification introduces a Range Specifier Registry. (<a href="#range.unit.registry" title="Range Unit Registry">Section&nbsp;6.1</a>)
    12361232      </p>
    12371233      <h1 id="rfc.section.C"><a href="#rfc.section.C">C.</a>&nbsp;<a id="imported.abnf" href="#imported.abnf">Imported ABNF</a></h1>
     
    13281324         <ul class="ind">
    13291325            <li><a id="rfc.index.2" href="#rfc.index.2"><b>2</b></a><ul>
    1330                   <li>206 Partial Content (status code)&nbsp;&nbsp;<a href="#rfc.iref.11"><b>4.1</b></a>, <a href="#rfc.xref.status.206.1">7.2</a>, <a href="#rfc.xref.status.206.2">B</a></li>
     1326                  <li>206 Partial Content (status code)&nbsp;&nbsp;<a href="#rfc.iref.18"><b>4.1</b></a>, <a href="#rfc.xref.status.206.1">6.2</a>, <a href="#rfc.xref.status.206.2">B</a></li>
    13311327               </ul>
    13321328            </li>
    13331329            <li><a id="rfc.index.4" href="#rfc.index.4"><b>4</b></a><ul>
    1334                   <li>416 Range Not Satisfiable (status code)&nbsp;&nbsp;<a href="#rfc.iref.11"><b>4.2</b></a>, <a href="#rfc.xref.status.416.1">7.2</a></li>
     1330                  <li>416 Range Not Satisfiable (status code)&nbsp;&nbsp;<a href="#rfc.iref.18"><b>4.2</b></a>, <a href="#rfc.xref.status.416.1">6.2</a></li>
    13351331               </ul>
    13361332            </li>
    13371333            <li><a id="rfc.index.A" href="#rfc.index.A"><b>A</b></a><ul>
    1338                   <li>Accept-Ranges header field&nbsp;&nbsp;<a href="#rfc.iref.a.1"><b>6.1</b></a>, <a href="#rfc.xref.header.accept-ranges.1">7.1.2</a>, <a href="#rfc.xref.header.accept-ranges.2">7.3</a></li>
     1334                  <li>Accept-Ranges header field&nbsp;&nbsp;<a href="#rfc.iref.a.1"><b>2.3</b></a>, <a href="#rfc.xref.header.accept-ranges.1">6.1.2</a>, <a href="#rfc.xref.header.accept-ranges.2">6.3</a></li>
    13391335               </ul>
    13401336            </li>
    13411337            <li><a id="rfc.index.B" href="#rfc.index.B"><b>B</b></a><ul>
    1342                   <li><em>BCP13</em>&nbsp;&nbsp;<a href="#BCP13"><b>10.2</b></a>, <a href="#rfc.xref.BCP13.1">A</a></li>
    1343                   <li><em>BCP90</em>&nbsp;&nbsp;<a href="#rfc.xref.BCP90.1">7.3</a>, <a href="#BCP90"><b>10.2</b></a></li>
     1338                  <li><em>BCP13</em>&nbsp;&nbsp;<a href="#BCP13"><b>9.2</b></a>, <a href="#rfc.xref.BCP13.1">A</a></li>
     1339                  <li><em>BCP90</em>&nbsp;&nbsp;<a href="#rfc.xref.BCP90.1">6.3</a>, <a href="#BCP90"><b>9.2</b></a></li>
    13441340               </ul>
    13451341            </li>
    13461342            <li><a id="rfc.index.C" href="#rfc.index.C"><b>C</b></a><ul>
    1347                   <li>Content-Range header field&nbsp;&nbsp;<a href="#rfc.xref.header.content-range.1">2</a>, <a href="#rfc.xref.header.content-range.2">4.1</a>, <a href="#rfc.xref.header.content-range.3">4.2</a>, <a href="#rfc.iref.c.1"><b>6.2</b></a>, <a href="#rfc.xref.header.content-range.4">7.3</a>, <a href="#rfc.xref.header.content-range.5">B</a></li>
     1343                  <li>Content-Range header field&nbsp;&nbsp;<a href="#rfc.xref.header.content-range.1">2</a>, <a href="#rfc.xref.header.content-range.2">4.1</a>, <a href="#rfc.xref.header.content-range.3">4.2</a>, <a href="#rfc.iref.c.1"><b>5.2</b></a>, <a href="#rfc.xref.header.content-range.4">6.3</a>, <a href="#rfc.xref.header.content-range.5">B</a></li>
    13481344               </ul>
    13491345            </li>
     
    13511347                  <li><tt>Grammar</tt>&nbsp;&nbsp;
    13521348                     <ul>
    1353                         <li><tt>Accept-Ranges</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.12"><b>6.1</b></a></li>
    1354                         <li><tt>acceptable-ranges</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.13"><b>6.1</b></a></li>
    1355                         <li><tt>byte-content-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.15"><b>6.2</b></a></li>
    1356                         <li><tt>byte-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.17"><b>6.2</b></a></li>
    1357                         <li><tt>byte-range-resp</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.16"><b>6.2</b></a></li>
     1349                        <li><tt>Accept-Ranges</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.12"><b>2.3</b></a></li>
     1350                        <li><tt>acceptable-ranges</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.13"><b>2.3</b></a></li>
     1351                        <li><tt>byte-content-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.17"><b>5.2</b></a></li>
     1352                        <li><tt>byte-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.19"><b>5.2</b></a></li>
     1353                        <li><tt>byte-range-resp</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.18"><b>5.2</b></a></li>
    13581354                        <li><tt>byte-range-set</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.6"><b>2.1</b></a></li>
    13591355                        <li><tt>byte-range-spec</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.7"><b>2.1</b></a></li>
    13601356                        <li><tt>byte-ranges-specifier</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.5"><b>2.1</b></a></li>
    13611357                        <li><tt>bytes-unit</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.2"><b>2</b></a></li>
    1362                         <li><tt>complete-length</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.21"><b>6.2</b></a></li>
    1363                         <li><tt>Content-Range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.14"><b>6.2</b></a></li>
     1358                        <li><tt>complete-length</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.23"><b>5.2</b></a></li>
     1359                        <li><tt>Content-Range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.16"><b>5.2</b></a></li>
    13641360                        <li><tt>first-byte-pos</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.8"><b>2.1</b></a></li>
    1365                         <li><tt>If-Range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.22"><b>6.3</b></a></li>
     1361                        <li><tt>If-Range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.15"><b>3.2</b></a></li>
    13661362                        <li><tt>last-byte-pos</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.9"><b>2.1</b></a></li>
    1367                         <li><tt>other-content-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.19"><b>6.2</b></a></li>
    1368                         <li><tt>other-range-resp</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.20"><b>6.2</b></a></li>
     1363                        <li><tt>other-content-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.21"><b>5.2</b></a></li>
     1364                        <li><tt>other-range-resp</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.22"><b>5.2</b></a></li>
    13691365                        <li><tt>other-range-unit</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.3"><b>2</b></a></li>
    1370                         <li><tt>Range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.23"><b>6.4</b></a></li>
     1366                        <li><tt>Range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.14"><b>3.1</b></a></li>
    13711367                        <li><tt>range-unit</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.1"><b>2</b></a></li>
    13721368                        <li><tt>ranges-specifier</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.4"><b>2.1</b></a></li>
    13731369                        <li><tt>suffix-byte-range-spec</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.10"><b>2.1</b></a></li>
    13741370                        <li><tt>suffix-length</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.11"><b>2.1</b></a></li>
    1375                         <li><tt>unsatisfied-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.18"><b>6.2</b></a></li>
     1371                        <li><tt>unsatisfied-range</tt>&nbsp;&nbsp;<a href="#rfc.iref.g.20"><b>5.2</b></a></li>
    13761372                     </ul>
    13771373                  </li>
     
    13791375            </li>
    13801376            <li><a id="rfc.index.I" href="#rfc.index.I"><b>I</b></a><ul>
    1381                   <li>If-Range header field&nbsp;&nbsp;<a href="#rfc.xref.header.if-range.1">4.1</a>, <a href="#rfc.xref.header.if-range.2">4.2</a>, <a href="#rfc.iref.i.1"><b>6.3</b></a>, <a href="#rfc.xref.header.if-range.3">6.4</a>, <a href="#rfc.xref.header.if-range.4">7.3</a></li>
     1377                  <li>If-Range header field&nbsp;&nbsp;<a href="#rfc.xref.header.if-range.1">3.1</a>, <a href="#rfc.iref.i.1"><b>3.2</b></a>, <a href="#rfc.xref.header.if-range.2">4.1</a>, <a href="#rfc.xref.header.if-range.3">4.2</a>, <a href="#rfc.xref.header.if-range.4">6.3</a></li>
    13821378               </ul>
    13831379            </li>
     
    13941390            </li>
    13951391            <li><a id="rfc.index.P" href="#rfc.index.P"><b>P</b></a><ul>
    1396                   <li><em>Part1</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.1">1.1</a>, <a href="#rfc.xref.Part1.2">1.2</a>, <a href="#rfc.xref.Part1.3">8</a>, <a href="#rfc.xref.Part1.4">9</a>, <a href="#Part1"><b>10.1</b></a>, <a href="#rfc.xref.Part1.5">C</a>, <a href="#rfc.xref.Part1.6">C</a>, <a href="#rfc.xref.Part1.7">C</a><ul>
     1392                  <li><em>Part1</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.1">1.1</a>, <a href="#rfc.xref.Part1.2">1.2</a>, <a href="#rfc.xref.Part1.3">7</a>, <a href="#rfc.xref.Part1.4">8</a>, <a href="#Part1"><b>9.1</b></a>, <a href="#rfc.xref.Part1.5">C</a>, <a href="#rfc.xref.Part1.6">C</a>, <a href="#rfc.xref.Part1.7">C</a><ul>
    13971393                        <li><em>Section 1.2</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.2">1.2</a></li>
    13981394                        <li><em>Section 2.5</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.1">1.1</a></li>
    13991395                        <li><em>Section 3.2.3</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.6">C</a></li>
    14001396                        <li><em>Section 3.2.6</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.7">C</a></li>
    1401                         <li><em>Section 9</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.4">9</a></li>
     1397                        <li><em>Section 9</em>&nbsp;&nbsp;<a href="#rfc.xref.Part1.4">8</a></li>
    14021398                     </ul>
    14031399                  </li>
    1404                   <li><em>Part2</em>&nbsp;&nbsp;<a href="#rfc.xref.Part2.1">8</a>, <a href="#Part2"><b>10.1</b></a>, <a href="#rfc.xref.Part2.2">C</a><ul>
     1400                  <li><em>Part2</em>&nbsp;&nbsp;<a href="#rfc.xref.Part2.1">7</a>, <a href="#Part2"><b>9.1</b></a>, <a href="#rfc.xref.Part2.2">C</a><ul>
    14051401                        <li><em>Section 7.1.1.1</em>&nbsp;&nbsp;<a href="#rfc.xref.Part2.2">C</a></li>
    14061402                     </ul>
    14071403                  </li>
    1408                   <li><em>Part4</em>&nbsp;&nbsp;<a href="#rfc.xref.Part4.1">5.2</a>, <a href="#rfc.xref.Part4.2">5.2</a>, <a href="#rfc.xref.Part4.3">6.3</a>, <a href="#rfc.xref.Part4.4">6.3</a>, <a href="#rfc.xref.Part4.5">6.4</a>, <a href="#Part4"><b>10.1</b></a>, <a href="#rfc.xref.Part4.6">C</a><ul>
    1409                         <li><em>Section 2.2.2</em>&nbsp;&nbsp;<a href="#rfc.xref.Part4.2">5.2</a>, <a href="#rfc.xref.Part4.3">6.3</a>, <a href="#rfc.xref.Part4.4">6.3</a></li>
    1410                         <li><em>Section 2.3</em>&nbsp;&nbsp;<a href="#rfc.xref.Part4.1">5.2</a>, <a href="#rfc.xref.Part4.6">C</a></li>
     1404                  <li><em>Part4</em>&nbsp;&nbsp;<a href="#rfc.xref.Part4.1">3.1</a>, <a href="#rfc.xref.Part4.2">3.2</a>, <a href="#rfc.xref.Part4.3">3.2</a>, <a href="#rfc.xref.Part4.4">5.3</a>, <a href="#rfc.xref.Part4.5">5.3</a>, <a href="#Part4"><b>9.1</b></a>, <a href="#rfc.xref.Part4.6">C</a><ul>
     1405                        <li><em>Section 2.2.2</em>&nbsp;&nbsp;<a href="#rfc.xref.Part4.2">3.2</a>, <a href="#rfc.xref.Part4.3">3.2</a>, <a href="#rfc.xref.Part4.5">5.3</a></li>
     1406                        <li><em>Section 2.3</em>&nbsp;&nbsp;<a href="#rfc.xref.Part4.4">5.3</a>, <a href="#rfc.xref.Part4.6">C</a></li>
    14111407                     </ul>
    14121408                  </li>
    1413                   <li><em>Part6</em>&nbsp;&nbsp;<a href="#rfc.xref.Part6.1">4.1</a>, <a href="#Part6"><b>10.1</b></a><ul>
     1409                  <li><em>Part6</em>&nbsp;&nbsp;<a href="#rfc.xref.Part6.1">4.1</a>, <a href="#Part6"><b>9.1</b></a><ul>
    14141410                        <li><em>Section 4.1.2</em>&nbsp;&nbsp;<a href="#rfc.xref.Part6.1">4.1</a></li>
    14151411                     </ul>
     
    14181414            </li>
    14191415            <li><a id="rfc.index.R" href="#rfc.index.R"><b>R</b></a><ul>
    1420                   <li>Range header field&nbsp;&nbsp;<a href="#rfc.xref.header.range.1">2</a>, <a href="#rfc.xref.header.range.2">4.1</a>, <a href="#rfc.xref.header.range.3">4.2</a>, <a href="#rfc.iref.r.1"><b>6.4</b></a>, <a href="#rfc.xref.header.range.4">7.3</a></li>
    1421                   <li><em>RFC2046</em>&nbsp;&nbsp;<a href="#RFC2046"><b>10.1</b></a>, <a href="#rfc.xref.RFC2046.1">A</a>, <a href="#rfc.xref.RFC2046.2">A</a><ul>
     1416                  <li>Range header field&nbsp;&nbsp;<a href="#rfc.xref.header.range.1">2</a>, <a href="#rfc.iref.r.1"><b>3.1</b></a>, <a href="#rfc.xref.header.range.2">4.1</a>, <a href="#rfc.xref.header.range.3">4.2</a>, <a href="#rfc.xref.header.range.4">6.3</a></li>
     1417                  <li><em>RFC2046</em>&nbsp;&nbsp;<a href="#RFC2046"><b>9.1</b></a>, <a href="#rfc.xref.RFC2046.1">A</a>, <a href="#rfc.xref.RFC2046.2">A</a><ul>
    14221418                        <li><em>Section 5.1</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC2046.1">A</a></li>
    14231419                     </ul>
    14241420                  </li>
    1425                   <li><em>RFC2119</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC2119.1">1.1</a>, <a href="#RFC2119"><b>10.1</b></a></li>
    1426                   <li><em>RFC2616</em>&nbsp;&nbsp;<a href="#RFC2616"><b>10.2</b></a></li>
    1427                   <li><em>RFC5226</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5226.1">7.1.1</a>, <a href="#RFC5226"><b>10.2</b></a><ul>
    1428                         <li><em>Section 4.1</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5226.1">7.1.1</a></li>
     1421                  <li><em>RFC2119</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC2119.1">1.1</a>, <a href="#RFC2119"><b>9.1</b></a></li>
     1422                  <li><em>RFC2616</em>&nbsp;&nbsp;<a href="#RFC2616"><b>9.2</b></a></li>
     1423                  <li><em>RFC5226</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5226.1">6.1.1</a>, <a href="#RFC5226"><b>9.2</b></a><ul>
     1424                        <li><em>Section 4.1</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5226.1">6.1.1</a></li>
    14291425                     </ul>
    14301426                  </li>
    1431                   <li><em>RFC5234</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5234.1">1.2</a>, <a href="#RFC5234"><b>10.1</b></a>, <a href="#rfc.xref.RFC5234.2">C</a><ul>
     1427                  <li><em>RFC5234</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5234.1">1.2</a>, <a href="#RFC5234"><b>9.1</b></a>, <a href="#rfc.xref.RFC5234.2">C</a><ul>
    14321428                        <li><em>Appendix B.1</em>&nbsp;&nbsp;<a href="#rfc.xref.RFC5234.2">C</a></li>
    14331429                     </ul>
  • draft-ietf-httpbis/latest/p5-range.xml

    r2141 r2142  
    328328</t>
    329329</section>
     330<section title="Accept-Ranges" anchor="header.accept-ranges">
     331  <iref primary="true" item="Accept-Ranges header field" x:for-anchor=""/>
     332  <x:anchor-alias value="Accept-Ranges"/>
     333  <x:anchor-alias value="acceptable-ranges"/>
     334<t>
     335   The "Accept-Ranges" header field allows a resource to indicate
     336   its acceptance of range requests.
     337</t>
     338<figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="Accept-Ranges"/><iref primary="true" item="Grammar" subitem="acceptable-ranges"/>
     339  <x:ref>Accept-Ranges</x:ref>     = <x:ref>acceptable-ranges</x:ref>
     340  <x:ref>acceptable-ranges</x:ref> = 1#<x:ref>range-unit</x:ref> / "none"
     341</artwork></figure>
     342<t>
     343   Origin servers that accept byte-range requests &MAY; send
     344</t>
     345<figure><artwork type="example">
     346  Accept-Ranges: bytes
     347</artwork></figure>
     348<t>
     349   but are not required to do so. Clients &MAY; generate range
     350   requests without having received this header field for the resource
     351   involved. Range units are defined in <xref target="range.units"/>.
     352</t>
     353<t>
     354   Servers that do not accept any kind of range request for a
     355   resource &MAY; send
     356</t>
     357<figure><artwork type="example">
     358  Accept-Ranges: none
     359</artwork></figure>
     360<t>
     361   to advise the client not to attempt a range request.
     362</t>
     363</section>
    330364</section>
    331365
    332366
    333367<section title="Range Requests" anchor="range.requests">
     368<section title="Range" anchor="header.range">
     369  <iref primary="true" item="Range header field" x:for-anchor=""/>
     370  <x:anchor-alias value="Range"/>
     371  <x:anchor-alias value="other-ranges-specifier"/>
     372  <x:anchor-alias value="other-range-set"/>
     373<t>
     374   The "Range" header field on a GET request modifies the method semantics to
     375   request transfer of only one or more sub-ranges of the selected
     376   representation data in a successful response, rather than the entire
     377   representation data.
     378</t>
     379<figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="Range"/>
     380  <x:ref>Range</x:ref> = <x:ref>byte-ranges-specifier</x:ref> / <x:ref>other-ranges-specifier</x:ref>
     381  <x:ref>other-ranges-specifier</x:ref> = <x:ref>other-range-unit</x:ref> "=" <x:ref>other-range-set</x:ref>
     382  <x:ref>other-range-set</x:ref> = 1*<x:ref>CHAR</x:ref>
     383</artwork></figure>
     384<t>
     385   A server &MAY; ignore the Range header field. However, origin servers and
     386   intermediate caches ought to support byte ranges when possible, since Range
     387   supports efficient recovery from partially failed transfers and partial
     388   retrieval of large representations. A server &MUST; ignore a Range header
     389   field received with a request method other than GET.
     390</t>
     391<t>
     392   An origin server &MUST; ignore a <x:ref>Range</x:ref> header field that
     393   contains a range unit it does not understand. A proxy &MAY; either discard
     394   a <x:ref>Range</x:ref> header field that contains a range unit it does not
     395   understand or pass it to the next inbound server when forwarding the
     396   request.
     397</t>
     398<t>
     399   The Range header field is evaluated after evaluating the preconditions of
     400   <xref target="Part4"/> and only if the result of their evaluation is
     401   leading toward a <x:ref>200 (OK)</x:ref> response. In other words, Range
     402   is ignored when a conditional GET would result in a
     403   <x:ref>304 (Not Modified)</x:ref> response.
     404</t>
     405<t>
     406   The If-Range header field (<xref target="header.if-range"/>) can be used as
     407   a precondition to applying the Range header field.
     408</t>
     409<t>
     410   If all of the preconditions are true, the server supports the Range header
     411   field for the target resource, the specified range(s) are syntactically
     412   correct (as defined in <xref target="byte.ranges"/>), and at least one of
     413   the ranges has a non-empty intersection with the current selected
     414   representation extent, then the server &MAY; respond with a status code of
     415   <x:ref>206 (Partial Content)</x:ref> and a payload containing one or more
     416   partial representations that correspond to those requested, as defined in
     417   <xref target="range.response"/>.
     418</t>
     419</section>
     420
     421<section title="If-Range" anchor="header.if-range">
     422  <iref primary="true" item="If-Range header field" x:for-anchor=""/>
     423  <x:anchor-alias value="If-Range"/>
     424<t>
     425   If a client has a partial copy of a representation and wishes
     426   to have an up-to-date copy of the entire representation, it could use the
     427   <x:ref>Range</x:ref> header field with a conditional GET (using
     428   either or both of <x:ref>If-Unmodified-Since</x:ref> and
     429   <x:ref>If-Match</x:ref>.) However, if the condition fails because the
     430   representation has been modified, the client would then have to make a
     431   second request to obtain the entire current representation.
     432</t>
     433<t>
     434   The "If-Range" header field allows a client to "short-circuit" the second
     435   request. Informally, its meaning is: if the representation is unchanged,
     436   send me the part(s) that I am requesting in Range; otherwise, send me the
     437   entire representation.
     438</t>
     439<figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="If-Range"/>
     440  <x:ref>If-Range</x:ref> = <x:ref>entity-tag</x:ref> / <x:ref>HTTP-date</x:ref>
     441</artwork></figure>
     442<t>
     443   Clients &MUST-NOT; use an entity-tag marked as weak in an If-Range
     444   field value and &MUST-NOT; use a <x:ref>Last-Modified</x:ref> date in an
     445   If-Range field value unless it has no entity-tag for the representation and
     446   the Last-Modified date it does have for the representation is strong
     447   in the sense defined by &lastmod-comparison;.
     448</t>
     449<t>
     450   A server that evaluates a conditional range request that is applicable
     451   to one of its representations &MUST; evaluate the condition as false if
     452   the entity-tag used as a validator is marked as weak or, when an HTTP-date
     453   is used as the validator, if the date value is not strong in the sense
     454   defined by &lastmod-comparison;. (A server can distinguish between a
     455   valid HTTP-date and any form of entity-tag by examining the first
     456   two characters.)
     457</t>
     458<t>
     459   The If-Range header field &SHOULD; only be sent by clients together with
     460   a Range header field.  The If-Range header field &MUST; be ignored if it
     461   is received in a request that does not include a Range header field.
     462   The If-Range header field &MUST; be ignored by a server that does not
     463   support the sub-range operation.
     464</t>
     465<t>
     466   If the validator given in the If-Range header field matches the current
     467   validator for the selected representation of the target resource, then
     468   the server &SHOULD; send the specified sub-range of the representation
     469   using a <x:ref>206 (Partial Content)</x:ref> response. If the validator
     470   does not match, then the server &SHOULD; send the entire representation
     471   using a <x:ref>200 (OK)</x:ref> response.
     472</t>
     473</section>
    334474</section>
    335475
     
    466606   server &SHOULD; send them in the order that they appeared in the
    467607   request.
     608</t>
     609</section>
     610
     611<section title="Content-Range" anchor="header.content-range">
     612  <iref primary="true" item="Content-Range header field" x:for-anchor=""/>
     613  <x:anchor-alias value="Content-Range"/>
     614  <x:anchor-alias value="byte-content-range"/>
     615  <x:anchor-alias value="byte-range-resp"/>
     616  <x:anchor-alias value="byte-range"/>
     617  <x:anchor-alias value="unsatisfied-range"/>
     618  <x:anchor-alias value="complete-length"/>
     619  <x:anchor-alias value="other-content-range"/>
     620  <x:anchor-alias value="other-range-resp"/>
     621<t>
     622   The "Content-Range" header field is sent with a partial representation to
     623   specify where in the full representation the payload body is intended to be
     624   applied.
     625</t>
     626<figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="Content-Range"/><iref primary="true" item="Grammar" subitem="byte-content-range"/><iref primary="true" item="Grammar" subitem="byte-range-resp"/><iref primary="true" item="Grammar" subitem="byte-range"/><iref primary="true" item="Grammar" subitem="unsatisfied-range"/><iref primary="true" item="Grammar" subitem="other-content-range"/><iref primary="true" item="Grammar" subitem="other-range-resp"/><iref primary="true" item="Grammar" subitem="complete-length"/>
     627  <x:ref>Content-Range</x:ref>       = <x:ref>byte-content-range</x:ref>
     628                      / <x:ref>other-content-range</x:ref>
     629                         
     630  <x:ref>byte-content-range</x:ref>  = <x:ref>bytes-unit</x:ref> <x:ref>SP</x:ref>
     631                        ( <x:ref>byte-range-resp</x:ref> / <x:ref>unsatisfied-range</x:ref> )
     632
     633  <x:ref>byte-range-resp</x:ref>     = <x:ref>byte-range</x:ref> "/" ( <x:ref>complete-length</x:ref> / "*" )
     634  <x:ref>byte-range</x:ref>          = <x:ref>first-byte-pos</x:ref> "-" <x:ref>last-byte-pos</x:ref>
     635  <x:ref>unsatisfied-range</x:ref>   = "*/" <x:ref>complete-length</x:ref>
     636                         
     637  <x:ref>complete-length</x:ref>     = 1*<x:ref>DIGIT</x:ref>
     638 
     639  <x:ref>other-content-range</x:ref> = <x:ref>other-range-unit</x:ref> <x:ref>SP</x:ref> <x:ref>other-range-resp</x:ref>
     640  <x:ref>other-range-resp</x:ref>    = *<x:ref>CHAR</x:ref>
     641</artwork></figure>
     642<t>   
     643   Range units are defined in <xref target="range.units"/>. A recipient of a
     644   <x:ref>206 (Partial Content)</x:ref> response containing a
     645   <x:ref>Content-Range</x:ref> header field with a <x:ref>range unit</x:ref>
     646   that the recipient does not understand &MUST-NOT; attempt to recombine it
     647   with a stored representation. A proxy that receives such a message
     648   &SHOULD; forward it downstream.
     649</t>
     650<t>
     651   For byte ranges, a sender &SHOULD; indicate the complete length of the
     652   representation from which the range has been extracted unless the complete
     653   length is unknown or difficult to determine. An asterisk character ("*") in
     654   place of the complete-length indicates that the representation length was
     655   unknown when the header field was generated.
     656</t>
     657<t>
     658   A Content-Range field value with a <x:ref>byte-range-resp</x:ref> that has
     659   a <x:ref>last-byte-pos</x:ref> value less than its
     660   <x:ref>first-byte-pos</x:ref> value, or a <x:ref>complete-length</x:ref>
     661   value less than or equal to its <x:ref>last-byte-pos</x:ref> value, is
     662   invalid. The recipient of an invalid <x:ref>Content-Range</x:ref> &MUST-NOT;
     663   attempt to recombine the received content with a stored representation.
     664</t>
     665<t>
     666   A server generating a <x:ref>206 (Partial Content)</x:ref> response to a
     667   byte range request &MUST; send, in each body-part of a multipart response
     668   or in the header block of a single part response, a Content-Range header
     669   field containing a <x:ref>byte-range-resp</x:ref> value that reflects the
     670   corresponding range being sent. The following example would apply
     671   when the complete length of the selected representation is known by the
     672   sender to be 1234 bytes:
     673</t>
     674<figure><artwork type="example">
     675  Content-Range: bytes 42-1233/1234
     676</artwork></figure>
     677<t>
     678   or this second example would apply when the complete length is unknown:
     679</t>
     680<figure><artwork type="example">
     681  Content-Range: bytes 42-1233/*
     682</artwork></figure>
     683<t>
     684   A server generating a <x:ref>416 (Range Not Satisfiable)</x:ref> response
     685   to a byte range request &SHOULD; send a Content-Range header field with an
     686   <x:ref>unsatisfied-range</x:ref> value, as in the following example:
     687</t>
     688<figure><artwork type="example">
     689  Content-Range: bytes */1234
     690</artwork></figure>
     691<t>
     692   The complete-length in a 416 response indicates the current length of the
     693   selected representation, which will be known by the server generating the
     694   response because that is how it determined the range to be unsatisfiable.
     695</t>
     696<t>
     697   The "Content-Range" header field has no meaning for status codes that do
     698   not explicitly describe its semantic. For this specification, only the
     699   <x:ref>206 (Partial Content)</x:ref> and
     700   <x:ref>416 (Range Not Satisfiable)</x:ref> status codes describe a meaning
     701   for Content-Range.
     702</t>
     703<t>
     704   More examples of Content-Range values, assuming that the representation
     705   contains a total of 1234 bytes:
     706   <list style="symbols">
     707      <t>
     708        The first 500 bytes:
     709<figure><artwork type="example" x:indent-with="   ">
     710  Content-Range: bytes 0-499/1234
     711</artwork></figure>
     712      </t>   
     713      <t>
     714        The second 500 bytes:
     715<figure><artwork type="example" x:indent-with="   ">
     716  Content-Range: bytes 500-999/1234
     717</artwork></figure>
     718      </t>   
     719      <t>
     720        All except for the first 500 bytes:
     721<figure><artwork type="example" x:indent-with="   ">
     722  Content-Range: bytes 500-1233/1234
     723</artwork></figure>
     724      </t>   
     725      <t>
     726        The last 500 bytes:
     727<figure><artwork type="example" x:indent-with="   ">
     728  Content-Range: bytes 734-1233/1234
     729</artwork></figure>
     730      </t>   
     731   </list>
    468732</t>
    469733</section>
     
    522786   continuous range that is indicated by a <x:ref>Content-Range</x:ref> header
    523787   field.
    524 </t>
    525 </section>
    526 </section>
    527 
    528 <section title="Header Field Definitions" anchor="header.field.definitions">
    529 <t>
    530    This section defines the syntax and semantics of HTTP/1.1 header fields
    531    related to range requests and partial responses.
    532 </t>
    533 
    534 <section title="Accept-Ranges" anchor="header.accept-ranges">
    535   <iref primary="true" item="Accept-Ranges header field" x:for-anchor=""/>
    536   <x:anchor-alias value="Accept-Ranges"/>
    537   <x:anchor-alias value="acceptable-ranges"/>
    538 <t>
    539    The "Accept-Ranges" header field allows a resource to indicate
    540    its acceptance of range requests.
    541 </t>
    542 <figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="Accept-Ranges"/><iref primary="true" item="Grammar" subitem="acceptable-ranges"/>
    543   <x:ref>Accept-Ranges</x:ref>     = <x:ref>acceptable-ranges</x:ref>
    544   <x:ref>acceptable-ranges</x:ref> = 1#<x:ref>range-unit</x:ref> / "none"
    545 </artwork></figure>
    546 <t>
    547    Origin servers that accept byte-range requests &MAY; send
    548 </t>
    549 <figure><artwork type="example">
    550   Accept-Ranges: bytes
    551 </artwork></figure>
    552 <t>
    553    but are not required to do so. Clients &MAY; generate range
    554    requests without having received this header field for the resource
    555    involved. Range units are defined in <xref target="range.units"/>.
    556 </t>
    557 <t>
    558    Servers that do not accept any kind of range request for a
    559    resource &MAY; send
    560 </t>
    561 <figure><artwork type="example">
    562   Accept-Ranges: none
    563 </artwork></figure>
    564 <t>
    565    to advise the client not to attempt a range request.
    566 </t>
    567 </section>
    568 
    569 <section title="Content-Range" anchor="header.content-range">
    570   <iref primary="true" item="Content-Range header field" x:for-anchor=""/>
    571   <x:anchor-alias value="Content-Range"/>
    572   <x:anchor-alias value="byte-content-range"/>
    573   <x:anchor-alias value="byte-range-resp"/>
    574   <x:anchor-alias value="byte-range"/>
    575   <x:anchor-alias value="unsatisfied-range"/>
    576   <x:anchor-alias value="complete-length"/>
    577   <x:anchor-alias value="other-content-range"/>
    578   <x:anchor-alias value="other-range-resp"/>
    579 <t>
    580    The "Content-Range" header field is sent with a partial representation to
    581    specify where in the full representation the payload body is intended to be
    582    applied.
    583 </t>
    584 <figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="Content-Range"/><iref primary="true" item="Grammar" subitem="byte-content-range"/><iref primary="true" item="Grammar" subitem="byte-range-resp"/><iref primary="true" item="Grammar" subitem="byte-range"/><iref primary="true" item="Grammar" subitem="unsatisfied-range"/><iref primary="true" item="Grammar" subitem="other-content-range"/><iref primary="true" item="Grammar" subitem="other-range-resp"/><iref primary="true" item="Grammar" subitem="complete-length"/>
    585   <x:ref>Content-Range</x:ref>       = <x:ref>byte-content-range</x:ref>
    586                       / <x:ref>other-content-range</x:ref>
    587                          
    588   <x:ref>byte-content-range</x:ref>  = <x:ref>bytes-unit</x:ref> <x:ref>SP</x:ref>
    589                         ( <x:ref>byte-range-resp</x:ref> / <x:ref>unsatisfied-range</x:ref> )
    590 
    591   <x:ref>byte-range-resp</x:ref>     = <x:ref>byte-range</x:ref> "/" ( <x:ref>complete-length</x:ref> / "*" )
    592   <x:ref>byte-range</x:ref>          = <x:ref>first-byte-pos</x:ref> "-" <x:ref>last-byte-pos</x:ref>
    593   <x:ref>unsatisfied-range</x:ref>   = "*/" <x:ref>complete-length</x:ref>
    594                          
    595   <x:ref>complete-length</x:ref>     = 1*<x:ref>DIGIT</x:ref>
    596  
    597   <x:ref>other-content-range</x:ref> = <x:ref>other-range-unit</x:ref> <x:ref>SP</x:ref> <x:ref>other-range-resp</x:ref>
    598   <x:ref>other-range-resp</x:ref>    = *<x:ref>CHAR</x:ref>
    599 </artwork></figure>
    600 <t>   
    601    Range units are defined in <xref target="range.units"/>. A recipient of a
    602    <x:ref>206 (Partial Content)</x:ref> response containing a
    603    <x:ref>Content-Range</x:ref> header field with a <x:ref>range unit</x:ref>
    604    that the recipient does not understand &MUST-NOT; attempt to recombine it
    605    with a stored representation. A proxy that receives such a message
    606    &SHOULD; forward it downstream.
    607 </t>
    608 <t>
    609    For byte ranges, a sender &SHOULD; indicate the complete length of the
    610    representation from which the range has been extracted unless the complete
    611    length is unknown or difficult to determine. An asterisk character ("*") in
    612    place of the complete-length indicates that the representation length was
    613    unknown when the header field was generated.
    614 </t>
    615 <t>
    616    A Content-Range field value with a <x:ref>byte-range-resp</x:ref> that has
    617    a <x:ref>last-byte-pos</x:ref> value less than its
    618    <x:ref>first-byte-pos</x:ref> value, or a <x:ref>complete-length</x:ref>
    619    value less than or equal to its <x:ref>last-byte-pos</x:ref> value, is
    620    invalid. The recipient of an invalid <x:ref>Content-Range</x:ref> &MUST-NOT;
    621    attempt to recombine the received content with a stored representation.
    622 </t>
    623 <t>
    624    A server generating a <x:ref>206 (Partial Content)</x:ref> response to a
    625    byte range request &MUST; send, in each body-part of a multipart response
    626    or in the header block of a single part response, a Content-Range header
    627    field containing a <x:ref>byte-range-resp</x:ref> value that reflects the
    628    corresponding range being sent. The following example would apply
    629    when the complete length of the selected representation is known by the
    630    sender to be 1234 bytes:
    631 </t>
    632 <figure><artwork type="example">
    633   Content-Range: bytes 42-1233/1234
    634 </artwork></figure>
    635 <t>
    636    or this second example would apply when the complete length is unknown:
    637 </t>
    638 <figure><artwork type="example">
    639   Content-Range: bytes 42-1233/*
    640 </artwork></figure>
    641 <t>
    642    A server generating a <x:ref>416 (Range Not Satisfiable)</x:ref> response
    643    to a byte range request &SHOULD; send a Content-Range header field with an
    644    <x:ref>unsatisfied-range</x:ref> value, as in the following example:
    645 </t>
    646 <figure><artwork type="example">
    647   Content-Range: bytes */1234
    648 </artwork></figure>
    649 <t>
    650    The complete-length in a 416 response indicates the current length of the
    651    selected representation, which will be known by the server generating the
    652    response because that is how it determined the range to be unsatisfiable.
    653 </t>
    654 <t>
    655    The "Content-Range" header field has no meaning for status codes that do
    656    not explicitly describe its semantic. For this specification, only the
    657    <x:ref>206 (Partial Content)</x:ref> and
    658    <x:ref>416 (Range Not Satisfiable)</x:ref> status codes describe a meaning
    659    for Content-Range.
    660 </t>
    661 <t>
    662    More examples of Content-Range values, assuming that the representation
    663    contains a total of 1234 bytes:
    664    <list style="symbols">
    665       <t>
    666         The first 500 bytes:
    667 <figure><artwork type="example" x:indent-with="   ">
    668   Content-Range: bytes 0-499/1234
    669 </artwork></figure>
    670       </t>   
    671       <t>
    672         The second 500 bytes:
    673 <figure><artwork type="example" x:indent-with="   ">
    674   Content-Range: bytes 500-999/1234
    675 </artwork></figure>
    676       </t>   
    677       <t>
    678         All except for the first 500 bytes:
    679 <figure><artwork type="example" x:indent-with="   ">
    680   Content-Range: bytes 500-1233/1234
    681 </artwork></figure>
    682       </t>   
    683       <t>
    684         The last 500 bytes:
    685 <figure><artwork type="example" x:indent-with="   ">
    686   Content-Range: bytes 734-1233/1234
    687 </artwork></figure>
    688       </t>   
    689    </list>
    690 </t>
    691 </section>
    692 
    693 <section title="If-Range" anchor="header.if-range">
    694   <iref primary="true" item="If-Range header field" x:for-anchor=""/>
    695   <x:anchor-alias value="If-Range"/>
    696 <t>
    697    If a client has a partial copy of a representation and wishes
    698    to have an up-to-date copy of the entire representation, it could use the
    699    <x:ref>Range</x:ref> header field with a conditional GET (using
    700    either or both of <x:ref>If-Unmodified-Since</x:ref> and
    701    <x:ref>If-Match</x:ref>.) However, if the condition fails because the
    702    representation has been modified, the client would then have to make a
    703    second request to obtain the entire current representation.
    704 </t>
    705 <t>
    706    The "If-Range" header field allows a client to "short-circuit" the second
    707    request. Informally, its meaning is: if the representation is unchanged,
    708    send me the part(s) that I am requesting in Range; otherwise, send me the
    709    entire representation.
    710 </t>
    711 <figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="If-Range"/>
    712   <x:ref>If-Range</x:ref> = <x:ref>entity-tag</x:ref> / <x:ref>HTTP-date</x:ref>
    713 </artwork></figure>
    714 <t>
    715    Clients &MUST-NOT; use an entity-tag marked as weak in an If-Range
    716    field value and &MUST-NOT; use a <x:ref>Last-Modified</x:ref> date in an
    717    If-Range field value unless it has no entity-tag for the representation and
    718    the Last-Modified date it does have for the representation is strong
    719    in the sense defined by &lastmod-comparison;.
    720 </t>
    721 <t>
    722    A server that evaluates a conditional range request that is applicable
    723    to one of its representations &MUST; evaluate the condition as false if
    724    the entity-tag used as a validator is marked as weak or, when an HTTP-date
    725    is used as the validator, if the date value is not strong in the sense
    726    defined by &lastmod-comparison;. (A server can distinguish between a
    727    valid HTTP-date and any form of entity-tag by examining the first
    728    two characters.)
    729 </t>
    730 <t>
    731    The If-Range header field &SHOULD; only be sent by clients together with
    732    a Range header field.  The If-Range header field &MUST; be ignored if it
    733    is received in a request that does not include a Range header field.
    734    The If-Range header field &MUST; be ignored by a server that does not
    735    support the sub-range operation.
    736 </t>
    737 <t>
    738    If the validator given in the If-Range header field matches the current
    739    validator for the selected representation of the target resource, then
    740    the server &SHOULD; send the specified sub-range of the representation
    741    using a <x:ref>206 (Partial Content)</x:ref> response. If the validator
    742    does not match, then the server &SHOULD; send the entire representation
    743    using a <x:ref>200 (OK)</x:ref> response.
    744 </t>
    745 </section>
    746 
    747 <section title="Range" anchor="header.range">
    748   <iref primary="true" item="Range header field" x:for-anchor=""/>
    749   <x:anchor-alias value="Range"/>
    750   <x:anchor-alias value="other-ranges-specifier"/>
    751   <x:anchor-alias value="other-range-set"/>
    752 <t>
    753    The "Range" header field on a GET request modifies the method semantics to
    754    request transfer of only one or more sub-ranges of the selected
    755    representation data in a successful response, rather than the entire
    756    representation data.
    757 </t>
    758 <figure><artwork type="abnf2616"><iref primary="true" item="Grammar" subitem="Range"/>
    759   <x:ref>Range</x:ref> = <x:ref>byte-ranges-specifier</x:ref> / <x:ref>other-ranges-specifier</x:ref>
    760   <x:ref>other-ranges-specifier</x:ref> = <x:ref>other-range-unit</x:ref> "=" <x:ref>other-range-set</x:ref>
    761   <x:ref>other-range-set</x:ref> = 1*<x:ref>CHAR</x:ref>
    762 </artwork></figure>
    763 <t>
    764    A server &MAY; ignore the Range header field. However, origin servers and
    765    intermediate caches ought to support byte ranges when possible, since Range
    766    supports efficient recovery from partially failed transfers and partial
    767    retrieval of large representations. A server &MUST; ignore a Range header
    768    field received with a request method other than GET.
    769 </t>
    770 <t>
    771    An origin server &MUST; ignore a <x:ref>Range</x:ref> header field that
    772    contains a range unit it does not understand. A proxy &MAY; either discard
    773    a <x:ref>Range</x:ref> header field that contains a range unit it does not
    774    understand or pass it to the next inbound server when forwarding the
    775    request.
    776 </t>
    777 <t>
    778    The Range header field is evaluated after evaluating the preconditions of
    779    <xref target="Part4"/> and only if the result of their evaluation is
    780    leading toward a <x:ref>200 (OK)</x:ref> response. In other words, Range
    781    is ignored when a conditional GET would result in a
    782    <x:ref>304 (Not Modified)</x:ref> response.
    783 </t>
    784 <t>
    785    The If-Range header field (<xref target="header.if-range"/>) can be used as
    786    a precondition to applying the Range header field.
    787 </t>
    788 <t>
    789    If all of the preconditions are true, the server supports the Range header
    790    field for the target resource, the specified range(s) are syntactically
    791    correct (as defined in <xref target="byte.ranges"/>), and at least one of
    792    the ranges has a non-empty intersection with the current selected
    793    representation extent, then the server &MAY; respond with a status code of
    794    <x:ref>206 (Partial Content)</x:ref> and a payload containing one or more
    795    partial representations that correspond to those requested, as defined in
    796    <xref target="range.response"/>.
    797788</t>
    798789</section>
Note: See TracChangeset for help on using the changeset viewer.