1) 场景,
python使用request库,出现如下错误.python2.7, requests 2.5.1
ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
好好的东西,怎么突然出现这个情况,蛋疼无比
具体的堆栈调用
就是使用requests的post
一看requests的源码,就发现,是在解析stream中的chunked的时候报错了.
补充知识: http的chunked请参考: http://blog.csdn.net/zhangboyj/article/details/6236780
因为请求的代码是别人的服务器,没办法让对方修改.
一般情况下http返回数据,都会有个Content-Length的东西.但是在chunked的情况下,就没了.
这时候,我们需要改变一下策略.
chunked是http1.1才有的东西,
我们将http请求的版本,修改为1.0
使用curl命令可以添加一个参数 -0或者-1
curl -0 http://xx.com -v
可以看到提交请求的头HTTP/1.0
curl -1 http://xx.com -v
可以看到提交请求的头HTTP/1.1
现在为了保留大部分代码都不变的情况,需要修改requests发送http请求的时候,修改为1.0的http头
import httplib httplib.HTTPConnection._http_vsn = 10 httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
header = { 'Content-Type': 'application/json;', 'Host':'www.xxxx.com' } resp = requests.post(url=url, data='{}', headers= header ,timeout=120)
某些情况下,居然一定要带Host.请留意
然后继续请求,通过wireshark抓包可以看到.
从返回的数据包里面,没有看到chunked的字样了,不过也没Content-Length
备注: https://github.com/ryanmcgrath/twython/issues/288
上面链接说更新requests版本到2.12.1就没问题了.