[2] [DFN[[RUBYB[[[要求行]]]@en[request line]]]]は、 [[要求メッセージ]]の最初の[[行]] ([[開始行]])
であり、[[要求メソッド]]と[[要求対象]]と[[プロトコルの版]]を表すものです。

* 仕様書

[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.1>
- [505] [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>
- [10] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-4.1>
]REFS]

* 構文

[4] [[要求行]]は、[[メソッド]]、 [[SP]]、[[要求対象]]、[[SP]]、
[[HTTPの版]]、[[CRLF]] を順に連ねたものです。 [SRC[>>3]]

[504] ただし [[HTTP/0.9]] では、[[メソッド]]、[[SP]]、[[要求対象]]、[[CRLF]]
です [SRC[>>10]]。 ([[HTTPの版]]がありません。)

[FIG(railroad)[
= [[メソッド]]
= [CODE(HTTP)[[[SP]]]]
= [[要求対象]]
= ?
== [CODE(HTTP)[[[SP]]]]
== [[HTTPの版]]
= [[CRLF]]
]FIG]

[6] [[要求対象]]は、[[要求]]を適用する[[対象資源]]を識別します [SRC[>>3]]。

[5] [[メソッド]]は、[[対象資源]]に対する[[要求メソッド]]を示します [SRC[>>3]]。

[11] [[HTTP/0.9]] では[[メソッド]]は [CODE(HTTP)@en[[[GET]]]] のみとなっています [SRC[>>10]]。
それ以外の版では、任意の[[要求メソッド]]を指定できます。

[7] [[HTTPの版]]は、[[送信者]]が対応している最大の[[プロトコルの版]]を表します。
[[送信者]]はこの版に従い[[要求メッセージ]]を生成することとなります。

[402] [[要求行]]の長さに上限はありません [SRC[>>3]]。しかし後述の通り、
[[受信者]]が任意の長さの[[要求行]]を処理する義務はありません。
[[送信者]]はむやみに長い[[要求行]]を送っていいわけではありません。

;; [12] 通常は[[ハイパーリンク]]その他で[[鯖]]から与えられた [[URL]]
を[[要求対象]]とするのでしょうから、[[受信者]]が処理できないほど長い [[URL]]
が与えられるとは考えにくいですが、 [[URL]] を指定した[[鯖]]と[[受信者]]が別の者である場合や、
[[フォーム]]などで[[利用者]]の入力が長い場合などで長過ぎることはあり得ます。
一般にそのような場合に[[送信者]]が行える対策はありません。
(長い入力を想定している[[鯖]]は [CODE(HTTP)@en[[[POST]]]] の [[payload body]]
による[[引数]]の指定など代替策を用意しているでしょうが、
[[HTTP]] 仕様その他で一般的に機械的に適用できる対策はありません。)

* 構文解析

[8] [[受信者]]は普通[[要求行]]を[[空白]]によって各部分に分割することで[[構文解析]]します
[SRC[>>3]]。仕様に適合する[[メッセージ]]においては、[[メソッド]]、
[[要求対象]]、[[HTTPの版]]のいずれにも[[空白]]は含まれません。
しかし実際には[[空白]]を送信してくる[[利用者エージェント]]もあります [SRC[>>3]]。
[[メソッド]]や[[HTTPの版]]には決して[[空白]]が含まれませんから、
前後を除去して残った部分を[[要求対象]]とすれば、曖昧無く解釈はできます。

[9] [[非妥当]]な[[要求行]]を受け取った場合には、
[CODE(HTTP)[[[400]]]] を返すか、
[CODE(HTTP)[[[301]]]] で適切に符号化した[[要求対象]]に[[リダイレクト]]するかのいずれかにより[[応答]]する[['''べきです''']]。
[[リダイレクト]]なしで自動修正して処理する[['''べきではありません''']]。 [SRC[>>3]]

;; [401] この規定は必ずしも守られていないように見えます。

[506] 構文上 [[SP]] の箇所は、[[空白]]1つ以上を区切りとみなして[[構文解析]]して構いません。
また、最初と [[CRLF]] 前の[[空白]]は無視して構いません。ここで[[空白]]は、
[[SP]]、[[HTAB]]、[[VT]]、[[FF]]、[[CR]] のことをいいます。 [SRC[>>505]]

