27

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

私のリクエスト形式;

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

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

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

4

2 に答える 2

37

In -ストリームが閉じられたときのHTTP/1.0ないサーバー応答content-length

In HTTP/1.1- server response withoutcontent-lengthは、応答がチャンク エンコードされている場合です。

于 2012-07-07T14:18:36.057 に答える
9

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

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

于 2012-07-07T16:49:07.960 に答える