如何摆脱“HTTP..CLIENT.BAD状态行”?

时间:2016-07-17 06:41:29

标签: python-3.x urllib2 urllib urllib3

我想在urllib.request设置标题,以某种方式摆脱http.client.BadStatusLine

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

来源:BadStatusLine exception raised when returning reply from server in Python 3

bodyhearders引用的内容是什么?

1 个答案:

答案 0 :(得分:0)

正确的语法是 headers['Content-length']=str(len(bytes(body, 'utf-8')))

猜猜有拼写错误。内容长度标题表示html响应的大小或服务器的大小。例如,如果服务器被请求一个html页面,那么它将返回html内容的大小。

例如,当您请求页面时:http://www.york.ac.uk/teaching/cws/wws/webpage1.html
(它是演示的简单页面,它没有额外的资源),服务器响应头如下所示。您可以在chrome或firefox的开发控制台中的任何页面上看到此信息,在“网络”选项卡和“所有”标题下。

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

content-Length标头显示长度为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
这是SimpleHTTPResponseHandler的python3代码,可用于为内置的python服务器编写自定义处理程序。

变量encoded是包含编码为要传递给do_GET函数的二进制文件的html响应的字符串。检查Content-Length标头是否设置为编码字符串的大小。