木っ端拾いの材木流し

Cannot see the wood for the trees.

クエリ付きURLの正しいHTTPリクエストの形式

クエリ付きのHTTPリクエストのサンプルを探してみたら、ネットワーク関係の調べ事でお世話になるwakhokに書かれていました。

GET /cgi-bin/form.test1?entry=maruyama HTTP/1.0
                                 <---- ここに空行が必要です。

HTTP/1.0 200 Document follows
MIME-Version: 1.0
Server: CERN/3.0
Date: Saturday, 29-Jul-95 06:16:02 GMT
Content-Type: text/html
Content-Length: 74

<TITLE>FORMサンプル #1.x</TITLE>
<H1>あなたの名前は、maruyamaです。 </H1>
Connection closed by foreign host.

この例では絶対パスにクエリが付いた形式でリクエストされています。
これ、RFC2396 に書いてある定義を見るとRFC的にはアウトな気がするんですが、どうなんでしょうか。

RFC2616 では

 Request-URI    = "*" | absoluteURI | abs_path | authority

となっていて、absoluteURI,abs_pathの定義はRFC2396に従うとなっています。
で、そのRFC2396を見ると、

      absoluteURI   = scheme ":" ( hier_part | opaque_part )

(略)

      hier_part     = ( net_path | abs_path ) [ "?" query ]

(略)

      abs_path      = "/"  path_segments

となっており、abs_path(絶対パス)にはクエリは含まれていません。

この定義からすると、
POST http://hoo.bar/hoge.cgi?xxx=aaa HTTP/1.0
はありで、
POST /hoge.cgi?xxx=aaa HTTP/1.0
は駄目、つまりHTTPリクエストにクエリ文字列を入れるにはabsoluteURIの形式でないといけないような気がするのですが……。

URIの定義として?の後はクエリである」という話と「GETメソッドはクエリをURLに含めて送る」という話はよく見かけるのですが、実際にGETメソッドでクエリ付きのURLをリクエストする場合のHTTPリクエストの例が書かれている所はほとんどなく、どれが正しいのかよく分かりません。
telnetで試してみれば良い、という考えもありますが、得られる結果は使用したクライアントとサーバでどのような実装になっているかであって、どうあるべきかの答ではない訳で。うーむ。