2016-07-17 5 views
0

私は道"HTTP..CLIENT.BAD STATUS LINE"からどうやって逃げるのですか?

headers = ['Content-length']=str(len(bytes(body, 'utf-8'))) 
req = urllib.request.Request(url, bytes(body, 'utf-8'), headers) 

ソースでhttp.client.BadStatusLineをオフに取り除くためにurllib.requestのヘッダーを設定したい:bodyhearders中を意味しない何BadStatusLine exception raised when returning reply from server in Python 3

+0

[urllib.request python 3のヘッダーを設定]の可能な複製(http://stackoverflow.com/questions/38418477/set-the-header-in-urllib-request-python-3) – smarx

答えて

0

正しい構文は headers['Content-length']=str(len(bytes(body, 'utf-8')))

がタイプミスがあると推測されます。 Content lengthヘッダーは、htmlレスポンスのサイズを表します。たとえば、サーバーがhtmlページを要求された場合、htmlコンテンツのサイズが返されます。

たとえば、ページをリクエストした場合:http://www.york.ac.uk/teaching/cws/wws/webpage1.html
(デモの簡単なページですが、余分なリソースはありません)、サーバーの応答ヘッダーは次のとおりです。デベロッパーコンソールのchromeやfirefox、 "network"タブ、 "all"ヘッダーのいずれのページでもこれを見ることができます。

Accept-Ranges:bytes 
Cache-Control:max-age=300 
Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Length:1957 
Content-Type:text/html 
Date:Sun, 17 Jul 2016 06:48:41 GMT 
Expires:Sun, 17 Jul 2016 06:53:41 GMT 
Keep-Alive:timeout=4, max=100 
Server:Apache/2.2.22 (Ubuntu) 
Vary:Accept-Encoding 

長さヘッダーの長さは1957バイトです。あなたがページに行き、Ctrl-Uを押すことによってソースを点検するならば。テキストのサイズがはるかに大きいことがわかります。しかし、受け取ったテキストは圧縮されています。だからhttp://www.txtwizard.net/compressionに向かい、ソーステキストを入れてください。あなたは、圧縮されたサイズは1957バイト(エンコーディングもヘッダにContent-Encoding:Gzipとして言及されており、サイトがgz圧縮のために設定されていることを観測。

ので、コードのように、bodyは、サーバのhtmlの応答であるが意志またはそうでなければ(例えば、ファイル、またはcontent-typeヘッダによって示されるように画像または何のため。)

別の例:https://github.com/python/cpython/blob/master/Lib/http/server.py#L752
これは作り付けのpythonのカスタムハンドラを記述するために使用することができるSimpleHTTPResponseHandlerためのpython3コード、ありますサーバー。

変数encodedは、do_GET関数に渡されるバイナリファイルとしてエンコードされたhtml応答を含む文字列です。 Content-Lengthヘッダーがエンコードされた文字列のサイズに設定されていることを確認します。

関連する問題