[1] [DFN[[RUBYB[[[状態行]]]@en[status line]]]]は、[[応答メッセージ]]の[[開始行]]です。

* 仕様書

[REFS[
- [2] [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>
- [8] [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#page-35>
- [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-14.22>
- [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-14.24>
- [19] [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.28>
]REFS]

* 構文

[3] [[状態行]]は、[[HTTPの版]]、[[SP]]、[[状態符号]]、
[[理由句]]、[[CRLF]] を順に連ねたものです [SRC[>>2]]。

[FIG(railroad)[
= [[HTTPの版]]
= [CODE(HTTP)[[[SP]]]]
= [[状態符号]]
= [CODE(HTTP)[[[SP]]]]
= [[理由句]]
= [[CRLF]]
]FIG]

[4] [[状態符号]]は[[応答メッセージ]]の意味を決める3桁の[[整数]]です。

[5] [[理由句]]は数値の[[状態符号]]に対応するテキストの説明を提供するものです [SRC[>>2]]。

[7] [[HTTPの版]]は、[[送信者]]が対応する[[HTTPの版]]を示すものです。

;; [11] [[HTTP/0.9]] [[メッセージ]]には[[状態行]]がありません。

* 構文解析

;; [32] [[HTTPの構文解析]]も参照。

[9] 構文上 [[SP]] の箇所は、[[空白]]1つ以上を区切りとみなして[[構文解析]]して構いません。
また、最初と [[CRLF]] 前の[[空白]]は無視して構いません。ここで[[空白]]は、
[[SP]]、[[HTAB]]、[[VT]]、[[FF]]、[[CR]] のことをいいます。 [SRC[>>8]]

[33] 実際には [[IE]] も [[Firefox]] も [[Chrome]] も、 [CODE(charname)@en[[[SP]]]]
のみを[[空白]]とみなすようです。 [[IE]] と [[Chrome]]
は複数の [CODE(charname)@en[[[SP]]]] も[[空白]]とみなします。
[[Firefox]] は [CODE(charname)@en[[[SP]]]] が複数あっても[[状態符号]]を正しく取得できますが、
[[理由句]]は ([[状態符号]]の前に [CODE(charname)@en[[[SP]]]] が複数あると)
おかしくなります。 [TIME[2015-07-29T12:35:37.400Z]]

[26] [[Chrome]] は、[[プロトコルの版]]と[[空白]]の後、0文字[[以上]]の[[数字]]列があれば、
それを[[状態符号]]とします。その後[[空白]]があれば無視し、残ったものを[[理由句]]とします。
(少なくても [[XHR]] の [CODE(DOMa)@en[[[status]]]] では) 2[SUP[31]] [[以上]]なら、
2[SUP[31]]-1 がかわりに返されます。[[数字]]列がない場合、 [CODE[200 OK]]
とみなされ、実際の残りの文字列は無視されます。 [TIME[2015-06-17T12:30:29.00Z]]

[28] (少なくても [[XHR]] では) [[Firefox]] は符号無し16ビット整数として扱い、 0
になるならかわりに 200 を返します。 [[IE]] は32ビット符号付き整数として扱います。
[[Firefox]] でも [[IE]] でも大きすぎると[[桁溢れ]]します。 [TIME[2015-07-27T14:01:37.100Z]]

[29] [[Firefox]] でも [[IE]] でも、[[状態符号]]の後に[[空白]]がないと、
[[理由句]]がないものとして扱われます。 [TIME[2015-07-27T14:02:03.100Z]]

[30] [[Chrome]] でも [[IE]] でも [[Firefox]] でも、[[先導0]]はたくさんあっても正しく無視します。 [TIME[2015-07-27T14:05:32.400Z]]

[27] (少なくても [[Chrome]] の [[XHR]] は) [[プロトコルの版]]よりも前に[[空白]]やそれ以外の[[文字]]があると、すべて無視します。
[[プロトコルの版]]の後に[[空白]]、[[状態符号]]、[[理由句]]と解釈できるものがあれば、
そのように扱われます。 ([[プロトコルの版]]参照。) [TIME[2015-06-17T13:28:09.00Z]]

[34] [[理由句]]の末尾の[[空白]]は、 [[IE]] と [[Firefox]] ではそのまま保存されますが、
[[Chrome]] では除去されます。 [TIME[2015-07-29T12:37:47.400Z]]

[35] [[HTTPクライアント]]の中には、[[理由句]]が[[空文字列]]の時に正しく処理できず、
最初の[[ヘッダー]]が[[理由句]]とみなされるなどおかしな動作をするものもあります。
[TIME[2016-01-01T08:46:25.900Z]]

[10] [[改行]]については、[[メッセージ]]の項を参照してください。

[13] [[応答]]の最初の行が[[状態行]]として解釈できない場合、
[[HTTP/0.9]] [[応答]]とみなされることとなります。

;; [[HTTP/0.9]] も参照。

* [CODE(XMLe)@en[status]] 要素 (WebDAV)

[21] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[status]]]]]]
[[要素]]は、 [[HTTP]] [[状態行]]を表します [SRC[>>19]]。

