我有一个运行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秒,然后重试,引发异常,依此类推。除非我杀死脚本并再次运行它,否则它永远无法恢复。我进行了很多搜索,最初尝试不使用会话的代码(仅发布请求),然后添加了会话,最后尝试在重试之前创建新的会话。这些都不起作用。我想念什么?
答案 0 :(得分:0)
难怪没人知道问题出在哪里。我将回答这个问题以阐明问题所在。
我做了一些进一步的测试:我将垃圾箱中的内容发布到的远程服务器启用了某种IPS或类似的系统。收集器不在HTTPS后面(故意),因此可以进行有效负载检查,并且当有效负载包含某些关键字或已知签名时,远程服务器决定让连接超时。
由于对我的用例而言,没有HTTPS背后的请求至关重要(任何人都必须进行流量嗅探和检查),所以我想出了一种解决方法:如果请求被远程服务器杀死,我在使用base64对其主体进行编码之前重试,然后就可以了。