由于触发了自定义规则,导致返回content-length大于实际页面内容,报IncompleteRead异常。
解决方法如下:
修改_safe_read方法,将抛出异常换为返回数据
1
2
3
4
5
6
7
8
9s = []
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)使用装饰器打patch
1
2
3
4
5
6
7
8def 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
是[]
。
个人推荐第二种方法。