httplib源码分析及IncompleteRead异常解决方案

由于触发了自定义规则,导致返回content-length大于实际页面内容,报IncompleteRead异常。

解决方法如下:

1.修改_safe_read方法,将抛出异常换为返回数据

s = []  
while amt > 0:
chunk = self.fp.read(min(amt, MAXAMOUNT))
if not chunk:
#raise IncompleteRead(s)
return ''.join(s)
s.append(chunk)
amt -= len(chunk)
return ''.join(s)

2.使用装饰器打patch

def patch_http_response_read(func):  
def inner(*args):
try:
return func(*args)
except IncompleteRead, e:
return ''.join(e.partial)
return inner
HTTPResponse.read = patch_http_response_read(HTTPResponse.read)

将上面代码放到httplib的最后就可以了,注意IncompletedRead的partial参数是list变量,因为_safe_read中的s[]

个人推荐第二种方法。

  • 本文作者:Jack Yao
  • 本文链接: python_httplib_err
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!