[8] [DFN[[CODE(HTTP)[[[412]]]]]] ([DFN[[[Precondition Failed]]]]) は、
[[条件付き要求]]の条件が満たされなかったことを示す[[状態符号]]です。

* 仕様書

[REFS[
- [5] '''[CITE@en[RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests]] ([TIME[2014-09-11 10:02:44 +09:00]] 版) <https://tools.ietf.org/html/rfc7232#section-4.2>'''
- [3] [CITE@en[RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests]] ([TIME[2014-09-11 10:02:44 +09:00]] 版) <https://tools.ietf.org/html/rfc7232#section-3.1>
- [20] [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>
- [22] [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>
- [24] [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>
- [25] [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.4>
- [15] [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>
- [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-12.1>
- [9] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=96>
- [11] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=99>
- [13] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=105>
]REFS]

* 意味

[6] [CODE(HTTP)[[[412]]]] は、[[要求ヘッダー]]に指定された条件のいくつかを[[鯖]]で試験した結果[[偽]]だったことを示す[[状態符号]]です
[SRC[>>5]]。

[7] なお、事前条件が満たされない場合必ず [CODE(HTTP)[[[412]]]] が返されるわけではありません。
[CODE(HTTP)[[[304]]]] や [CODE(HTTP)[[[2xx]]]] が返されることもありますし、
事前条件全体が無視される可能性もあります。詳しくは
[CODE(HTTP)@en[[[If-Modified-Since:]]]], [CODE(HTTP)[[[If-Unmodified-Since:]]]],
[CODE(HTTP)@en[[[If-Match:]]]], [CODE(HTTP)@en[[[If-None-Match:]]]],
[CODE(HTTP)@en[[[If-Range:]]]] の各項を参照してください。

* 文脈

[4] [[起源鯖]]は、[[要求]]に [CODE(HTTP)@en[[[If-Match:]]]] や
[CODE(HTTP)[[[If-None-Match:]]]] が指定されていてその条件が満たされなかった場合、
特定の条件で [CODE(HTTP)[[[2xx]]]] や [CODE(HTTP)[[[304]]]] を返せる場合を除き、
[CODE(HTTP)[[[412]]]] [[応答]]を返さなければ[['''なりません''']] [SRC[>>3]]。

[18] [CODE(HTTP)@en[[[If:]]]] [[ヘッダー]]で指定された条件を満たさない時は、
[CODE(HTTP)[[[412]]]] [[応答]]を返さなければなりません [SRC[>>17, >>25]]。

[23] [CODE(HTTP)@en[[[LOCK]]]] [[要求]]に [CODE(HTTP)@en[[[If:]]]] 
が指定された場合で[[対象資源]]がその範囲内にない場合には、 
[CODE(HTTP)[[[412]]]] [[応答]]を返すことができます。
[[応答]]には[[事前条件符号]] [CODE(XMLe)@en[[[lock-token-matches-request-uri]]]]
を指定できます。 [SRC[>>24]]

[16] [CODE(HTTP)@en[[[Overwrite:]]]] [[ヘッダー]]の指定により上書きできない時には、
[CODE(HTTP)[[[412]]]] [[応答]]を返さなければ[['''なりません''']] [SRC[>>15, >>17]]。

[10] [CODE(HTTP)@en[[[SUBSCRIBE]]]] [[要求]]が [CODE(HTTP)@en[[[CALLBACK:]]]]
[[ヘッダー]]や [CODE(HTTP)@en[[[NT:]]]] [[ヘッダー]]の要件を満たさない時にも
[CODE(HTTP)[[[412]]]] [[応答]]が使われます [SRC[>>9]]。

[12] [CODE(HTTP)@en[[[UNSUBSCRIBE]]]] [[要求]]が [CODE(HTTP)@en[[[SID:]]]] [[ヘッダー]]の要件を満たさない時にも
[CODE(HTTP)[[[412]]]] [[応答]]が使われます [SRC[>>11]]。

[14] [CODE(HTTP)@en[[[NOTIFY]]]] [[要求]]が[[ヘッダー]]の要件を満たさない時にも
[CODE(HTTP)[[[412]]]] [[応答]]が使われます [SRC[>>13]]。

[19] [[WebDAV]] [[鯖]]は[[要求]]が[[条件付きヘッダー]]を含まない時に
[CODE(HTTP)[[[412]]]] [[応答]]を返しては[['''なりません''']] [SRC[>>17]]。

[21] [CODE(HTTP)@en[[[COPY]]]] [[要求]] [SRC[>>20]] や
[CODE(HTTP)@en[[[MOVE]]]] [[要求]] [SRC[>>22]]
において [CODE(HTTP)@en[[[Overwrite:]] [[F]]]]
により失敗した場合、 [CODE(HTTP)[[[412]]]] [[応答]]を返さなければ[['''なりません''']]。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[2] RFC 2068 & 2616 (HTTP/1.1) 10.4.13 412 Precondition Failed
]FIGCAPTION]

> The precondition given in one or more of the request-header fields
evaluated to false when it was tested on the server. This response
code allows the client to place preconditions on the current resource
metainformation (header field data) and thus prevent the requested
method from being applied to a resource other than the one intended.

1つ以上の[[要求頭欄]]で与えられた事前条件をサーバーで検査した時に偽と評価されました。
この応答符号によって、クライアントが現在の資源メタ情報 (頭欄データ)
についての事前条件を配置することができ、従って要求した method
が意図したものとは違った資源に適用されてしまうことを防げます。
]FIG]

[1] [CITE@en[RFC 7252 - The Constrained Application Protocol (CoAP)]]
( ([TIME[2014-06-27 00:59:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc7252#section-5.9.2.8>

[413] [CITE@ja[Put Page]]
( ([TIME[2014-11-03 07:41:50 +09:00]] 版))
<http://msdn.microsoft.com/ja-jp/library/azure/ee691975.aspx>

[FIG(quote)[
[FIGCAPTION[
[26] [CITE@en[Heroku API]]
([TIME[2015-03-06 08:13:03 +09:00]] 版)
<https://legacy-api-docs.herokuapp.com/>
]FIGCAPTION]

> 412 Precondition Failed
> This API has been deprecated.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[27] [CITE[JSON Mail Access Protocol Specification (JMAP)]]
([TIME[2016-03-11 14:55:42 +09:00]] 版)
<http://jmap.io/spec.html>
]FIGCAPTION]

> 412: Precondition Failed
> This means either the JMAP version specified in an X-JMAP-Version header, or an extension/version specified in an X-JMAP-Extensions header is not supported by the server. There is no content in the response.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[28] [CITE[Orchestrate]]
([[Orchestrate]]著, [TIME[2016-08-06 01:32:02 +09:00]])
<https://orchestrate.io/docs/apiref#errors>
]FIGCAPTION]

> 412	item_version_mismatch	The version of the item does not match.
> 412	item_already_present	The item is already present.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[29] [CITE[RESTful HTTP API - Fedora 4.0 Documentation - DuraSpace Wiki]]
([TIME[2017-03-02 23:33:52 +09:00]])
<https://wiki.duraspace.org/display/FEDORA40/RESTful+HTTP+API>
]FIGCAPTION]

> 412 Destination path already exists

]FIG]


[30] [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.2>