Range
使い方
Range ヘッダーはリソースの部分的な取得を可能にします。クライアントはリソース全体をダウンロードする代わりに、特定のバイト範囲を要求するためにこのヘッダーを含めます。これは、中断されたダウンロードの再開、シーク対応のメディアストリーミング、大きなファイルを並列のセグメントで読み込む用途に欠かせません。
範囲リクエストを送る前に、クライアントは以前のレスポンスの Accept-Ranges ヘッダーを確認してサーバーの対応状況を検証します。値が bytes であれば、サーバーがバイト範囲リクエストを扱えることが確認できます。値が none であれば、サーバーは範囲リクエストを受け付けません。
範囲リクエストが成功すると、サーバーは 206 Partial Content で応答し、バイト位置とリソースの総サイズを示す Content-Range ヘッダーを含めます。1 つのリクエストで複数の範囲を指定すると、各パートがそれぞれの Content-Range ヘッダーと Content-Type ヘッダーを持つマルチパートレスポンスになります。
要求された範囲がリソースの境界を外れている場合、サーバーは 416 Range Not Satisfiable を返します。場合によっては、サーバーが Range ヘッダーを完全に無視し、リソース全体をステータス 200 で配信することもあります。
unit
unit は範囲の測定単位を指定します。bytes は HTTP 仕様で定義された標準の単位です。独自の範囲単位も許可されていますが、ほとんど使われません。
range-start と range-end
range-start の値は範囲が始まる 0 起点のバイトオフセットです(必須)。range-end の値は範囲が終わる 0 起点のバイトオフセットです(任意)。range-end を省略すると、range-start からリソースの末尾までのすべてのバイトを要求します。
suffix-length
suffix-length の形式は、リソースの末尾 N バイトを要求します。-N という形式により、リソースの総サイズを知らなくても最後の N バイトを取得できます。
例
クライアントが大きな画像ファイルの先頭 1,000 バイトを要求します。サーバーは 206 Partial Content で応答し、Content-Range ヘッダーでバイト範囲とファイル全体のサイズを示します。
GET /photo.jpg HTTP/1.1
Host: cdn.example.re
Range: bytes=0-999
HTTP/1.1 206 Partial Content
Content-Type: image/jpeg
Content-Length: 1000
Content-Range: bytes 0-999/250000
クライアントが 50,000 バイト目からダウンロードを再開します。終了値を省略すると、指定したオフセットからリソースの末尾までのすべてを要求します。
Range: bytes=50000-
クライアントがファイルの末尾 500 バイトを要求します。クライアントがファイル全体のサイズを知らない場合、この接尾形式が役立ちます。
Range: bytes=-500
クライアントが 1 つのリクエストで 2 つの別々のバイト範囲を要求します。サーバーは、各セグメントを別個のボディパートとするマルチパートレスポンスを返します。
Range: bytes=0-499, 1000-1499