首页 文章

请求HTTPConnectionPool读取超时永远不会恢复

提问于
浏览
0

我有一个全天候运行的脚本,有时会被系统重启所杀死 . 脚本的一部分从pastebin [ . ] com收集具有某些内容的bin,另一部分将它们导出到远程rest endpoints . 我收集垃圾箱的部分发送了很多请求,并且从不碰到 HTTPConnectionPool 的问题,而另一部分往往很快就遇到它,尽管它发送请求的次数要少得多 .

我有以下代码和retry-logic,所以我确保bin被导出到远程

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

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

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

    由于没有HTTPS背后的请求对我的用例至关重要(流量嗅探和检查必须是任何人都可以),我想出了一个解决方法:如果请求被远程服务器杀死, I base64 encode its body before retrying and then it works .

相关问题