[12] [DFN[[CODE(HTTP)@en[[[LOCK]]]]]] は、[[ロック]]の作成を求める[[要求メソッド]]です。

* 仕様書

[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>
- [83] [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-17>
- [84] [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-18>
- [11] [CITE[RFC Errata Report]] ([TIME[2014-12-02 19:32:04 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=4918>
]REFS]

* 意味

[41] [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]は、[[ロック]]を取得したり、
更新したりするものです [SRC[>>40]]。

[42] [[安全なメソッド]]でも[[冪等なメソッド]]でも''ありません'' [SRC[>>40]]。

[5] [[書き込みロック]]の適用対象となります [SRC[>>3]]。

* 構文

[46] 作成の[[要求]]の [[payload body]] は [[XML]] でなければ[['''なりません''']] [SRC[>>40]]。
[CODE(XMLe)@en[[[lockinfo]]]] [[要素]]を[[根要素]]とする[[文書]]が想定されているようです。

[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]]]] [[要素]]を指定します [SRC[>>77]]。
順序は意味を持ちません [SRC[>>83]]。
ただし [CODE(XMLe)@en[[[owner]]]] [[要素]]は省略できます [SRC[>>77]]。

* 文脈

[36] [[クライアント]]は同じ[[書き込みロック]]を複数回要求しては[['''なりません''']] [SRC[>>35]]。

[37] [[ロック]]を[RUBYB[更新]@en[refresh]]する場合には、
当該[[ロック]]の範囲内にある[[資源]]の [[URL]]
に [CODE(HTTP)@en[[[LOCK]]]] [[要求]]を送信します [SRC[>>40]]。

;; [[ロックタイムアウト]]も参照。

* 処理

[85] [[WebDAV]] [[適合クラス]] 2 に対応する[[資源]]は、
[CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]に対応しなければ[['''なりません''']] [SRC[>>84]]。

[43] [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]に対応する[[資源]]は、
最低でも [[WebDAV]] の [[XML]] 形式の[[要求]]・[[応答]]に対応しなければ[['''なりません''']]
[SRC[>>40]]。成功した場合には [CODE(XMLe)@en[[[prop]]]] [[要素]]を[[根要素]]とする
[[XML文書]]を[[応答]]とすることが想定されているようです。

[45] [[対象資源]]が既に衝突する[[ロック]]の対象となっていなければ、
[[対象URL]]を[[ロック根]]とする[[ロック]]を作成します [SRC[>>40, >>11]]。

[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]]。
[[WebDAV]] [[コレクション]]に対する [CODE(HTTP)@en[[[LOCK]]]]
[[要求]]では、 [CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]の値により適用範囲を決定します。
[CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]が指定されなかった場合には、
[CODE(HTTP)@en[[[Depth:]] [[infinity]]]] が指定されたとみなさなければ[['''なりません''']]
[SRC[>>40]]。

[60] [CODE(HTTP)@en[[[Depth:]] [[0]]]] は[[対象資源]]のみを[[ロック]]することを意味します
[SRC[>>40]]。
[CODE(HTTP)@en[[[Depth:]] [[infinity]]]] の場合には、
[[対象資源]]とその[[メンバー]]を (再帰的にすべて) [[ロック]]します [SRC[>>40]]。
深さ無限の[[ロック]]により[[ロック]]されている[[コレクション]]は、
その[[メンバー]]である[[資源]]すべてが間接的に[[ロック]]されます [SRC[>>6]]。

;; [62] 階層の一部のみを[[ロック]]することはできず、
[[ロック]]は全体として成功するか失敗するかのいずれかのみです [SRC[>>40]]。

[54] 更新の[[要求]]の場合には、 [CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]を無視しなければ[['''なりません''']] [SRC[>>40]]。

[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]]。
[[鯖]]は、[[要求]]の [CODE(XMLe)@en[[[owner]]]] [[要素]]で指定された情報を保持しなければ[['''なりません''']] [SRC[>>40]]。

[49] [[応答]]には、 [CODE(XMLe)@en[[[prop]]]] [[要素]]を含め、そこに
[CODE(URI)@en[[[DAV:lockdiscovery]]]] [[特性]]として作成した[[ロック]]の情報を含めなければ[['''なりません''']] [SRC[>>40]]。
更に他の[[ロック]]の情報も含めて構いません [SRC[>>40]]。

[FIG(railroad)[
= [CODE(XMLe)@en[[[prop]]]]
]FIG]

[FIG(railroad)[
= [CODE(URI)@en[[[DAV:lockdiscovery]]]]
]FIG]

[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]]。

[14] [[写像]]がない [[URL]] を[[ロック]]した場合、空の[[資源]]
([[ロックされた空の資源]]) を新たに作らなければ[['''なりません''']] [SRC[>>40, >>6, >>7]]。

[31] [[鯖]]は、 [[RFC 2518]] との互換性のため、空の[[資源]]でなく
[[LNR]]s (Lock-Null Resources) を実装しても構いません [SRC[>>7]]。

[71] ただしいくつかの中間の[[コレクション]]が存在しない場合は、これを自動的に作っては[['''なりません''']]。
[CODE(HTTP)[[[409]]]] [[応答]]を返すことができます。 [SRC[>>40]]

;; [32] [[クライアント]]は、 [[LNR]] と [[locked empty resource]]
のどちらを[[鯖]]が実装していても、[[写像]]のない [[URL]] を[[ロック]]したら直ちに
[CODE(HTTP)@en[[[PUT]]]] することや、 [[LNR]] 特有の特性に依存しないことで、
[[相互運用]]できます [SRC[>>7]]。

;; [30] [[クライアント]]は[[応答]]の後すぐに [CODE(HTTP)@en[[[PUT]]]] や
[CODE(HTTP)@en[[[PROPPATCH]]]] で[[ロック]]した[[資源]]を更新することが期待されています [SRC[>>7]]。

[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]]。

* 関連

[4] [[WebDAV]] に従う[[資源]]は、 [CODE(HTTP)@en[[[LOCK]]]] [[メソッド]]に対応する場合、
[CODE(URI)@en[[[DAV:supportedlock]]]] [[特性]] [SRC[>>1]] と
[CODE(URI)@en[[[DAV:lockdiscovery]]]] [[特性]] [SRC[>>2]] に対応しなければ[['''なりません''']]。

[13] [CITE@en[RFC 3744 - Web Distributed Authoring and Versioning (WebDAV) Access Control Protocol]]
([TIME[2017-09-24 17:45:41 +09:00]])
<https://tools.ietf.org/html/rfc3744#section-7.5>