/
330.txt
154 lines (113 loc) · 5.95 KB
/
330.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
[4] [DFN[[CODE(HTTP)@en[[[bytes]]]]]] は、[[バイト]]の範囲を表す[[範囲単位]]です。
* 仕様書
[REFS[
- [3] [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-2.1>
]REFS]
* 意味
[5] [[範囲単位]] [CODE(HTTP)@en[[[bytes]]]] は、データの[[オクテット列]]の部分範囲を表します
[SRC[>>3]]。
* 範囲
[6] [[バイト範囲]]の値は、単位の後に [CODE[[[=]]]] と範囲の[[リスト]]
([CODE(HTTP)[#]]) を記述して指定します [SRC[>>3]]。
[FIG(railroad)[
= [CODE(HTTP)@en[[[bytes]]]]
= [CODE(HTTP)@en[[[=]]]]
= 範囲
= *
== [[OWS]]
== [CODE[[[,]]]]
== [[OWS]]
== 範囲
]FIG]
[7] 範囲は、先頭の位置と末尾の位置で指定するか、先頭の位置のみで指定するか、
長さのみで指定するかのいずれかの方法で記述します [SRC[>>3]]。
[FIG(railroad)[
= |
== =
=== 位置
=== [CODE(HTTP)[[[-]]]]
=== 位置
== =
=== 位置
=== [CODE(HTTP)[[[-]]]]
== =
=== [CODE(HTTP)[[[-]]]]
=== 長さ
]FIG]
[8] 位置や長さは1文字以上の[[ASCII数字]]の列で[[十進数]]として表します [SRC[>>3]]。
;; [22] [[受信者]]は[[桁溢れ]]に注意しなければ[['''なりません''']] [SRC[>>3]]。
[FIG(railroad)[
= +
== [[ASCII数字]]
]FIG]
[9] 位置の指定は、[[バイト列]]の先頭を [[0]] とした時の位置 ([[offset]])
として解釈します。指定された先頭または最後のバイトも、範囲に含まれます。 [SRC[>>3]]
[13] 最後のバイトが指定されていない場合や、実際のデータの最後のバイトより後を指している時は、
残りすべてを表します。 [SRC[>>3]]
;; [14] [[クライアント]]が実際の長さを知らなくても取得する最大のデータ長を指定したい時に、
適当に大きな値を指定することができます。
[12] 先頭と最後が明記されていて、先頭より最後のバイトの方が小さな値の範囲は、
[[非妥当]]です [SRC[>>3]]。
[23] 先頭がデータの長さより大きな値であっても[[非妥当]]とはならないようですが、
データのどの部分も表しません。
[EG[
[10] [CODE(HTTP)@en[bytes=0-499]] は、先頭500バイトを表します [SRC[>>3]]。
[11] [CODE(HTTP)@en[bytes=500-999]] は、その後に続く500バイトを表します [SRC[>>3]]。
]EG]
[15] 長さによる範囲の指定は、データの最後から指定された数の[[バイト]]を表します。
実際のデータの長さより大きい時は、全体を表します。 [SRC[>>3]]
;; [20] 意味はありませんが、 [CODE(HTTP)[bytes=-0]] も禁止されていないようです。
[EG[
[16] 長さが10000のデータに対して [CODE(HTTP)@en[bytes=-500]] は
[CODE(HTTP)@en[bytes=9500-9999]] や [CODE(HTTP)@en[bytes=9500-]]
と同じ意味になります [SRC[>>3]]。
]EG]
[17] 範囲のリストは、それぞれの範囲によって表されるバイト列のリストを表しています。
各範囲は重複していることもあります。
[EG[
[18] [CODE(HTTP)@en[bytes=0-0,-1]] は先頭バイトと末尾バイトを表しています [SRC[>>3]]。
]EG]
[EG[
[19] [CODE(HTTP)@en[bytes=500-600,601-999]] や
[CODE(HTTP)@en[bytes=500-700,601-999]] は、
[CODE(HTTP)@en[bytes=500-999]] と同じ範囲を表していますが冗長です [SRC[>>3]]。
]EG]
[21] 範囲のリストにおいて、範囲の先頭の位置がデータの長さより小さな値か、
長さが0でないものが最低1つでもあれば、これは[RUBYB[満足可能]@en[satisfiable]]です。
そうでなければ[RUBYB[満足不能]@en[unsatisfiable]]です。 [SRC[>>3]]
[25] この範囲の指定は [CODE(HTTP)@en[[[Range:]]]] [[ヘッダー]]で使います。
妥当性や満足可能性は、[[鯖]]の [CODE(HTTP)@en[[[Range:]]]]
[[ヘッダー]]の処理で使われます。
[26] 範囲のリストにおける範囲の順序や重複、個数などについては、
[CODE(HTTP)@en[[[Range:]]]] [[ヘッダー]]の項を参照してください。
* 歴史
[FIG(quote)[
[FIGCAPTION[
[2] RFC 2068・2616 (HTTP/1.1) 3.12 Range Units
]FIGCAPTION]
> HTTP/1.1 allows a client to request that only part (a range of) the
response entity be included within the response. HTTP/1.1 uses range
units in the Range (section [DEL[14.36]] [INS[14.35]]) and Content-Range (section [DEL[14.17]] [INS[14.16]])
header fields. An entity [DEL[may]] [INS[can]] be broken down into subranges according
to various structural units.
[[HTTP/1.1]] では、[[応答]][[実体]]の部分 (範囲)
のみを応答中に含めるように[[クライアント]]が[[要求]]することを認めます。
HTTP/1.1 は、範囲単位を [CODE(HTTP)[[[Range]]]] 頭欄と
[CODE(HTTP)[[[Content-Range]]]] 頭欄で使います。
実体は種々の構造単位に基づいて小範囲に分割できます。
>
- range-unit = bytes-unit | other-range-unit
- bytes-unit = "bytes"
- other-range-unit = token
> The only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1
implementations [DEL[may]] [INS[MAY]] ignore ranges specified using other units.
HTTP/1.1 で定義する範囲単位は [CODE(HTTP)[[[bytes]]]] だけです。
HTTP/1.1 実装は他の単位を使って指定されている範囲を無視しても'''構いません'''。
> HTTP/1.1 has been designed to allow implementations of applications
that do not depend on knowledge of ranges.
HTTP/1.1 は範囲の知識に依存しない応用の実装を認めるように設計されています。
]FIG]
* 関連
[24] [[鯖]]は、 [CODE(HTTP)@en[[[Accept-Ranges:]] [[bytes]]]] によって[[バイト範囲]]に対応していることを明示できます。
* メモ
[1] HTTP では他の単位が使われてるのって見たことないですね。