[14] [CODE(HTTP)@en[[[Prefer:]] [DFN[[[handling]]]]]] は、
[[鯖]]の[[誤り]]からの回復処理に関する[[クライアント]]の希望を示すものです。

* 仕様書

[REFS[
- [3] '''[CITE@en[RFC 7240 - Prefer Header for HTTP]] ([TIME[2014-07-26 04:24:01 +09:00]] 版) <https://tools.ietf.org/html/rfc7240#section-4.4>'''
- [1] [CITE@en[RFC 7240 - Prefer Header for HTTP]] ([TIME[2014-07-26 04:24:01 +09:00]] 版) <https://tools.ietf.org/html/rfc7240#section-2.1>
]REFS]

* 意味

[4] [CODE(HTTP)@en[[[handling]]]] は、[[クライアント]]が[[鯖]]に対して、
[[要求]]の処理中に[[誤り条件]]に遭遇した際にどう処理してほしいかを示すものです [SRC[>>3]]。

[EG[
[5] 例えば[[要求]]の [[payload]] にわずかに構文上や意味上の[[誤り]]があり、
それでも[[鯖]]は処理を成功させられる場合に、
[[鯖]]は [CODE(HTTP)[[[4xx]]]] [[応答]]を返すか処理を続けるかを
[CODE(HTTP)@en[[[handling]]]] を参考に決めることができます [SRC[>>3]]。
]EG]

* 構文

[6] [CODE(HTTP)@en[[[handling]]]] には値として [CODE(HTTP)@en[[[strict]]]]
か [CODE(HTTP)@en[[[lenient]]]] を指定します。[[引数]]はありません。 [SRC[>>3]]

[FIG(short list)[
- [CODE(HTTP)@en[[[strict]]]]
- [CODE(HTTP)@en[[[lenient]]]]
]FIG]

[7] 値は[[大文字・小文字不区別]]です [SRC[>>3]]。

* 処理モデル

[12] [CODE(HTTP)@en[handling=strict]] と [CODE(HTTP)@en[handling=lenient]]
は排他的で、同時に両方指定することはできません。両方指定されている場合は、
どちらも指定されていないものとして扱うことができます。 [SRC[>>3]]

;; [13] [CODE(HTTP)@en[[[Prefer:]]]] 全体の処理モデルにより[[好み字句]]の重複は最初のもの以外無視されることになっているのと矛盾する気もしますが。。。

[15] どのような[[誤り]]が対象となっているのか仕様上明記されていません。
[[HTTP]] その他の仕様上要求されている誤りを [CODE(HTTP)@en[[[handling]]=[[lenient]]]]
により無視して良いのか、あるいは [[HTTP]] その他の仕様上要求されている誤りからの回復方法を
[CODE(HTTP)@en[[[handling]]=[[strict]]]] により無視して良いのかは明らかではありません。

[EG[
[16] 例えば [[HTTP/1.1]] [[鯖]]は [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]がない[[要求]]に
[CODE(HTTP)[[[400]]]] を返すことになっていますが、 [CODE(HTTP)@en[[[Prefer:]] [[handling]]=[[lenient]]]]
が指定されていたとしても処理を続けて良いとは思えません。
]EG]

* [CODE(HTTP)@en[handling=strict]]

[8] [CODE(HTTP)@en[[[handling]]=[DFN[[[strict]]]]]] は、
[[要求]]に[[誤り]]が含まれていれば[[鯖]]がそれを拒絶することを[[クライアント]]が望んでいることを示します
[SRC[>>3]]。

[9] もっとも[[鯖]]はそれに従う義務はなく、[[誤り]]から回復しても構いません [SRC[>>3]]。

* [CODE(HTTP)@en[handling=lenient]]

[10] [CODE(HTTP)@en[[[handling]]=[DFN[[[lenient]]]]]] は、
[[要求]]に[[誤り]]が含まれていても[[鯖]]がそれを処理することを[[クライアント]]が望んでいることを示します
[SRC[>>3]]。

[11] もちろん[[鯖]]はそれに従う義務はなく、[[誤り]]を表す[[応答]]を返しても構いません。

* 関連

[17] [[OData]] は [CODE(HTTP)@en[[[handling]]=[[lenient]]]]
を使わないで独自の [CODE(HTTP)@en[[[odata.continue-on-error]]]] を使っています。

* メモ

[2] [[RFC 7240]] には [CODE(HTTP)@en[[[Prefer:]] Lenient]] という例が示されています [SRC[>>1]] が、
[CODE(HTTP)@en[[[handling]]=[[lenient]]]] の誤りと思われます。