Dev Study
← 解説「リクエストの形 — 行末は CRLF、Host は必須、Connection: close で終わりが分かる」に戻る

サンプルコードで身につける: リクエストの形 — 行末は CRLF、Host は必須、Connection: close で終わりが分かる

解説で学んだ概念を、3つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1リクエストは CRLF 区切りの行の集まり

のリクエストは 、 の並び、空行、の順で、行末はすべて (\r\n)です。文字列をそのまま escape_debug で表示して、\r\n が実際に入っていることを確かめます。実行すると 66 バイトの送信内容が 1 行で見え、その下に 0〜3 行目がそれぞれ request-line / field-line / 空行(ヘッダーの終わり)として並びます。

Rust

2build_request: Url から送信文字列を組む

Url の と host_header からリクエスト文字列を組み立てる build_request です。 は HTTP/1.1 で必須( 9112 3.2)、 は「この 1 往復で接続を閉じる」で、これがあると「サーバーが閉じるまで読む」だけでの終わりが分かります。実行すると 2 本の について {:?} 表示のリクエスト全文が出て、example.com は Host に :80 が付かず localhost:8000 は付くこと、request-line に ?a=1 が残ること、末尾が \r\n\r\n で終わることが確認できます。

Rust

3実務: 受け取る側の検査(モックサーバーの判断)

モックサーバーや疎通確認ツールを書くとき、サーバー側は「空行があるか → request-line が 3 か → Host があるか」の順に見るので、validate はその判断を <, String> で返します。実行すると正しいリクエストだけ OK で、Host 無し・行末が だけ・request-line が 2 要素・POST はそれぞれ別の理由で NG になります。LF だけの行末は送る側としては不正で、受ける側が許すかどうかは次のレッスンで扱います。

Rust

図やコードに出てくる用語(タップで説明)