2012-07-07 14 views
11

少しのプログラムでHTTPリクエストを送信し、TCPプロトコルで応答を取得しました。Content-Lengthのないhttp要求の応答を取得していますか?

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

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

IはContent-Lengthヘッダを見つけるまで、私は(C#でNetworkStreamとのStreamReaderを使用して)ソケットからラインによる応答ラインを読み取ります。私は長さを保存し、空の行が見つかるまで読書を続けます。長さのバッファを作成し、残りの応答を受け取ります。

しかし、いくつかのreponsesにはcontent-lengthヘッダーがありません。だから私のアプローチは失敗します。何バイトを受け取るべきかわからない場合、いつ停止するべきですか?

答えて

15

HTTP/1.0では?ストリームが終了したとき。

HTTP/1.1では? chunked encoding

4

relevant part of HTTP specを参照してください。 具体的なケースでは、サーバーがコンテンツの長さを返さない場合は、応答の終了時にストリームを閉じる必要があります。あなたが(クライアントとして)知るべき信頼できる方法は他にありません。 HTTPのバージョンに関係なく。 @ジュリアンチャンクエンコーディングは確かにHTTP/1.1では巧妙なアップグレードですが、ストリーミングに固有のものであり、「プレーンな」Webサーバーがストリーミングを実装する理由はありません。これは、応答を開始する前にコンテンツの長さを知っているサーバーです。そして私は、OPは制御下にあるサーバーを持っていないと思います。さもなければ、彼はHTTPヘッダーの欠落に反対しません。

コンテンツの長さのヘッダーを取得しても、must not unreservedly trust itです。サーバーの実装者は、あまりにも虚偽の人間です。それを "最も可能性のある"応答、サイズ変更可能なバッファへの初期値として取る。あなたはまだ、より少なく(より悪いケース)扱う準備ができていなければなりません。

+7

非常に誤解を招くことです。レスポンスにcontent-lengthヘッダーフィールドがあり、チャンクエンコーディングを使用しない場合、それはあなたが持っている*唯一の情報です。より少ないコンテンツを受け取った場合、そのコンテンツは切り捨てられたものとみなされます。より多くのコンテンツを受け取った場合、視聴者は壊れているか、すでに次の応答を見ています。 –

+0

クライアントが現在の解析を完了していないときに、次の応答が1つの固有のソケットでどのように起こるかを謙虚に尋ねています。私はdownvoteをよく理解するかもしれません。さもなければ、私はこの問題に関して大きな相違は見られません。宣言されたコンテンツの長さを読み取ったときに何をすればよいのでしょうか?ソケットのreadは2バイト以上残っていると伝えます。実際には、「愚かな壊れたサーバー、私はもうあなたと話をしません」と言っても、良いプログラマが望むほど頻繁には適用されません。 –

+0

vtmarvin:クライアントがパイプライニングを使用できる。 –

関連する問題