-
Notifications
You must be signed in to change notification settings - Fork 4
/
884.txt
141 lines (110 loc) · 9.13 KB
/
884.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
[519] [DFN[[CODE(HTTP)[[[409]]]]]] ([DFN[[[Conflict]]]])
は、[[対象資源]]の現在の状態と[[要求]]との不整合によって[[要求]]を処理できなかったことを示す[[状態符号]]です
[SRC[>>514]]。
[EG[
[520] 例えば、編集フォームが含まれるページを表示してからそのフォームを[[提出]]するまでの間に[[提出]]先の[[資源]]が変更されている場合、
[[鯖]]は [CODE(HTTP)[[[409]]]] を返すことができます。
]EG]
* 仕様書
[REFS[
- [514] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.5.8>'''
- [507] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4.3.4>
- [11] [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.2>
- [8] [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.3>
- [10] [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.7>
- [13] [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>
- [16] [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.9>
- [17] [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>
- [18] [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.11>
- [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-14.5>
- [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-16>
- [5] [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-16>
- [20] [CITE@en[RFC 5789 - PATCH Method for HTTP]] ([TIME[2014-09-22 15:11:26 +09:00]] 版) <http://tools.ietf.org/html/rfc5789#section-2.2>
]REFS]
* 意味
[516] [CODE(HTTP)[[[409]]]] は、[[対象資源]]の現在の状態との衝突のために[[要求]]が完了できなかったことを示します
[SRC[>>514]]。
[517] [CODE(HTTP)[[[409]]]] は、[[利用者]]が衝突を解決して[[要求]]を再提出できるかもしれない場合に使います
[SRC[>>514, >>3]]。
;; [4] そうでない場合は [CODE(HTTP)[[[403]]]] を使えます。
* 構文
[518] [[鯖]]は、[[利用者]]が衝突の原因を認識できる十分な情報を [[payload]]
に含める[['''べきです''']] [SRC[>>514]]。
[2] [[payload body]] には [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の
[CODE(XMLe)@en[[[error]]]] [[要素]]を使うことができます [SRC[>>1]]。
[6] [[WebDAV]] [[鯖]]は、適切な[[事前条件符号]]や[[事後条件符号]]があれば
[[XML]] を返す[['''べきです''']]。それ以外のエラーでは空の [[payload body]]
を返しても構いませんし、独自の[[要素]]を使ってエラーを表しても構いません。 [SRC[>>5]]
[7] 次の[[事前条件]]や[[事後条件]]があります。
[FIG(short list)[
- [CODE(XMLe)@en[[[lock-token-matches-request-uri]]]]
- [CODE(XMLe)@en[[[preserved-live-properties]]]]
]FIG]
* 文脈
[513] [[起源鯖]]は、 [CODE(HTTP)@en[[[PUT]]]] の[[表現]]が当該[[対象資源]]に関する変更できない[[鯖]]の制約を
(あれば) 満たしているか検証する[['''べきです''']]。満たしていない時には、
満たすように変形を加えるか、適切な説明とともにエラーを返す[['''べきです''']]。
[[状態符号]]としては、 [CODE(HTTP)[[[409]]]] を使うことができます。 [SRC[>>507]]
[12] [CODE(HTTP)@en[[[PROPPATCH]]]] [[要求]]に対する [CODE(HTTP)[[[207]]]]
[[応答]]内の [CODE(XMLe)@en[[[status]]]] [[要素]]では、
指定された値が[[特性]]の意味的に正しくないことを表すために使うことができます [SRC[>>11]]。
[9] [CODE(HTTP)@en[[[MKCOL]]]] [[要求]] [SRC[>>8]] や
[CODE(HTTP)@en[[[PUT]]]] [[要求]] [SRC[>>10]] や
[CODE(HTTP)@en[[[LOCK]]]] [[要求]] [SRC[>>17]]
で指定された[[資源]]の親となるべき[[コレクション]]が存在しない時は、
[CODE(HTTP)[[[409]]]] [[応答]]を返さなければ[['''なりません''']]。
[14] [CODE(HTTP)@en[[[COPY]]]] [[要求]] [SRC[>>13]] や
[CODE(HTTP)@en[[[MOVE]]]] [[要求]] [SRC[>>16]]
で指定された終点の[[資源]]の親となるべき[[コレクション]]が存在しない時は、
[CODE(HTTP)[[[409]]]] [[応答]]を返すことができます。
[15] [CODE(HTTP)@en[[[COPY]]]] [[要求]]や [CODE(HTTP)@en[[[MOVE]]]]
[[要求]]において[[生特性]]を始点と終点とで同じ動作にできなかった時には、
[[状態符号]] [CODE(HTTP)[[[409]]]] と[[事後条件符号]]
[CODE(XMLe)@en[[[preserved-live-properties]]]] を使うことができます [SRC[>>5]]。
[19] [CODE(HTTP)@en[[[UNLOCK]]]] [[要求]]において[[対象資源]]が[[ロック]]されていない場合や、
[[ロック]]が[[対象資源]]を含んでいない場合には、 [CODE(HTTP)[[[409]]]] [[応答]]を返し、
[[事前条件符号]]として [CODE(XMLe)@en[[[lock-token-matches-request-uri]]]] を使う[['''べきです''']]
[SRC[>>18, >>5]]。
[21] [CODE(HTTP)@en[[[PATCH]]]] [[要求]]の[[パッチ文書]]の適用により[[衝突]]が発生する場合には、
[CODE(HTTP)[[[409]]]] [[応答]]を返すことができます [SRC[>>20]]。
* 歴史
[FIG(quote)[
[FIGCAPTION[
[515] RFC 2068 & 2616 (HTTP/1.1) 10.4.10 409 Conflict
]FIGCAPTION]
> The request could not be completed due to a conflict with the current
state of the resource. This code is only allowed in situations where
it is expected that the user might be able to resolve the conflict
and resubmit the request. The response body SHOULD include enough
information for the user to recognize the source of the conflict.
Ideally, the response entity would include enough information for the
user or user agent to fix the problem; however, that [DEL[may]] [INS[might]] not be
possible and is not required.
資源の現在の状態と衝突したために、要求は完了できませんでした。
この符号は、利用者が衝突を解決可能で要求を再提出できそうに思われる場合にのみ認められます。
応答本体は、利用者が衝突の原因を認識できる十分な情報を含んでいる'''べきです'''。
理想的には、応答実体は利用者又は利用者エージェントが問題を修正するのに十分な情報を含んでいるのがよいでしょうが、それは可能ではないかもしれませんし、必須ではありません。
> Conflicts are most likely to occur in response to a PUT request. [INS[For example, if]] [DEL[If]] versioning [DEL[is]] [INS[were]] being used and the entity being PUT includes changes to
a resource which conflict with those made by an earlier (third-party)
request, the server [DEL[MAY]] [INS[might]] use the 409 response to indicate that it
can't complete the request. In this case, the response entity [DEL[SHOULD]] [INS[would likely]]
contain a list of the differences between the two versions in a
format defined by the response Content-Type.
衝突は [CODE(HTTP)[[[PUT]]]] 要求への応答で最も起こりそうです。
例えば、版管理が行われており、 [CODE(HTTP)[PUT]] している実体が以前の (第3者による)
要求による変更と衝突する変更を含んでいるとしたら、
サーバーは [CODE(HTTP)[409]] 応答を使って要求が完了できなかったことを示すことができるでしょう。
この場合には、応答実体は応答 [CODE(HTTP)[[[Content-Type]]]]
で定義された書式によって、2つの版の差分の一覧を含めることとなるでしょう。
]FIG]
* 関連
[22] 処理の対象が[[ロック]]されている場合には、 [CODE(HTTP)[[[423]]]]
を使うことができます。
[FIG(quote)[
[FIGCAPTION[
[23] [CITE[Orchestrate]]
([[Orchestrate]]著, [TIME[2016-08-06 01:32:02 +09:00]])
<https://orchestrate.io/docs/apiref#errors>
]FIGCAPTION]
> 409 patch_conflict The patch could not be applied due to a potentially inconsistent state.
]FIG]