[22] [[内容]]は、[[状態行]]を表す[[文字データ]]です [SRC[>>19]]。

[FIG(railroad)[
= [[状態行]]
]FIG]

[20] [[RFC 2616]] の[[状態行]]の定義を参照しており [SRC[>>19]]、末尾に 
[CODE(ABNF)@en[[[CRLF]]]] が含まれることとなっていますが、 [[RFC 4918]] 中の例示はすべて[[改行]]なしとなっており、
実際には[[改行]]は含めないのが意図と思われます。

[23] [[プロトコルの版]]は [[RFC 4918]] の例示ではすべて [[HTTP/1.1]]
となっていますが、その決め方や解釈は明記されていません。

[18] [CODE(XMLe)@en[[[status]]]] [[要素]]は、 [CODE(XMLe)@en[[[response]]]]
[[要素]]で使うことができ [SRC[>>17]]、 [CODE(XMLe)@en[[[href]]]]
[[要素]]で示される[[資源]]に関する状態を表します。

[16] [CODE(XMLe)@en[[[status]]]] [[要素]]は、 [CODE(XMLe)@en[[[propstat]]]]
[[要素]]で使うことができ、 [CODE(XMLe)@en[[[prop]]]] [[要素]]に含まれる[[特性]]に関する状態を表します [SRC[>>15]]。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[6] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 6.1 Status-Line
]FIGCAPTION]

> The first line of a [DEL[[INS[{1945}]] Full-]]Response
message is the Status-Line, consisting of the protocol version followed by a numeric status code and its
associated textual phrase, with each element separated by SP
characters.  No CR or LF is allowed except in the final CRLF sequence.

[CODE(ABNF)[Full-Response]] メッセージの最初の行は [CODE(ABNF)[Status-Line]]
で、プロトコルの版とそれに続く数値[[状態符号]]とそれに関連付けられた文語句で構成され、
それぞれの要素は [CODE(char)[[[SP]]]] 文字で分離します。
最終 [[CRLF]] 列を除いて [CODE(char)[[[CR]]]]
や [CODE(char)[[[LF]]]] は認められていません。

>
- Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

[DEL[
>[INS[{1045}]] Since a status line always begins with the protocol version and status code

状態行は常にプロトコルの版と状態符号

>
-       "HTTP/" 1*DIGIT "." 1*DIGIT SP 3DIGIT SP

> (e.g., "HTTP/1.0 200 "), the presence of that expression is
sufficient to differentiate a Full-Response from a Simple-Response.
Although the Simple-Response format may allow such an expression to
occur at the beginning of an entity body, and thus cause a
misinterpretation of the message if it was given in response to a
Full-Request, most HTTP/0.9 servers are limited to responses of type
"text/html" and therefore would never generate such a response.

(例えば [SAMP(HTTP)[HTTP/1.0 200 ]]) で始まりますから、
この表現の存在は [CODE(ABNF)[Full-Response]] と
[CODE(ABNF)[Simple-Response]] を区別するのに十分です。
[CODE(ABNF)[Simple-Response]] 書式は実体本体にこのような表現を認めていますから、
[CODE(ABNF)[Full-Request]] 経の応答でそのようなものがあるとメッセージの誤解釈を起こしてしまうことになりますが、
ほとんどの HTTP/0.9 サーバーは型 [CODE(MIME)[[[text/html]]]] 
の応答に制限されていますから、そのような応答は決して生成されないでしょう。
]DEL]

*** 6.1.1 Status Code and Reason Phrase
→[CODE(WikiPage)[[[状態符号]]]]
]FIG]

[FIG(quote)[
[FIGCAPTION[
[14] RFC 2518 (WebDAV) 12.9.1.2  status XML Element
]FIGCAPTION]

>
: Name:       [CODE(DAVe)[status]]
: Namespace:  [CODE(URI)[[[DAV:]]]]
: Purpose:    Holds a single HTTP status-line
: Value:      status-line   ;status-line defined in [RFC2068]

:目的:単一の [[HTTP]] [CODE(ABNF)[status-line]]を保持します
:値:[CODE(ABNF)[[[status-line]] [CODE(comment)[; [CODE(ABNF)[status-line]] は [{RFC2068]] で定義]]]]

> [CODE(XML)[<!ELEMENT [CODE(DAVe)[status]] (#[CODE(XML)[[[PCDATA]]]]) >]]
]FIG]

[12] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#section-4.3.3>

[24] [CITE@en[draft-singer-appsawg-mcast-url-00 - URLs and HTTP Response Forms for Multicast]]
( ([TIME[2014-10-17 05:06:18 +09:00]] 版))
<https://tools.ietf.org/html/draft-singer-appsawg-mcast-url-00#section-6>

* 関連

[25] [[HTTP/2]] では、[[疑似ヘッダー]]が[[状態行]]の役割を果たしています。