メインコンテンツまでスキップ

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)。