2. 範囲単位 (Range Units)
表現は、その表現のメディアタイプに固有の構造に応じて、さまざまな構造単位によって部分範囲に分割できる。この「範囲単位」(range unit) は、範囲リクエストのサポートを通知するための Accept-Ranges (2.3 節) 応答ヘッダフィールド、要求する表現の部分を区切るための Range (3.1 節) リクエストヘッダフィールド、および表現のどの部分が転送されているかを記述するための Content-Range (4.2 節) ペイロードヘッダフィールドで使用される。
range-unit = bytes-unit / other-range-unit
2.1 バイト範囲 (Byte Ranges)
表現データはペイロード内でオクテットの並びとして転送されるため、バイト範囲は HTTP で転送可能なあらゆる表現にとって意味のある部分構造である ([RFC7231] の 3 節)。データのオクテット列の部分範囲を表現するために、"bytes" 範囲単位が定義されている。
bytes-unit = "bytes"
バイト範囲リクエストは、単一の表現内で単一のバイト範囲、または範囲の集合を指定できる。
byte-ranges-specifier = bytes-unit "=" byte-range-set
byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec )
byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
byte-range-spec の first-byte-pos 値は、範囲内の最初のバイトのバイトオフセットを与える。last-byte-pos 値は、範囲内の最後のバイトのバイトオフセットを与える。すなわち、指定されるバイト位置は両端を含む。バイトオフセットは 0 から始まる。
byte-ranges-specifier の値の例:
-
最初の 500 バイト (バイトオフセット 0-499、両端を含む):
bytes=0-499 -
2 番目の 500 バイト (バイトオフセット 500-999、両端を含む):
bytes=500-999
last-byte-pos 値が存在し、かつ first-byte-pos より小さい場合、その byte-range-spec は無効である。
クライアントは、選択された表現のサイズを知らなくても、要求するバイト数を制限できる。last-byte-pos 値が存在しない場合、またはその値が表現データの現在の長さ以上である場合、そのバイト範囲は表現の残りとして解釈される (つまり、サーバーは last-byte-pos の値を、選択された表現の現在の長さより 1 小さい値で置き換える)。
クライアントは suffix-byte-range-spec を使用して、選択された表現の最後の N バイトを要求できる。
suffix-byte-range-spec = "-" suffix-length
suffix-length = 1*DIGIT
選択された表現が指定された suffix-length より短い場合、表現全体が使用される。
追加の例 (表現の長さが 10000 であると仮定する):
-
最後の 500 バイト (バイトオフセット 9500-9999、両端を含む):
bytes=-500またはbytes=9500- -
最初と最後のバイトのみ (バイト 0 と 9999):
bytes=0-0,-1 -
2 番目の 500 バイト (バイトオフセット 500-999、両端を含む) のその他の有効な (ただし正規ではない) 指定:
bytes=500-600,601-999
bytes=500-700,601-999
有効な byte-range-set が、first-byte-pos が表現の現在の長さより小さい byte-range-spec を少なくとも 1 つ含む場合、または suffix-length が 0 でない suffix-byte-range-spec を少なくとも 1 つ含む場合、その byte-range-set は満たすことが可能 (satisfiable) である。そうでなければ、その byte-range-set は満たすことが不可能 (unsatisfiable) である。
バイト範囲の構文では、first-byte-pos、last-byte-pos、および suffix-length はオクテット数の十進数として表現される。ペイロードの長さに事前定義された制限はないため、受信者は潜在的に大きな十進数値を予期し、整数変換のオーバーフローによる解析エラーを防がなければならない (MUST)。
2.2 その他の範囲単位 (Other Range Units)
範囲単位は拡張可能であるものと意図されている。新しい範囲単位は、5.1 節で定義されているように IANA に登録すべきである。
other-range-unit = token
2.3 Accept-Ranges
"Accept-Ranges" ヘッダフィールドは、サーバーが対象リソースに対して範囲リクエストをサポートしていることを示すことを可能にする。
Accept-Ranges = acceptable-ranges
acceptable-ranges = 1#range-unit / "none"
特定の対象リソースに対してバイト範囲リクエストをサポートするオリジンサーバーは、どの範囲単位がサポートされているかを示すために Accept-Ranges: bytes を送信してもよい (MAY)。クライアントは、該当するリソースについてこのヘッダフィールドを受信していなくても、範囲リクエストを生成してもよい (MAY)。範囲単位は 2 節で定義されている。
対象リソースに対してどのような種類の範囲リクエストもサポートしないサーバーは、クライアントに範囲リクエストを試みないよう助言するために Accept-Ranges: none を送信してもよい (MAY)。