[4] [DFN[[RUBYB[[[理由句]]]@en[reason-phrase]]]]は、[[状態行]]において[[状態符号]]に添えて記載する短い文字列です。

* 仕様書

[REFS[
- [3] '''[CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-3.1.2>'''
- [15] [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-6.1>
]REFS]

* 意味

[6] [[理由句]]は数値の[[状態符号]]に関連付けられたテキストの説明です [SRC[>>3]]。

[7] 初期の[[インターネット]]のプロトコルが対話的なテキストクライアントでよく用いられたことに因んだもの
[SRC[>>3]] とされています。

* 構文

[5] [[理由句]]は、 [[HTAB]]、[[SP]]、[[VCHAR]]、[[obs-text]]
で構成される零文字以上の任意の文字列 [SRC[>>3]] とされています。

[FIG(railroad)[
= *
== |
=== [[VCHAR]]
=== [[HTAB]]
=== [[SP]]
]FIG]

;; [18] [[非ASCII文字]]は使えません。

* 文脈

[19] [[理由句]]は次の場面で使われます。

[FIG(short list)[
- [[状態行]]
- [CODE(HTTP)@en[[[oauth_error_text]]]]
- [CODE[statusText]]
]FIG]

[20] [[HTTP/2]] には[[理由句]]はありません。

;; [23] [[SPDY]] にはありましたが [[HTTP/2]] では削られています。

[33] 
[[応答]]の [CODE[statusText]] の既定値は[[空文字列]]です
[SRC[>>32]]。
[[理由句]]のない[[プロトコル]]や
[[API]] で作成した[[応答]]で未設定の場合に[[空文字列]]のままとなります。

* 処理

[16] [[鯖]]は任意の[[理由句]]を記述できます。

[8] [[クライアント]]は[[理由句]]の内容を無視する[['''べきです''']] [SRC[>>3]]。

;; [12] [[理由句]]にはしばしば有用な情報が含まれているので、[[開発ツール]]の類では表示できるようになっているべきかもしれません。

* 典型的な理由句

[13] [[状態符号]]の仕様書には、典型的な[[理由句]]が添えられています。

;; [14] その一覧は[[状態符号]]の項を参照してください。

[17] 仕様書の[[理由句]]は[RUBYB[推奨]@en[recommendation]]に過ぎず、
[[プロトコル]]の動作に影響を与えず好きな値にできます [SRC[>>15]]。

* 長さ

[21] 仕様上の長さ制限はありません。通常は十数文字程度の短い英単語列です。

;; [[空白]]が含まれるものも普通です。

[22] [[Firefox]] は、数十MBあっても正常に扱えます (少なくてもそこでエラーにはなりません)。
[[IE]] も同様のようですが、 [[Firefox]] と比べても極めて時間がかかります (ので計測不能)。
[TIME[2015-06-16T11:37:57.800Z]]

[24] [[Chrome]] は[[ヘッダー部]]全体の長さ制約があります。

* メタ変数 [CODE(CGI)@en[RESPONSE_REASON]] (CGI)

[FIG(quote)[
[FIGCAPTION[
[1] [[RFC 3050]] ([[SIP−CGI/1.1]]) 5.5.1.15 RESPONSE_REASON
]FIGCAPTION]

>
-        RESPONSE_REASON  =  Reason-Phrase

>If the message triggering the script was a response, this variable
indicates the textual string specified in the response.

スクリプトの引き金となったメッセージが応答である場合、
この変数は応答中に指定される文字列を示します。

]FIG]

[2] この変数が必須なのか何なのか RFC 3050 には書いてないんですが、 [CODE(CGI)[[[RESPONSE_STATUS]]]] が提供される場合にはこちらも必ず提供する必要があるんじゃないでしょうか。空文字列の可能性もあるとはいえ。

* 実装

[11] [[鯖]]側の[[アプリケーション]]の実装のための各言語のライブラリー等では、
[[応答]]に含めるべき[[状態符号]]と共に[[理由句]]を指定できることもあれば、
できないこともあります。指定できない時や、指定できても省略されている時は、
ライブラリー等、あるいは[[鯖]]の実装によって[[理由句]]が補われるのが普通です。

* メモ

[9] [[理由句]]は多くの場合[[状態符号]]から自動的に決まる文字列 (仕様書に示されている文字列)
が使われますが、仕様書の版や実装によって微妙に異なっていることもあります。

[10] [[鯖]]によっては、[[状態符号]]で表されないより詳細な情報を[[理由句]]に含めることもあります。

[25] [CITE@en[PSGI should allow the 0th array element to be a full HTTP status line · Issue #23 · plack/psgi-specs]]
([TIME[2015-07-09 00:55:29 +09:00]] 版)
<https://github.com/plack/psgi-specs/issues/23>

[26] [CITE@en[PSGI should allow the 0th array element to be a full HTTP status line · Issue #23 · plack/psgi-specs]]
([TIME[2017-06-07 13:48:59 +09:00]])
<https://github.com/plack/psgi-specs/issues/23>

[27] [CITE@en[Make status message default to the empty byte sequence]]
([[annevk]]著, [TIME[2018-04-25 01:21:13 +09:00]])
<https://github.com/whatwg/fetch/commit/0dec453f642c1fe57e6e7627c9a66cf7f8b8394d>

[28] [CITE@en[Response `statusText` is ambiguous and unclear for HTTP/2 · Issue #599 · whatwg/fetch]]
([TIME[2018-04-25 11:01:27 +09:00]])
<https://github.com/whatwg/fetch/issues/599>

[29] [CITE@en[Response.redirect() results in status message still being OK? · Issue #664 · whatwg/fetch]]
([TIME[2018-04-25 11:02:22 +09:00]])
<https://github.com/whatwg/fetch/issues/664>

[30] [CITE@en[Make status message default the empty byte sequence by annevk · Pull Request #600 · whatwg/fetch]]
([TIME[2018-04-25 11:03:16 +09:00]])
<https://github.com/whatwg/fetch/pull/600>

[31] [CITE@en[1397646 - For HTTP/2 statusText (both Fetch and XMLHttpRequest) should always be the empty byte sequence]]
([TIME[2018-05-03 11:28:45 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1397646>

[32] [CITE@en[Change Response's statusText's default]]
([[annevk]]著, [TIME[2018-11-21 20:27:28 +09:00]])
<https://github.com/whatwg/fetch/commit/a3d423f6921148183b08ccd1afd741ff22698534>

[34] [CITE@en[Change new Response() statusText default? · Issue #698 · whatwg/fetch]]
([TIME[2019-04-19 14:47:59 +09:00]])
<https://github.com/whatwg/fetch/issues/698>

[35] [CITE@en[Change Response's statusText's default by annevk · Pull Request #836 · whatwg/fetch]]
([TIME[2019-04-19 14:48:21 +09:00]])
<https://github.com/whatwg/fetch/pull/836>