1

HTTPリクエストを理解する必要がある単純なHTTPサーバーを作成しています。

しかし、Chromium などのブラウザは HTTP パイプライン テクノロジを利用しています。つまり、1 つの接続で複数の HTTP リクエストを送信できます。

複数の HTTP リクエストの境界を見分けるのは難しいと思います。明らかな例の 1 つは、GET リクエストとランダム データのフォーム アップロードです。

私が今考えているのは、受信したすべてのデータを で分割し、すべての\r\n行をチェックして、HTTP リクエストのように見えるかどうかを確認することです。^(GET|PUT|HEAD|POST|MOVE|TRACE) /[^ ]+ HTTP/[0-9]+\.[0-9]+$

しかし、それはまだ間違っている可能性があります。(既存のHTTPサーバーライブラリを使えとは言わないでください…何か練習中です)

4

2 に答える 2

7

HTTP プロトコルの仕様であるRFC 2616をよく読んでください。HTTP リクエストは、次の要素で構成されています。

  1. スタートライン
  2. ゼロ以上のヘッダー行
  3. 空行
  4. リクエスト本文

最初の改行 (キャリッジ リターンとラインフィード、CRLF) まで読み取る必要がある開始行を解析することから始めます。次に、空の行 (つまり、2 つの連続する CRLF ペア) を読み取るまで、行を読み取ってヘッダーを読み取ります。

ヘッダーを読んだら、Content-Lengthand/orTransfer-Encodingヘッダーを取得したかどうかを確認することで、リクエスト本文があるかどうかを判断できます。これらのいずれかを取得した場合、それらはリクエストボディの長さを示し、その量のデータを読み取ります (これには、chunked転送エンコーディングなどで複数の読み取りが必要になる場合があります)。

リクエストの本文を読んだら、完了です。これで、次のリクエストを読む準備が整います。

于 2013-07-04T02:16:47.787 に答える