2016-09-15 10 views
1

現在、私はPythonソケットのhttpサーバーを作成しています。私はGETとPOSTリクエストを処理しています。 GETの実装はうまくいきましたが、POSTリクエストのbody要素は表示されません。 コードスニペット:http POSTメッセージの本文が受信されていません

self.host = '' 
self.port = 8080 

self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
self.listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
self.listener.bind((self.host, self.port)) 
self.listener.listen(1) 

while True: 

     client_connection, client_address = self.listener.accept() 
     request = client_connection.recv(2048) 
     print request 

このコードは、WebページからのPOSTリクエストの処理後にHTTPヘッダを得られます。

POST /test.txt HTTP/1.1 
Host: localhost:8080 
Content-Type: application/x-www-form-urlencoded 
Origin: http://localhost:8080 
Content-Length: 21 
Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) Version/9.1.1 Safari/601.6.17 
Referer: http://localhost:8080/ 
Accept-Language: nb-no 
Accept-Encoding: gzip, deflate 

をしかしそこには体がないので、問題は、なぜ私は、HTTPを受信して​​いませんさ私はそれが送信されていることを知っていますか?

ありがとうございます!

+0

質問は次のとおりです。POSTが最初に作成されたCLIENTコードが表示されないのはなぜですか? –

+0

こんにちは@MarcBプロジェクトはクラス割り当て用であり、クライアント側は既に実装されています。私は、GETとPOSTリクエストを処理するためにサーバー側を実装するだけです。だから私はエラーを持っているサーバー側を仮定することです – mmoe

+0

どのようなエラーが?サーバーは受け取ったものを吐き出すだけです。投稿体を受け取っていない場合は、クライアントが実際に正しく動作しているかどうかを確認する必要があります。 –

答えて

0
while True: 

     client_connection, client_address = self.listener.accept() 
     request = client_connection.recv(2048) 
     print request 

recv正確に2048バイトは読み込まれませんが、2048バイトまで読み込まれます。いくつかのデータが到着すると、さらに多くのデータが続くかもしれないとしても、recvはデータとともに返されます。私の推測では、クライアントが最初にHTTPヘッダーを送信してから本文を送信することになります。 NAGLEアルゴリズムがクライアント側(共通)でオフになっている場合は、最初のrecvはヘッダーのみを取得し、本体に別のrecvが必要になる可能性があります。これは、あなたのケースで何が起こるかを説明します。あなたは別のものをやらないので、ヘッダは取得しますが、ボディは取得しません。recv

でも、それは遅すぎても間違っていても簡単すぎる実装になります。正しく作成するには、HTTPプロトコルを正しく実装する必要があります。ヘッダーが大きい場合は、最初に複数のrecvが必要なHTTPヘッダーを読み取ります。次に、ヘッダーを解析し、本文のサイズを調べ(Content-lengthヘッダー)、残りのバイトを読み取る必要があります。

+0

完璧!それは、新しいソケットを呼び出すことによって、ヘッダーの後にデータ受信を停止したことが判明しました。ありがとう – mmoe

+0

@ mmoe:しかし再び。あなたが最初のrecvと次のrecvとの完全なヘッダーを取得することにそれを数えないでください。 HTTPの基礎となるプロトコルはTCPであり、これは暗黙のメッセージ境界を持たないストリームプロトコルです。正しい方法は、ヘッダーの終わり(空の行)が見つからないかぎり、データを読み取るだけです。 –

関連する問題