COPY

要求メソッド COPY (HTTP)

[50] COPY は、資源を複製することを求める要求メソッドです。

仕様書

意味

[7] COPY メソッドは、要求URLによって識別される資源の複製を Destination: ヘッダーで識別される URL の資源に複製するものです >>6。

[13] 安全なメソッドではありませんが、冪等メソッドです >>6。

[2] 書き込みロックの適用対象となります >>1。

構文

[8] Destination: ヘッダーを指定しなければなりません >>6。

[20] クライアントは WebDAV コレクションにおいて Depth: 0 と Depth: infinity を指定できます >>6。

[33] 終点に既に資源が存在する場合、上書きするかエラーとするかは Overwrite: ヘッダーに依存します。 なお上書きする場合、元の資源が削除されて新しい資源が作成される形になるか、 一部の生特性を保持したまま上書きするかは定かではありません (>>31)。 確実に生特性をリセットしたいときは、 DELETE してから COPY するべきです >>6。

処理

[10] 要求URLによって識別される資源が始点 (source) 、 Destination: ヘッダーの URL によって識別される資源が終点 (destination) です >>6。

[9] 正確な動作は始点となる資源に依存します >>6。

[11] WebDAV に従う資源は COPY メソッドに対応しなければなりません。 しかし資源を複製できる保証はありません。 >>6

[12] 例えば同じ鯖にみえても、資源によって別のプログラムにより制御されているかもしれません >>6。

[40] 終点資源が異なるシステムなどの理由で複製できない時は、 502 応答を返すことができます >>6。

[37] 始点と終点が同じ資源だった場合には、 403 応答を返すことができます >>6。

[38] 終点資源を作る前に中間のコレクションをいくつか作らないといけないときには、 409 応答を返すことができます。 WebDAV 鯖は中間のコレクションを自動的に作ってはなりません。 >>6

[15] 始点が WebDAV に従う資源であり、コレクションでない場合、 始点資源とできるだけ近い状態と動作の資源を終点に作ります。 ただし始点と終点で鯖が管理できる範囲を超えて環境に違いがあるかもしれませんから、 完全に複製することはできないかもしれません。 完了後の一方に対する変更は他方には適用されない状態になります。 >>6

[18] 終点が資源に写像されていない URL だった場合は、 PUT 要求と同様にして新しい資源を作成します。 DAV:creationdate など資源の作成に関わる生特性も、 適切に設定するべき (should) です。 >>6

[19] 鯖は WebDAV コレクションにおいて Depth: 0 と Depth: infinity に対応しなければなりません >>6。 Depth: ヘッダーが指定されなかった場合は、 infinity として扱わなければなりません >>6。

[23] WebDAV コレクションを Depth: 0 で複製する場合、コレクション自体と特性は複製しますが、 内部メンバーURLで識別される資源は複製しません >>6。

[21] WebDAV コレクションを Depth: infinity で複製する場合、始点資源と内部メンバーを終点資源とそれに対する相対的な位置へとすべてのコレクション階層にわたって複製します。 ただし /A/ から /A/B/ へといったような複製は注意して扱わないと無限ループになってしまいます。 >>6

[22] 無限ループになってはならないとはされていませんが、 常識的には避けるように実装するべきでしょうか。

[24] 要求の Destination: 以外のヘッダーは、 複製する各資源に対して適用しなければなりません >>6。

[25] コレクションのメンバーの複製時には、 Destination: ヘッダーの URL 自体ではなく、コレクションの階層内の位置に応じた値を使います >>6。

[26] 例えば http://example.com/a/ が始点で http://example.com/b/ が終点なら、 http://example.com/a/c/d は htp://example.com/b/c/d へと複製します >>6。

[27] WebDAV コレクションの複製完了後には終点において一貫したURL名前空間を作っていなければなりません。 内部のコレクションの複製中にエラーが発生した時は、 そのコレクションのメンバーの資源を複製してはなりません (つまりその部分木を飛ばすこととなります)。それによって名前空間が一貫しなくなることがあります。 しかしエラーの検出後にも元の複製操作をできる限り完了させようと試みるべきです (エラーになっていない部分木は複製しようと試みるべきです)。 またコレクション以外の資源の複製でエラーが発生した時も、 できるだけ複製するよう試みるべきです。 >>6

