请求HTTPConnectionPool读取超时永不恢复

时间:2018-10-09 09:08:22

标签: python-3.x python-requests httpconnection

我有一个运行24/7的脚本,有时被系统重启杀死。脚本的一部分从具有特定内容的pastebin [。] com收集垃圾箱,另一部分将其导出到远程其余端点。我收集垃圾箱的那部分发送大量请求,并且从不碰到HTTPConnectionPool的问题,而另一部分则趋向于很快遇到它,尽管它发送请求的频率要少得多。

我在retry-logic中有以下代码,所以我确保将垃圾箱导出到远程

def send_export_request(self, payload):
    while True:
        success = False
        try:
            self.session.post(self.collector, data=payload, timeout=10)
            success = True
        except requests.exceptions.RequestException as e:
            self.logger.log_error("RequestException ocurred when storing paste %s: %s" % (payload['key'], e))

        if success:
            break

        self.logger.log("Retrying to store the paste...")
        self.session.close()
        self.session = requests.session()
        sleep(2)

当然self.session在构造函数中已初始化为requests.session()。最终总是发生的(时间因情况而异,但总是在24小时之内发生)是引发了以下异常:

HTTPConnectionPool(host='www.[redacted].com', port=80): Read timed out. (read timeout=10)

然后代码进入循环,始终引发此异常,将其记录下来,等待2秒,然后重试,引发异常,依此类推。除非我杀死脚本并再次运行它,否则它永远无法恢复。我进行了很多搜索,最初尝试不使用会话的代码(仅发布请求),然后添加了会话,最后尝试在重试之前创建新的会话。这些都不起作用。我想念什么?

1 个答案:

答案 0 :(得分:0)

难怪没人知道问题出在哪里。我将回答这个问题以阐明问题所在。

我做了一些进一步的测试:我将垃圾箱中的内容发布到的远程服务器启用了某种IPS或类似的系统。收集器不在HTTPS后面(故意),因此可以进行有效负载检查,并且当有效负载包含某些关键字或已知签名时,远程服务器决定让连接超时。

由于对我的用例而言,没有HTTPS背后的请求至关重要(任何人都必须进行流量嗅探和检查),所以我想出了一种解决方法:如果请求被远程服务器杀死,我在使用base64对其主体进行编码之前重试,然后就可以了