Zihao

Make small but daily progress

0%

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

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

解决方法如下:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    1
    2
    3
    4
    5
    6
    7
    8
    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[]

个人推荐第二种方法。

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

欢迎关注我的其它发布渠道