Запросы HTTPConnectionPool Тайм-аут чтения никогда не восстанавливается - PullRequest
0 голосов
/ 09 октября 2018

У меня есть скрипт, который работает 24/7 и иногда убивается перезагрузкой системы.Одна часть сценариев собирает ячейки из pastebin [.] Com с определенным содержимым, а другая экспортирует их в удаленную конечную точку отдыха.Часть, где я собираю мусорные ведра, отправляет много запросов и никогда не сталкивается с проблемами с HTTPConnectionPool, в то время как другая часть имеет тенденцию сталкиваться с ней довольно быстро, несмотря на то, что она отправляет запрос гораздо реже.

У меня следующий код с повторной логикой, поэтому я гарантирую, что корзина будет экспортирована в удаленный

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 голосов
/ 25 октября 2018

Неудивительно, что никто не знал, в чем проблема.Я отвечу на этот вопрос, чтобы пролить некоторый свет на проблему.

Я провел дополнительное тестирование: на удаленном сервере, на котором я размещал содержимое бинов, была включена какая-то система IPS или аналогичная система.Коллектор не является (специально) за HTTPS, поэтому проверка полезной нагрузки была возможна, и когда полезная нагрузка содержала некоторые ключевые слова или известные сигнатуры, удаленный сервер решил разрешить тайм-аут соединения.

Поскольку отсутствие запросов за HTTPS крайне важнодля моего случая использования (отслеживание трафика и проверка должны быть доступны любому), я нашел обходной путь: если запрос удален удаленным сервером, Я base64 кодирую его тело перед повторной попыткой, а затем он работает .

...