[50] [DFN[[CODE(HTTP)@en[[[COPY]]]]]] は、[[資源]]を複製することを求める[[要求メソッド]]です。

* 仕様書

[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#section-7>
- [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.6>
- [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-9.8>'''
- [42] [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.6>
- [44] [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>
- [46] [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>
- [47] [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]

* 意味

[7] [CODE(HTTP)@en[[[COPY]]]] [[メソッド]]は、[[要求URL]]によって識別される[[資源]]の複製を
[CODE(HTTP)@en[[[Destination:]]]] [[ヘッダー]]で識別される [[URL]] の[[資源]]に複製するものです [SRC[>>6]]。

[13] [[安全なメソッド]]ではありませんが、[[冪等メソッド]]です [SRC[>>6]]。

[2] [[書き込みロック]]の適用対象となります [SRC[>>1]]。

* 構文

[8] [CODE(HTTP)@en[[[Destination:]]]] [[ヘッダー]]を指定しなければ[['''なりません''']] [SRC[>>6]]。

[20] [[クライアント]]は [[WebDAV]] [[コレクション]]において
[CODE(HTTP)@en[[[Depth:]] [[0]]]] と [CODE(HTTP)@en[[[Depth:]] [[infinity]]]]
を指定できます [SRC[>>6]]。

[33] 終点に既に[[資源]]が存在する場合、上書きするかエラーとするかは
[CODE(HTTP)@en[[[Overwrite:]]]] [[ヘッダー]]に依存します。
なお上書きする場合、元の資源が削除されて新しい資源が作成される形になるか、
一部の[[生特性]]を保持したまま上書きするかは定かではありません (>>31)。
確実に[[生特性]]をリセットしたいときは、 [CODE(HTTP)@en[[[DELETE]]]]
してから [CODE(HTTP)@en[[[COPY]]]] するべきです [SRC[>>6]]。

* 処理

[10] [[要求URL]]によって識別される[[資源]]が[RUBYB[始点]@en[source]]、
[CODE(HTTP)@en[[[Destination:]]]] [[ヘッダー]]の [[URL]] によって識別される[[資源]]が[RUBYB[終点]@en[destination]]です [SRC[>>6]]。

[9] 正確な動作は始点となる資源に依存します [SRC[>>6]]。

[11] [[WebDAV]] に従う[[資源]]は [CODE(HTTP)@en[[[COPY]]]] [[メソッド]]に対応しなければ[['''なりません''']]。
しかし[[資源]]を複製できる保証はありません。 [SRC[>>6]]

[EG[
[12] 例えば同じ[[鯖]]にみえても、[[資源]]によって別の[[プログラム]]により制御されているかもしれません [SRC[>>6]]。
]EG]

[40] 終点資源が異なるシステムなどの理由で複製できない時は、
[CODE(HTTP)[[[502]]]] [[応答]]を返すことができます [SRC[>>6]]。

[37] 始点と終点が同じ[[資源]]だった場合には、 [CODE(HTTP)[[[403]]]] [[応答]]を返すことができます [SRC[>>6]]。

[38] 終点資源を作る前に中間の[[コレクション]]をいくつか作らないといけないときには、
[CODE(HTTP)[[[409]]]] [[応答]]を返すことができます。
[[WebDAV]] [[鯖]]は中間の[[コレクション]]を自動的に作っては[['''なりません''']]。 [SRC[>>6]]

[15] 始点が [[WebDAV]] に従う[[資源]]であり、[[コレクション]]でない場合、
始点資源とできるだけ近い状態と動作の[[資源]]を終点に作ります。
ただし始点と終点で[[鯖]]が管理できる範囲を超えて環境に違いがあるかもしれませんから、
完全に複製することはできないかもしれません。
完了後の一方に対する変更は他方には適用されない状態になります。 [SRC[>>6]]

[18] 終点が[[資源]]に[[写像]]されていない [[URL]] だった場合は、
[CODE(HTTP)@en[[[PUT]]]] [[要求]]と同様にして新しい[[資源]]を作成します。
[CODE(URI)[[[DAV:creationdate]]]] など[[資源]]の作成に関わる[[生特性]]も、
適切に設定する[RUBYB[べき]@en[should]]です。 [SRC[>>6]]

[19] [[鯖]]は [[WebDAV]] [[コレクション]]において
[CODE(HTTP)@en[[[Depth:]] [[0]]]] と [CODE(HTTP)@en[[[Depth:]] [[infinity]]]]
に対応しなければ[['''なりません''']] [SRC[>>6]]。
[CODE(HTTP)@en[[[Depth:]]]] [[ヘッダー]]が指定されなかった場合は、
[CODE(HTTP)@en[[[infinity]]]] として扱わなければ[['''なりません''']] [SRC[>>6]]。

[23] [[WebDAV]] [[コレクション]]を [CODE(HTTP)@en[[[Depth:]] [[0]]]]
で複製する場合、[[コレクション]]自体と[[特性]]は複製しますが、
[[内部メンバーURL]]で識別される[[資源]]は複製しません [SRC[>>6]]。

[21] [[WebDAV]] [[コレクション]]を [CODE(HTTP)@en[[[Depth:]] [[infinity]]]]
で複製する場合、始点資源と[[内部メンバー]]を終点資源とそれに対する相対的な位置へとすべての[[コレクション]]階層にわたって複製します。
ただし [CODE[/A/]] から [CODE[/A/B/]] へといったような複製は注意して扱わないと無限ループになってしまいます。 [SRC[>>6]]

;; [22] [[無限ループ]]になってはならないとはされていませんが、
常識的には避けるように実装するべきでしょうか。

[24] [[要求]]の [CODE(HTTP)@en[[[Destination:]]]] 以外の[[ヘッダー]]は、
複製する各[[資源]]に対して適用しなければ[['''なりません''']] [SRC[>>6]]。

[25] [[コレクション]]の[[メンバー]]の複製時には、 [CODE(HTTP)@en[[[Destination:]]]]
[[ヘッダー]]の [[URL]] 自体ではなく、[[コレクション]]の階層内の位置に応じた値を使います 
[SRC[>>6]]。

[EG[
[26] 例えば [CODE[http://example.com/a/]] が始点で [CODE[http://example.com/b/]]
が終点なら、 [CODE[http://example.com/a/c/d]] は [CODE[htp://example.com/b/c/d]]
へと複製します [SRC[>>6]]。
]EG]

[27] [[WebDAV]] [[コレクション]]の複製完了後には終点において[[一貫したURL名前空間]]を作っていなければ[['''なりません''']]。
内部の[[コレクション]]の複製中にエラーが発生した時は、
その[[コレクション]]の[[メンバー]]の[[資源]]を複製しては[['''なりません''']]
(つまりその[[部分木]]を飛ばすこととなります)。それによって名前空間が一貫しなくなることがあります。
しかしエラーの検出後にも元の複製操作をできる限り完了させようと試みる[['''べきです''']]
(エラーになっていない[[部分木]]は複製しようと試みるべきです)。
また[[コレクション]]以外の[[資源]]の複製でエラーが発生した時も、
できるだけ複製するよう試みる[['''べきです''']]。 [SRC[>>6]]

[16] 始点資源の[[死特性]]はすべて終点資源に複製する[['''べきです''']]。
始点資源の[[生特性]]も同様に動作する終点資源の[[生特性]]として複製する[['''べき''']]ですが、
必ずしも同じ値でなくても構いません。[[生特性]]を[[死特性]]に変換する[['''べきではありません''']]。 [SRC[>>6]]
[[生特性]]を終点資源において同じ動作とできなかった時には、[[状態符号]]
[CODE(HTTP)[[[409]]]] と[[事後条件符号]] [CODE(XMLe)@en[[[preserved-live-properties]]]]
を使うことができます [SRC[>>47]]。

;; [17] なお、存在しないことが意味を持つ[[生特性]]は終点資源には存在しない状態になることもあります [SRC[>>6]]。

;; [45] 各[[生特性]]の項も参照。

[30] [[要求]]に [CODE(HTTP)@en[[[Overwrite:]] [[F]]]] が含まれている場合、
終点の [[URL]] に[[資源]]が存在する場合には、
複製は失敗しなければ[['''なりません''']] [SRC[>>6, >>42]]。
この場合 [CODE(HTTP)[[[412]]]] [[応答]]を返さなければ[['''なりません''']] [SRC[>>6, >>42]]。

;; [43] [CODE(HTTP)@en[[[Overwrite:]]]] [[ヘッダー]]が省略された場合の既定値は
[CODE(HTTP)[[[T]]]] です [SRC[>>42]]。

[31] 終点資源を上書きする場合には、その具体的な動作は種々の要因により変わり得ます。
複製の前に元の終点資源を削除することもできますし、
[[生特性]]を保持しつつその場で上書きすることもできます。 [SRC[>>6]]

;; [52] [[RFC 3253]] は [[RFC 2518]] の明確化と称して、
既存の[[資源]]を削除するのではなく、上書きするのである、
この違いは版管理に影響する [SRC[>>51]] と述べていましたが、
[[RFC 4918]] はそれとは異なる立場を取っているようです。

[32] [[コレクション]]を上書きする場合には、終点資源の[[メンバー]]は始点資源の[[メンバー]]に相当するもののみでなければ[['''なりません''']]。
元々終点の[[コレクション]]に[[メンバー]]があっても、それを併合する形となってはなりません。
[SRC[>>6]]

[39] 終点資源が[[ロック]]されている場合には、 [CODE(HTTP)[[[423]]]]
[[応答]]を返すことができます。その場合[[事前条件符号]]
[CODE@en[[[lock-token-submitted]]]] [SRC[>>46]] を含める[['''べきです''']]。 [SRC[>>6]]

[4] [[WebDAV]] に従う始点の[[資源]]が直接[[書き込みロック]]されていても、
[[ロック]]は複製しては[['''なりません''']] [SRC[>>3]]。

;; [5] 複製先の[[コレクション]]が[[ロック]]されていれば、
複製後にそれによって間接的に[[ロック]]状態となることはあります。

[34] 複製に成功して新しい[[資源]]が作成された際には、 [CODE(HTTP)[[[201]]]]
[[応答]]を返します [SRC[>>6]]。
[CODE(HTTP)[[[3xx]]]] を返しては[['''なりません''']] [SRC[>>44]]。

[35] 複製に成功して既存の終点資源に書き込まれた際には、 [CODE(HTTP)[[[204]]]]
[[応答]]を返します [SRC[>>6]]。

[28] [[WebDAV]] [[コレクション]]の複製中に[[要求URL]]以外の複製でエラーが発生した場合には、
[CODE(HTTP)[[[207]]]] [[応答]]により、失敗した[[資源]]の [[URL]]
とエラーを記述して返さなければ[['''なりません''']] [SRC[>>6]]。

[36] いくつかの[[資源]]が[[ロック]]により複製できなかったなら、
[CODE(HTTP)[[[207]]]] [[応答]]内で [CODE(HTTP)[[[423]]]] を使うことができます [SRC[>>6]]。

[29] [CODE(HTTP)[[[207]]]] [[応答]]内では [CODE(HTTP)[[[424]]]] や
[CODE(HTTP)[[[201]]]] は使う[['''べきではありません''']] [SRC[>>6]]。

[41] [[ストレージ容量]]が理由で複製できない時には、 [CODE(HTTP)[[[507]]]]
[[応答]]を返すことができます [SRC[>>6]]。

[14] [[応答]]は[[キャッシュ不可能]]です [SRC[>>6]]。

* 歴史

[49] [[RFC 2518]] では [CODE(XMLe)@en[[[propertybehavior]]]] [[要素]] [SRC[>>48]]
を[[要求]]の [[payload body]] の[[根要素]]として使っていました。
[[RFC 4918]] では削除されています。

[REFS[
- [48] [CITE@en[RFC 2518 - HTTP Extensions for Distributed Authoring -- WEBDAV]] ([TIME[2014-09-14 13:14:29 +09:00]] 版) <http://tools.ietf.org/html/rfc2518#section-12.12>
- [51] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]] ([TIME[2014-11-16 18:49:48 +09:00]] 版) <http://tools.ietf.org/html/rfc3253#section-1.7>
]REFS]


[FIG(quote)[
[FIGCAPTION[
[53] [CITE[RESTful HTTP API - Fedora 4.0 Documentation - DuraSpace Wiki]]
([TIME[2017-03-02 23:34:14 +09:00]])
<https://wiki.duraspace.org/display/FEDORA40/RESTful+HTTP+API>
]FIGCAPTION]

> COPY Copy a resource (and its subtree) to a new location

]FIG]

[54] [CITE@en[RFC 8144 - Use of the Prefer Header Field in Web Distributed Authoring and Versioning (WebDAV)]]
([TIME[2017-04-19 23:22:44 +09:00]])
<https://tools.ietf.org/html/rfc8144#section-3.1>

[55] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]]
([TIME[2017-09-17 18:19:04 +09:00]])
<https://tools.ietf.org/html/rfc3253#section-3.14>

[56] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]]
([TIME[2017-09-17 18:19:04 +09:00]])
<https://tools.ietf.org/html/rfc3253#section-5.7>

[57] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]]
([TIME[2017-09-17 18:19:04 +09:00]])
<https://tools.ietf.org/html/rfc3253#section-8.7>

[58] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]]
([TIME[2017-09-17 18:19:04 +09:00]])
<https://tools.ietf.org/html/rfc3253#section-9.6>

[59] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]]
([TIME[2017-09-17 18:19:04 +09:00]])
<https://tools.ietf.org/html/rfc3253#section-12.10>

[60] [CITE@en[RFC 3253 - Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning)]]
([TIME[2017-09-17 18:19:04 +09:00]])
<https://tools.ietf.org/html/rfc3253#section-14.6>

[61] [CITE@en[RFC 4791 - Calendaring Extensions to WebDAV (CalDAV)]]
([TIME[2017-09-24 16:22:36 +09:00]])
<https://tools.ietf.org/html/rfc4791#section-5.3.2.1>