[17] [[Apache]] は [N[0x09]] や [N[0x0C]] も[[空白]]として扱います。
[[nginx]] は [N[0x20]] だけ[[空白]]とします。
[TIME[2016-09-10T09:15:02.100Z]]

[507] [[改行]]については、[[メッセージ]]の項を参照してください。

[503] 実際上[[要求行]]の長さには色々な制限が課されていますが、
最低でも8000[[オクテット]]の[[要求行]]には対応する[['''べきです''']] [SRC[>>3]]。

[403] 実装しているどの[[メソッド]]よりも長い[[メソッド]]名を受信した[[鯖]]は、
[CODE(HTTP)[[[501]]]] を返す[['''べきです''']] [SRC[>>3]]。

[502] [[構文解析]]したい [[URI]] の長さを超える[[要求対象]]を受信した[[鯖]]は、
[CODE(HTTP)[[[414]]]] を返さなければ[['''なりません''']] [SRC[>>3]]。

[16] [[nginx]] も [[Apache]] も、先頭の [N[8192]] [[バイト]]に[[要求行]]
(末尾の[[改行]]まで) が含まれないと、 [CODE[414]] [[応答]]を返します。
[[Apache]] は [[HTTP/1.1]]、[[nginx]] は [[HTTP/0.9]] で返します。
[TIME[2016-09-10T08:48:09.200Z]]

[18] [[ChromeDriver]] は[[プロトコルの版]]が [CODE[HTTP/1.1]] でなければ、
直ちに[[接続][HTTP接続]]を閉じます。 [CODE[HTTP/1.0]] や
[CODE[HTTP/1.2]] であってはなりません。 (古い版の [[ChromeDriver]]
は[[プロトコルの版]]を検査しておらず、何を指定しても [CODE[HTTP/1.1]]
とみなしていたようです。)
[TIME[2017-03-19T10:58:58.600Z]]

[REFS[
- [14] [CITE@en[core - Apache HTTP Server Version 2.4]] ([TIME[2016-09-07 02:38:34 +09:00]]) <https://httpd.apache.org/docs/current/en/mod/core.html#limitrequestline>
- [15] [CITE[Module ngx_http_core_module]] ([TIME[2016-08-29 21:17:12 +09:00]]) <http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers>
]REFS]

* 歴史

[FIG(quote)[
[FIGCAPTION[
[1] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 5.1 Request-Line
]FIGCAPTION]

> The Request-Line begins with a method token, followed by the
Request-URI and the protocol version, and ending with CRLF. The
elements are separated by SP characters. No CR or LF [DEL[are]] [INS[[INS[{2616}]] is]] allowed
except in the final CRLF sequence.

[CODE(ABNF)[Request-Line]] は方式字句で始まり、
[CODE(ABNF)[[[Request-URI]]]] とプロトコル版が続き、
[[CRLF]] で終わります。要素は [CODE(ABNF)[[[SP]]]]
文字で分離します。最終 CRLF 列以外で [CODE(ABNF)[[[CR]]]] と
[CODE(ABNF)[[[LF]]]] は認めていません。

>
-Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

[DEL[
>[INS[{1945}]] Note that the difference between a Simple-Request and the Request-Line of a Full-Request is the presence of the HTTP-Version field and
the availability of methods other than GET.

[CODE(ABNF)[Simple-Request]] と [CODE(ABNF)[Full-Request]] の
[CODE(ABNF)[Request-Line]] との違いは [CODE(ABNF)[[[HTTP-Version]]]]
欄があることと [CODE(HTTP)[[[GET]]]] 以外の方式が利用可能であることであるのに注意してください。
]DEL]
*** 5.1.1 Method
→[CODE(WikiPage)[[[HTTP//method]]]]
*** 5.1.2 Request-URI
→[CODE(WikiPage)[[[Request-URI]]]]
]FIG]

[508] [CITE@en[draft-aranda-dispatch-q4s-02 - The Quality for Service Protocol]]
( ([TIME[2014-07-28 09:14:06 +09:00]] 版))
<http://tools.ietf.org/html/draft-aranda-dispatch-q4s-02#page-17>

* 関連

[13] [[HTTP/2]] では、[[疑似ヘッダー]]が[[要求行]]の役割を果たしています。