[2] [DFN[[RUBYB[ロック null 資源]@en[lock-null resource]]]] ([DFN[[[LNR]]]]) は、
[CODE(HTTP)@en[[[LOCK]]]] [[要求]]で作られることがある[[資源]]です。

* 仕様書

[REFS[
- [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#appendix-D>
]REFS]

* 意味

[3] [CODE(HTTP)@en[[[LOCK]]]] [[要求]]の[[要求URL]]が[[資源]]に[[写像]]されていない [[URL]]
である場合、[[鯖]]は新しい[[資源]]を作ることになっています。
[[RFC 2518]] ではこれは「ロック null 資源」 (LNR) を作ることとなっていました。
しかし複雑すぎて[[相互運用性]]と実装の問題があった [SRC[>>1]] として、
[[RFC 4918]] では[[ロックされた空の資源]]を原則とし、
[RUBYB[非推奨]@en[deprecated]] [SRC[>>1]]
ながら互換性のために [[LNR]] を使っても良いこととしています。

* 鯖の動作

[5] [[LNR]] は、[CODE(HTTP)@en[[[PUT]]]]、[CODE(HTTP)@en[[[MKCOL]]]]、
[CODE(HTTP)@en[[[OPTIONS]]]]、[CODE(HTTP)@en[[[PROPFIND]]]]、
[CODE(HTTP)@en[[[LOCK]]]]、[CODE(HTTP)@en[[[UNLOCK]]]]
を除き、 [CODE(HTTP)[[[404]]]] か [CODE(HTTP)[[[405]]]]
を返して存在しないように振る舞います [SRC[>>1]]。

[6] [[LNR]] は、親の[[コレクション]]の[[メンバー]]として現れます [SRC[>>1]]。

[8] [[LNR]] は、 [CODE(HTTP)@en[[[PUT]]]] が成功すると通常の[[資源]]に変換されます [SRC[>>1]]。

[9] [[LNR]] は、 [CODE(HTTP)@en[[[MKCOL]]]] が成功すると[[コレクション]]に変換されます
[SRC[>>1]]。

;; [10] しかし実装によってはこれに従っていません [SRC[>>1]]。

[7] [[LNR]] は、[[ロック]]が破棄された時点で通常の[[資源]]に変換されていなければ、
削除されます。ここで[[ロック]]の破棄には、満期や [CODE(HTTP)@en[[[UNLOCK]]]]
の他、自身や親の[[コレクション]]の移動に伴うものも含まれます。 [SRC[>>1]]

[11] [[LNR]] では [CODE(URI)@en[[[DAV:lockdiscovery]]]] と
[CODE(URI)@en[[[DAV:supportedlock]]]] が定義されますが、
他の[[特性]]は定義される必要はありません [SRC[>>1]]。

[13] [CODE(HTTP)@en[[[LOCK]]]] [[要求]]に対する[[応答]]のみから
[[LNR]] か[[ロックされた空の資源]]かを判定する方法はありません [SRC[>>1]]。

* クライアントの動作

[4] [[クライアント]]は[[ロックされた空の資源]]も [[LNR]] も扱えなければ[['''なりません''']]
[SRC[>>1]]。

[12] [[クライアント]]は [CODE(HTTP)@en[[[LOCK]]]] の後 [CODE(HTTP)@en[[[PUT]]]]
のみ行い、 [CODE(HTTP)@en[[[MKCOL]]]] や [CODE(HTTP)@en[[[GET]]]]
を使わないことで、[[ロックされた空の資源]]も [[LNR]] も扱えます [SRC[>>1]]。

[15] [CODE(HTTP)@en[[[LOCK]]]] [[要求]]でどちらの種類でも新しい[[資源]]を作りたくない時には、
[CODE(HTTP)@en[[[If-Match:]] [[*]]]] を指定することができます [SRC[>>1]]。

[14] [CODE(HTTP)@en[[[LOCK]]]] [[要求]]で[[資源]]を作成して直後に
[CODE(HTTP)@en[[[COPY]]]] や [CODE(HTTP)@en[[[MOVE]]]] で上書きしたい時は、
[CODE(HTTP)@en[[[Overwrite:]] [[T]]]] を[[要求]]に指定するべきです [SRC[>>1]]。

[16] [CODE(HTTP)@en[[[LOCK]]]] [[要求]]で新しい[[資源]]を作ったものの、
それを削除したい時は、 [[LNR]] では [CODE(HTTP)@en[[[DELETE]]]]
が存在しないとみなして失敗しますし、 [[ロックされた空の資源]]では
[CODE(HTTP)@en[[[UNLOCK]]]] で自動的に削除されることがないので、
[CODE(HTTP)@en[[[UNLOCK]]]] と [CODE(HTTP)@en[[[DELETE]]]]
の両方を送信し、一方のみでエラーになっても無視すると良いです [SRC[>>1]]。