-
Notifications
You must be signed in to change notification settings - Fork 4
/
979.txt
242 lines (176 loc) · 16.4 KB
/
979.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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
* 仕様書
[REFS[
- [6] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-6>
-- [1] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-6.7>
-- [2] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-6.8>
- [3] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-7>
-- [7] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-7.3>
-- [33] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-7.4>
-- [35] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-7.7>
- [40] '''[CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.10>'''
- [74] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-10.5>
- [75] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-10.7>
- [76] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-12>
- [77] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.11>
- [80] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.12>
- [82] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#page-100>
]REFS]
* 意味
[41] [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]は、[[ロック]]を取得したり、
更新したりするものです [SRC[>>40]]。
[42] [[安全なメソッド]]でも[[冪等なメソッド]]でも''ありません'' [SRC[>>40]]。
[5] [[書き込みロック]]の適用対象となります [SRC[>>3]]。
* 構文
[46] 作成の[[要求]]の [[payload body]] は [[XML]] でなければ[['''なりません''']] [SRC[>>40]]。
[51] 更新の[[要求]]は [[payload body]] を持っては[['''なりません''']] [SRC[>>40, >>35]]。
[52] 更新の[[要求]]は [CODE(HTTP)@en[[[If:]]]] [[ヘッダー]]に[[ロックトークン]]を1つだけ指定しなければ[['''なりません''']] [SRC[>>40, >>35]]。
[48] 通常の[[要求]]も更新の[[要求]]も、 [CODE(HTTP)@en[[[Timeout:]]]]
[[ヘッダー]]を指定しても構いません [SRC[>>40, >>75]]。
[58] [CODE(HTTP)@en[[[Depth:]] [[0]]]] または [CODE(HTTP)@en[[[Depth:]] [[infinity]]]]
を指定することができますが、それ以外を使っては[['''なりません''']] [SRC[>>40]]。
[78] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[lockinfo]]]]]]
[[要素]]は、作成したい[[ロック]]の種類を指定します [SRC[>>77]]。
[79] [CODE(XMLe)@en[[[lockinfo]]]] [[要素]]の[[内容]]は[[要素内容]]で、
[CODE(XMLe)@en[[[lockscope]]]] [[要素]]、
[CODE(XMLe)@en[[[locktype]]]] [[要素]]、
[CODE(XMLe)@en[[[owner]]]] [[要素]]をこの順序で指定します。
ただし [CODE(XMLe)@en[[[owner]]]] [[要素]]は省略できます。 [SRC[>>77]]
[FIG(railroad)[
= [CODE(XMLe)@en[[[lockscope]]]]
= [CODE(XMLe)@en[[[locktype]]]]
= ?
== [CODE(XMLe)@en[[[owner]]]]
]FIG]
* 文脈
[36] [[クライアント]]は同じ[[書き込みロック]]を複数回要求しては[['''なりません''']] [SRC[>>35]]。
[37] [[ロック]]を[RUBYB[更新]@en[refresh]]する場合には、
当該[[ロック]]の範囲内にある[[資源]]の [[URL]]
に [CODE(HTTP)@en[[[LOCK]]]] [[要求]]を送信します [SRC[>>40]]。
;; [[ロックタイムアウト]]も参照。
* 処理
[43] [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]に対応する[[資源]]は、
最低でも [[WebDAV]] の [[XML]] 形式の[[要求]]・[[応答]]に対応しなければ[['''なりません''']]
[SRC[>>40]]。
[45] [[対象資源]]が既に衝突する[[ロック]]の対象となっていなければ、
[[対象資源]]を[[ロック根]]とする[[ロック]]を作成します [SRC[>>40]]。
[38] [[鯖]]は[[本体]]が空の [CODE(HTTP)@en[[[LOCK]]]] [[要求]]を受信したら、
新しい[[ロック]]を作っては[['''なりません''']]。その場合は少なくても既存の[[ロック]]をリセットして「[RUBYB[更新]@en[refresh]]」しなければ[['''なりません''']]。 [SRC[>>35]]
[73] [CODE(HTTP)@en[[[If:]]]] が指定された場合で[[対象資源]]がその範囲内にない場合
([[ロック]]の範囲外である場合、既に破棄された場合、不正な[[ロックトークン]]の場合など)
には、 [CODE(HTTP)[[[412]]]] [[応答]]を返すことができます。
[[応答]]には[[事前条件符号]] [CODE(HTTP)[[[lock-token-matches-request-uri]]]]
を指定できます。 [SRC[>>40]]
[50] [[要求]]に [CODE(HTTP)@en[[[Timeout:]]]] [[ヘッダー]]が含まれていれば、
その値を元に新しいタイムアウトを決めることができます [SRC[>>40, >>75]]。
;; [[ロックタイムアウト]]も参照。
[39] [[クライアント]]は [CODE(HTTP)@en[[[LOCK]]]] [[要求]]による更新にエラーが返された時、
[[ロック]]が更新されたと仮定しては[['''なりません''']] [SRC[>>35]]。
[10] ある[[資源]]の [[URL]] に対する [CODE(HTTP)@en[[[LOCK]]]]
[[要求]]で新しい[[ロック]]が作られるなら、その[[資源]]は直接[[ロック]]されます。 [SRC[>>6]]
[59] [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]に対応する場合は、
[CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]にも対応しなければ[['''なりません''']] [SRC[>>40]]。
[64] [CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]が指定されなかった場合には、
[CODE(HTTP)@en[[[Depth:]] [[infinity]]]] が指定されたとみなさなければ[['''なりません''']]
[SRC[>>40]]。
[53] [[WebDAV]] [[コレクション]]に対する [CODE(HTTP)@en[[[LOCK]]]]
[[要求]]では、 [CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]の値により適用範囲を決定します。
[60] [CODE(HTTP)@en[[[Depth:]] [[0]]]] は[[対象資源]]のみを[[ロック]]することを意味します
[SRC[>>40]]。
[61] [CODE(HTTP)@en[[[Depth:]] [[infinity]]]] の場合には、
[[対象資源]]とその[[メンバー]]を (再帰的にすべて) [[ロック]]します [SRC[>>40]]。
;; [62] 階層の一部のみを[[ロック]]することはできず、
[[ロック]]は成功するか失敗するかのいずれかのみです [SRC[>>40]]。
[54] 更新の[[要求]]の場合には、 [CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]を無視しなければ[['''なりません''']] [SRC[>>40]]。
[11] 深さ無限の[[ロック]]により[[ロック]]されている[[コレクション]]は、
その[[メンバー]]である[[資源]]すべてが間接的に[[ロック]]されます。 [SRC[>>6]]
[8] [[ロック]]されている[[コレクション]]について新しい[[資源]]を[[メンバー]]とすると、
その[[資源]]も[[コレクション]]の[[ロック]]によって間接的に[[ロック]]しなければ[['''なりません''']]。
その[[資源]]は既に[[衝突]]する[[ロック]]を有していては[['''なりません''']]。 [SRC[>>6, >>33]]
[9] [[排他的ロック]]は、同じ[[資源]]の直接または間接のいかなる種類の[[ロック]]とも[[衝突]]します。
[[鯖]]は、ある[[資源]]において[[衝突]]する[[ロック]]を作っては[['''なりません''']]。 [SRC[>>6]]
[FIG(list)[
- [66] [[ロック]]されていなければ、[[ロック]]を作成できます [SRC[>>40]]。
- [67] [[共有ロック]]されていれば、[[共有ロック]]を作成できます [SRC[>>40]]。
- [68] [[共有ロック]]されていれば、[[排他ロック]]を作成しては[['''なりません''']] [SRC[>>40]]。
- [69] [[排他ロック]]されていれば、[[ロック]]しては[['''なりません''']] [SRC[>>40]]。
]FIG]
;; [CODE(HTTP)[[[429]]]] も参照。
[72] [[対象資源]]が衝突により[[ロック]]できない場合には、 [CODE(HTTP)[[[423]]]]
[[応答]]を返すことができます [SRC[>>40]]。
[55] 更新の[[要求]]の場合には、[[ロック]]を更新しても他の[[ロック]]は影響を受けませんし、
他の[[ロック]]によって更新が妨げられることもありません [SRC[>>40]]。
[23] [[ロック]]を作成した [[principal]] は、その[[ロック]]の[[ロック作成者]]となります。
[[鯖]]は[[ロック]]を作成できる [[principal]] を制限しても構いません [SRC[>>6]]。
[47] [[鯖]]は、[[要求]]の [CODE(XMLe)@en[[[owner]]]] [[要素]]で指定された情報を保持しなければ[['''なりません''']] [SRC[>>40]]。
[49] [[応答]]には、 [CODE(XMLe)@en[[[prop]]]] [[要素]]を含め、そこに
[CODE(URI)@en[[[DAV:lockdiscovery]]]] [[特性]]として作成した[[ロック]]の情報を含めなければ[['''なりません''']] [SRC[>>40]]。
更に他の[[ロック]]の情報も含めて構いません [SRC[>>40]]。
[19] [[ロック]]に成功したら、 (再帰的に[[ロック]]した場合でも)
[[ロックトークン]]を1つだけ返さなければ[['''なりません''']] [SRC[>>40]]。
[[応答]]の [CODE(HTTP)@en[[[Lock-Token:]]]] [[ヘッダー]]には[[ロックトークン]]を指定しなければ[['''なりません''']] [SRC[>>40, >>74]]。
[[ロックトークン]]は[[応答]]の[[本体]]でも[[クライアント]]に通知されます。
[56] 更新の[[要求]]に対する[[応答]]では、 [CODE(HTTP)@en[[[Lock-Token:]]]]
[[ヘッダー]]は返しません [SRC[>>40]]。
[57] 更新の[[要求]]に対する[[応答]]の [CODE(URI)@en[[[DAV:lockdiscovery]]]]
[[特性]]には新しい[[ロックトークン]]の値を含めなければ[['''なりません''']] [SRC[>>40]]。
[81] [[応答]]には [CODE(XMLe)@en[[[lockroot]]]] [[要素]]を含める[['''べきです''']] [SRC[>>80]]。
[24] [[ロック]]を作成すると、[[鯖]]は[[ロックタイムアウト]]の値を決めて計測を開始します。
[70] 既存の[[資源]]を[[ロック]]した場合は、 [CODE(URI)@en[[[DAV:lockdiscovery]]]]
[[特性]]を含む [CODE(HTTP)[[[200]]]] [[応答]]を返すことができます [SRC[>>40]]。
[29] 空の[[資源]]を作成した場合の[[応答]]は、 [CODE(HTTP)[[[201]]]] でなければ[['''なりません''']] [SRC[>>7]]。
[CODE(HTTP)[[[3xx]]]] を返しては[['''なりません''']] [SRC[>>76]]。
[[応答]]には [CODE(URI)[[[DAV:lockdiscovery]]]] [[特性]]を含める必要があります [SRC[>>7]]。
[63] 一部の[[資源]]について[[ロック]]できなかった場合は、
[[ロック]]はすべて作成できなかったこととなりますが、
[CODE(HTTP)[[[207]]]] [[応答]]を返して、[[ロック]]を作成できない原因となった[[資源]]最低1つの
[CODE(XMLe)@en[[[response]]]] [[要素]]を含めなければ[['''なりません''']]。
その場合には失敗を表す適切な[[状態符号]]を使います。 [SRC[>>40]]
[[書き込みロック]]が[[要求]]された場合で、
新しい[[ロック]]と[[衝突]]する形で[[ロック]]されている[[資源]]の[[メンバーURL]]が[[コレクション]]に含まれる場合には、
[CODE(HTTP)[[[423]]]] [[応答]]によりエラーを返さなければなりません [SRC[>>33]]。
その他 [CODE(HTTP)[[[403]]]] など適切な[[状態符号]]を使うこともできます [SRC[>>40]]。
原因が[[対象資源]]以外の場合には、[[対象資源]]についての [CODE(XMLe)@en[[[response]]]]
[[要素]]も含めて、その[[状態符号]]は [CODE(HTTP)[[[424]]]] とする[['''べきです''']]
[SRC[>>40]]。
[34] [[状態符号]]が [CODE(HTTP)[[[423]]]] の場合には[[事前条件符号]]
[CODE@en[[[no-conflicting-lock]]]] [SRC[>>82]] を含める[['''べきです''']]。 [SRC[>>33, >>40]]
[44] [[応答]]は、[[キャッシュ不可能]]です [SRC[>>40]]。
** 空の資源の作成
[12] [[資源]]への[[写像]]が無い [[URL]] に [CODE(HTTP)@en[[[LOCK]]]]
[[要求]]を送信することにより、名前 ([[URL]]) を予約できます。
これにより[[資源]]の作成時の [[lost update問題]]を回避できます。 [SRC[>>7]]
;; [13] なお、これ以外に [CODE(HTTP)@en[[[If-None-Match:]]]] [[ヘッダー]]を使っても回避できます [SRC[>>7]]。
[14] [[写像]]がない [[URL]] を[[ロック]]した場合、空の[[資源]]を新たに作らなければ[['''なりません''']] [SRC[>>40, >>6, >>7]]。
[71] ただしいくつかの中間の[[コレクション]]が存在しない場合は、これを自動的に作っては[['''なりません''']]。
[CODE(HTTP)[[[409]]]] [[応答]]を返すことができます。 [SRC[>>40]]
[16] この資源は空の[[資源]] (「locked empty resource」 [SRC[>>7]]) で、次の条件を満たすものです。
[FIG(list)[
- [17] [[コレクション]]でない[[資源]]でなければなりません [SRC[>>7]]。
- [18] [CODE(HTTP)@en[[[Content-Type:]]]] や [CODE(HTTP)@en[[[Content-Language:]]]]
は既定値を使うか、空の値とします [SRC[>>7]]。
- [20] 読み取り、削除、移動、複製その他通常の[[コレクション]]でない[[資源]]のように扱えます [SRC[>>7]]。
- [65] [CODE(HTTP)@en[[[GET]]]] すると [CODE(HTTP)[[[204]]]] または長さ0の
[CODE(HTTP)[[[200]]]] の応答を返します [SRC[>>40]]。
- [26] [CODE(HTTP)@en[[[PUT]]]] により更新できます [SRC[>>7]]。
- [21] 親[[コレクション]]の[[メンバー]]となります [SRC[>>7, >>40]]。
- [22] [[ロック]]が破棄された時に消滅する[['''べきではありません''']] [SRC[>>7]]。
- [25] [CODE(URI)[[[DAV:getcontentlanguage]]]] その他指定されていない[[特性]]の値を持ちません
[SRC[>>7]]。
- [27] [[コレクション]]に変換しては[['''なりません''']] [SRC[>>7]]。
- [28] [CODE(URI)[[[DAV:lockdiscovery]]]] や [CODE(URI)[[[DAV:supportedlock]]]]
の[[特性]]の値を持たなければ[['''なりません''']] [SRC[>>7]]。
]FIG]
;; [15] [[コレクション]]を作る [CODE(HTTP)@en[[[MKCOL]]]] [[メソッド]]は既存の[[資源]]を上書きしないので、
[[lost update問題]]は置きません [SRC[>>7]]。
[31] [[鯖]]は、 [[RFC 2518]] との互換性のため、空の[[資源]]でなく
[[LNR]]s (Lock-Null Resources) を実装しても構いません [SRC[>>7]]。
;; [32] [[クライアント]]は、 [[LNR]] と [[locked empty resource]]
のどちらを[[鯖]]が実装していても、[[写像]]のない [[URL]] を[[ロック]]したら直ちに
[CODE(HTTP)@en[[[PUT]]]] することや、 [[LNR]] 特有の特性に依存しないことで、
[[相互運用]]できます [SRC[>>7]]。
[30] [[クライアント]]は[[応答]]の後すぐに [CODE(HTTP)@en[[[PUT]]]] や
[CODE(HTTP)@en[[[PROPPATCH]]]] で[[ロック]]した[[資源]]を更新することが期待されています [SRC[>>7]]。
* 関連
[4] [[WebDAV]] に従う[[資源]]は、 [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]に対応する場合、
[CODE(URI)@en[[[DAV:supportedlock]]]] [[特性]] [SRC[>>1]] と
[CODE(URI)@en[[[DAV:lockdiscovery]]]] [[特性]] [SRC[>>2]] に対応しなければ[['''なりません''']]。