web-dev-qa-db-ja.com

content-lengthなしでhttpリクエストの応答を取得していますか?

小さなプログラムでhttpリクエストを送信し、TCPプロトコルで応答を取得します。

私のリクエストフォーマット。

GET / HTTP/1.0
Host: somewebsite.com
{two new line}

Content-lengthヘッダーが見つかるまで、ソケットから(c#でNetworkStreamおよびStreamReaderを使用して)応答を1行ずつ読み取ります。長さを保存し、空の行が見つかるまで読み続けます。次に、その長さのバッファーを作成し、残りの応答を受け取ります。

ただし、一部の応答にはcontent-lengthヘッダーがありません。だから私のアプローチは失敗します。受信するバイト数がわからない場合、いつ停止すればよいですか?

20

HTTP/1.0では?ストリームが閉じたとき。

HTTP/1.1では? チャンクエンコーディング を使用します。

22
Julian Reschke

HTTP仕様の関連部分 を参照してください。特定のケースでは、サーバーがコンテンツの長さを返さない場合、応答の終了時にストリームを閉じる必要があります。 (クライアントとして)あなたが知る他の信頼できる方法はありません。 HTTPのバージョンに関係なく。 @Julianチャンクエンコーディングは確かにHTTP/1.1での賢いアップグレードですが、ストリーミングに固有のものであり、「プレーン」なWebサーバーが実装する理由はありません。これは、応答を開始する前にコンテンツの長さを知っているサーバーです。そして、私はOPが制御下にあるサーバーを持っていないと思います。

ただし、コンテンツ長ヘッダーを取得した場合でも、 無条件に信頼してはいけません です。サーバーの実装者も、間違いのある人間です。それを「最も可能性の高い」応答、サイズ変更可能なバッファへの初期値と見なします。あなたはまだより少ないだけでなくより多くを処理する準備ができている必要があります(最悪の場合)。

7
Pavel Zdenek