2012-01-13 3 views
2

リクエストを送信した後、HTTPクライアントが使用するソケットを正しく閉じたのはどうですか?または、完全な応答が受信されるまで開いておく必要がありますか(双方向)?その場合、要求本体の終わりはサーバーによってどのように決定されますか?HTTP:要求を送信した後に書き込みを行うためのシャットダウンソケット?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4によると、ソケットを閉じることはリクエストのオプションではありません。それは私にとって論理的ではありません。なぜなら、クライアントがソケットの半分を閉じた後に何かを送信しようとしなければ、半分閉じたTCP接続がサーバにとって問題になるのでしょうか?クライアントは引き続きデータを受け取ることができます。

ソケットの書き込み部分をシャットダウンすると、要求が完了したことをサーバーに伝える非常に現実的な方法になります。 http://docs.python.org/howto/sockets.html#disconnectingは、そのユースケースについても具体的に言及しています。

これが本当に間違っているのであれば、それは何ですか?私は本当に "Content-length"を送信するか、チャンクされたトランスポートを使用してサーバーが要求の終わりを正しく見つけることができるようにする必要がありますか?ボディの長さが不明なリクエストに対しては、どのように機能しますか?

答えて

1

Transfer-Encoding: chunkedは、要求と応答の両方について、身長が不明なデータを送信できるように特別に設計されています。データの終わりは、ペイロードサイズが0のチャンクを受信することによって決定されます。chunkedリクエストを送信しない場合は、代わりにContent-Lengthを送信する必要があります。

+0

チャンクされた転送エンコーディングを使用するか、または要求本体ですべての要求に "Content-Length"ヘッダーを送信することが必須ですか?私はそれが賢明なことだと認識していますが、実際には標準のどこかで指定されていますか? – lxgr

+0

要求に本文がある場合は、本体のサイズを決定するための十分な情報をサーバーに含める必要があります。 RFC 2616のセクション4.3(メッセージ本文)と4.4(メッセージ長)を読んでください。 –

1

あなたが接続を閉じる

?:これについて話していることがレスポンスを返送するサーバに対して何の可能性を残していないであろうから、リクエストボディの終了を示すために使用することはできません。

私はテキストが完全に近いと話していると思いますが、半分(書き込み)を閉じることができます。私は、それがHTTPコンパイルの方法であるかどうかはわかりませんが、ほとんどのサーバーがそれを受け入れると思います。あなたの2番目の質問については

、単にチャンクエンコーディングを使用します。エンティティを受け取る1.1アプリケーションは、このように、このメカニズムがために使用することができるように、転送コーディング(セクション3.6)「をチャンク」を受け入れなければならない/すべてのHTTP

をメッセージの長さを事前に決定することができない場合のメッセージ

+0

はい、これは私が言及している通路です。だから、半分閉めをするのが安全だと言えるだろうか?それは私が望んだことです。私は単純なHTTPサーバーのためのチャンク転送コーディングを実装したくなかった。 – lxgr

+0

まあ、私の経験では、サーバーは標準よりもずっと耐えがたいエラーだということです(恐らく騙されているクライアントに悩まされるでしょう...)。あなたがサーバーとクライアントであなたのことを書いているように聞こえます。その場合、あなたのパスにHTTPプロキシがない場合、あなたは何でもしたいことができます。 )それはいいことではありませんが、それは動作します;) –

関連する問題