[3] [[MIME型]] [DFN[[CODE(MIME)@en[[[multipart/byteranges]]]]]]
は、[[範囲要求]]に対して複数の範囲のデータを返す時に使う構文です。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 7233 - Hypertext Transfer Protocol (HTTP/1.1): Range Requests]] ([TIME[2014-09-11 09:57:55 +09:00]] 版) <https://tools.ietf.org/html/rfc7233#section-5.4>
- [10] [CITE@en[RFC 7233 - Hypertext Transfer Protocol (HTTP/1.1): Range Requests]] ([TIME[2014-09-11 09:57:55 +09:00]] 版) <https://tools.ietf.org/html/rfc7233#appendix-A>
- [20] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#section-10.10>
]REFS]

* 意味

[9] [CODE(MIME)@en[[[multipart/byteranges]]]] の各[[本体部分]]は、
[[範囲要求]]の結果として得られたデータの各部分を表しています。

* 引数

[5] [CODE(MIME)@en[[[multipart/*]]]] の共通の [CODE(MIME)@en[[[boundary]]]]
[[引数]]は[[必須]]です [SRC[>>1]]。

[12] [CODE(MIME)@en[[[boundary]]]] [[引数]]が[[引用文字列]]だと正しく扱えない実装もあります
[SRC[>>10]]。

* 構文

[4] [CODE(MIME)@en[[[multipart/*]]]] の共通の構文に従っています。

[11] [[前書き]]として、最初の[[境界文字列]]の前にいくつか [CODE(ABNF)@en[[[CRLF]]]]
を含めることができます [SRC[>>10]]。 [[MIME]] の仕様によると [CODE(ABNF)@en[[[CRLF]]]]
以外にも[[境界文字列]]以外の任意の[[ASCII]]文字列を入れることができます。

[207] 互換性については[[後書き]]の項も参照してください。

[8] [[範囲要求]]における要件については、[[範囲要求]]の項を参照してください。

[16] [[範囲単位]]は各[[本体部分]]の [CODE(HTTP)@en[[[Content-Range:]]]]
[[ヘッダー]]で指定します。[[MIME型]]の名前は [CODE(MIME)@en[byteranges]]
ですが、 [CODE(HTTP)@en[[[bytes]]]] 以外の[[範囲単位]]も使えます [SRC[>>10]]。

[18] 他の [CODE(MIME)@en[[[multipart/*]]]] とは違って、[[実体本体]]には元のデータの一部分のみが含まれます。
[CODE(MIME)@en[[[Content-Type:]]]] の[[MIME型]]の仕様で決められた形式を満たすとは限りません。

[19] [[範囲]]を選択した後に[[実現値操作]]が適用されている場合は、更に[[圧縮]]などが行われているかもしれません [SRC[>>20]]。
その場合はすべての[[本体部分]]で同じ[[実現値操作]]が適用されなければ[['''なりません''']] [SRC[>>20]]。

* 処理モデル

[7] [[範囲要求]]の項を参照してください。

* CTE

[6] [[内容転送符号化]]としては、 ([CODE(MIME)@en[[[multipart/*]]]]
全体の制限により) [CODE(MIME)@en[[[7bit]]]]、[CODE(MIME)@en[[[8bit]]]]、
[CODE(MIME)@en[[[binary]]]] だけが認められています [SRC[>>1]]。

[17] 仕様上明記はされていませんが、[[本体部分]]に [[CTE]] は使えないものと思われます。
[[MIME]] では意味がありますが、 [[HTTP]] では意味がありません。
実装も対応しているとは思えません。

* 歴史

[13] 初期の実装は [CODE(MIME)@en[[[multipart/x-byteranges]]]] [SRC[>>14, >>15]]
に(のみ)対応しているかもしれません。 [CODE(MIME)@en[[[multipart/x-byteranges]]]]
は [CODE(MIME)@en[[[multipart/byteranges]]]] とほぼ同じですが、違いもあります。 [SRC[>>10]]

[REFS[
- [14] [CITE[Apache HTTP Server Project]]
( ([TIME[2011-05-28 00:58:55 +09:00]] 版))
<http://httpd.apache.org/docs/1.3/misc/known_client_problems.html#byterange-requests>
- [15] [CITE@en[draft-ietf-http-range-retrieval-00 - Byte Range Retrieval Extension to HTTP]]
( ([TIME[2012-02-28 06:17:13 +09:00]] 版))
<http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00>
]REFS]

[FIG(quote)[
[FIGCAPTION[
[2] RFC 2068・RFC 2616 (HTTP/1.1) 19.2 Internet Media Type multipart/byteranges
]FIGCAPTION]

> When an HTTP [DEL[206 (Partial Content) response]] message includes the
content of multiple ranges ([DEL[for example,]] a response to a request for multiple
non-overlapping ranges), these are transmitted as a multipart [DEL[MIME message]] [INS[message-body]]. The [DEL[multipart]]
media type for this purpose is called "multipart/byteranges".

HTTP [CODE(HTTP)[[[206]]]] (部分内容) 応答メッセージは複数の範囲の内容を含むとき
(例えば複数の重なり合わない範囲についての要求に対する応答のとき)、
各範囲は[[多部分]] [CODE(ABNF)[[[message-body]]]]
で転送します。この目的の媒体型を [CODE(MIME)[multipart/byteranges]]
と呼びます。

> The multipart/byteranges media type includes two or more parts, each
with its own Content-Type and Content-Range fields. [DEL[The parts are separated using a MIME boundary parameter.]] [INS[The required boundary parameter specifies the boundary string used to separate each body-part.]]

[CODE(MIME)[multipart/byteranges]] 媒体型は2つ以上の部分を含み、
それぞれがそれぞれの [CODE(MIME)[[[Content-Type]]]] 欄と
[CODE(MIME)[[[Content-Range]]]] 欄を持ちます。
必須の [CODE(MIME)[[[boundary]]]] 引数は、各[[本体部分]]を分離するために使う[[境界文字列]]を指定します。

>
:Media Type name:         multipart
:Media subtype name:      byteranges
:Required parameters:     boundary
:Optional parameters:     none
:Encoding considerations: only "7bit", "8bit", or "binary" are permitted
:Security considerations: none

> For example:
[PRE[
HTTP/1.1 206 Partial [DEL[content]] [INS[Content]]
Date: Wed, 15 Nov 1995 06:25:24 GMT
[DEL[Last-modified: Wed, 15 Nov 1995 04:58:08 GMT]]
[INS[Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT]]
Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-type: application/pdf
Content-range: bytes 500-999/8000

...the first range...
--THIS_STRING_SEPARATES
Content-type: application/pdf
Content-range: bytes 7000-7999/8000

...the second range
--THIS_STRING_SEPARATES--
]PRE]

[INS[
> Notes:
- 1) Additional CRLFs may precede the first boundary string in the entity.
- 2) Although RFC 2046 [40] permits the boundary string to be
quoted, some existing implementations handle a quoted boundary string incorrectly.
- 3) A number of browsers and servers were coded to an early draft
of the byteranges specification to use a media type of
multipart/x-byteranges, which is almost, but not quite
compatible with the version documented in HTTP/1.1.

注意:
-実体の最初の境界文字列の前に追加の CRLF が来ても構いません。
-[[RFC2046]] は境界文字列を引用符で囲むことを認めていますが、
既存の実装には引用符で囲まれた境界文字列を正しく扱えないものが
あります。
-多くの[[ブラウザ]]と[[鯖]]はバイト範囲仕様書の古い原案の媒体型
[CODE(MIME)[[[multipart/x-byteranges]]]] を使うように符号化されていました。
この媒体型は HTTP/1.1 で文書化されている版とは完全にではありませんがほとんどは互換です。
]INS]
]FIG]

[REFS[
- [208] [CITE@en[RFC 3229 - Delta encoding in HTTP]]
( ([TIME[2012-02-19 00:18:18 +09:00]] 版))
<http://tools.ietf.org/html/rfc3229#section-10.10>
]REFS]

[21] [CITE[Site Isolation - The Chromium Projects]]
([TIME[2018-01-09 10:37:14 +09:00]])
<http://www.chromium.org/Home/chromium-security/site-isolation>