[16] 始点資源の死特性はすべて終点資源に複製するべきです。 始点資源の生特性も同様に動作する終点資源の生特性として複製するべきですが、 必ずしも同じ値でなくても構いません。生特性を死特性に変換するべきではありません。 >>6 生特性を終点資源において同じ動作とできなかった時には、状態符号 409 と事後条件符号 preserved-live-properties を使うことができます >>47。

[17] なお、存在しないことが意味を持つ生特性は終点資源には存在しない状態になることもあります >>6。
[45] 各生特性の項も参照。

[30] 要求に Overwrite: F が含まれている場合、 終点の URL に資源が存在する場合には、 複製は失敗しなければなりません >>6, >>42。 この場合 412 応答を返さなければなりません >>6, >>42。

[43] Overwrite: ヘッダーが省略された場合の既定値は T です >>42。

[31] 終点資源を上書きする場合には、その具体的な動作は種々の要因により変わり得ます。 複製の前に元の終点資源を削除することもできますし、 生特性を保持しつつその場で上書きすることもできます。 >>6

[52] RFC 3253 は RFC 2518 の明確化と称して、 既存の資源を削除するのではなく、上書きするのである、 この違いは版管理に影響する >>51 と述べていましたが、 RFC 4918 はそれとは異なる立場を取っているようです。

[32] コレクションを上書きする場合には、終点資源のメンバーは始点資源のメンバーに相当するもののみでなければなりません。 元々終点のコレクションにメンバーがあっても、それを併合する形となってはなりません。 >>6

[39] 終点資源がロックされている場合には、 423 応答を返すことができます。その場合事前条件符号 lock-token-submitted >>46 を含めるべきです。 >>6

[4] WebDAV に従う始点の資源が直接書き込みロックされていても、 ロックは複製してはなりません >>3。

[5] 複製先のコレクションがロックされていれば、 複製後にそれによって間接的にロック状態となることはあります。

[34] 複製に成功して新しい資源が作成された際には、 201 応答を返します >>6。 3xx を返してはなりません >>44。

[35] 複製に成功して既存の終点資源に書き込まれた際には、 204 応答を返します >>6。

[28] WebDAV コレクションの複製中に要求URL以外の複製でエラーが発生した場合には、 207 応答により、失敗した資源の URL とエラーを記述して返さなければなりません >>6。

[36] いくつかの資源がロックにより複製できなかったなら、 207 応答内で 423 を使うことができます >>6。

[29] 207 応答内では 424 や 201 は使うべきではありません >>6。

[41] ストレージ容量が理由で複製できない時には、 507 応答を返すことができます >>6。

[14] 応答はキャッシュ不可能です >>6。

歴史

[49] RFC 2518 では propertybehavior 要素 >>48 を要求の payload body の根要素として使っていました。 RFC 4918 では削除されています。

[53] RESTful HTTP API - Fedora 4.0 Documentation - DuraSpace Wiki () <https://wiki.duraspace.org/display/FEDORA40/RESTful+HTTP+API>

COPY Copy a resource (and its subtree) to a new location

[54] RFC 8144 - Use of the Prefer Header Field in Web Distributed Authoring and Versioning (WebDAV) () <https://tools.ietf.org/html/rfc8144#section-3.1>

[55] RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning) () <https://tools.ietf.org/html/rfc3253#section-3.14>

[56] RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning) () <https://tools.ietf.org/html/rfc3253#section-5.7>

[57] RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning) () <https://tools.ietf.org/html/rfc3253#section-8.7>

[58] RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning) () <https://tools.ietf.org/html/rfc3253#section-9.6>

[59] RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning) () <https://tools.ietf.org/html/rfc3253#section-12.10>

[60] RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning) () <https://tools.ietf.org/html/rfc3253#section-14.6>

[61] RFC 4791 - Calendaring Extensions to WebDAV (CalDAV) () <https://tools.ietf.org/html/rfc4791#section-5.3.2.1>