2011-09-15 4 views
0

ソケットとHttpプロトコルの詳細については、私自身のPython 3のhttpライブラリをコード化しようとしています。私の質問は、私のソケットを使ってrecv(bytesToRead)を行う場合、どうすればヘッダーだけを取得し、次にContent-Length情報を取得してページコンテンツを受信し続けることができますか?それはContent-Lengthヘッダーの目的ではありませんか? ありがとうございますHttpプロトコル、Content-Length、ページコンテンツを取得するPython

答えて

2

これまで、これを達成するために、私はソケットデータの一部をメモリに読み込み、そのバッファから "\ r \ n \ r \ n"シーケンスが遭遇するまで読み込みますステートマシンを使ってこれを行うか、単純にstring.find()関数を使用することができます。そのシーケンスに達すると、すべてのヘッダーが読み込まれていることが分かり、ヘッダーの解析をいくつか行い、コンテンツの長さ全体を読み取ることができます。

このシーケンスを見る前にバッファが不足している場合は、ソケットからさらに多くのデータを読み込んで処理を続行します。

見たい場合はC#の例を投稿できます。

+0

ありがとうございますが、私はC#についてよく分かりませんが、コンテンツの長さがわからない場合はどうすればよいですか?新しい行が見つかるまで読むだけですか? – Lautaro

+1

あなたが持っている他のヘッダーと接続がkeep-aliveであるかどうかによって決まります。要求ヘッダー "Connection:close"を送信して要求したか、またはサーバーがキープアライブをサポートしていないためです。接続が閉じている場合は、ソケット上で利用可能なデータがなくなるまで読み取ります。これはドキュメントの終わりを表します。またはサーバーがチャンクエンコーディングで応答します。その場合は、チャンクレスポンスの読み取りをサポートする必要があります。私はこれもC#の例があります。私は理解して、C#がそれを理解するのが難しくなるかもしれないことを知らない。 – drew010

+0

ステートマシンの良い例については、ryの[http-parser](https://github.com/ry/http-parser) – jterrace

関連する問題