ProxyAgent может быстро установить соединение, а затем бесконечно ждать тело ответа. Тайм-аут соединения его конечной точки прокси не описывает это последующее ожидание.

Задайте предел соединения на конечной точке при создании агента. Для публичного HTTP-запроса ниже неаутентифицированный кандидат из списка HTTP-прокси может заменить адрес, если публичные посредники разрешены:

endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
                              timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)

Для небольшого ответа, который вы собираетесь хранить в памяти, включите чтение тела в цепочку Deferred до добавления срока:

from twisted.web.client import readBody

d = agent.request(b'GET', b'http://example.com/')
d.addCallback(readBody)
d.addTimeout(10, reactor)
d.addCallback(lambda body: print(len(body)))
d.addErrback(lambda failure: print(failure.getErrorMessage()))

Фрагмент предполагает, что у приложения уже есть reactor и настроенный агент. Deferred запроса ProxyAgent возвращает объект ответа; readBody возвращает Deferred для тела. Возврат его из callback заставляет цепочку ждать и эту операцию.

Расположение имеет значение. Twisted применяет addTimeout к работе, которую представляют callback, установленные до него. Добавление читателя тела после этого описало бы другую границу. В этом порядке таймер запускается при вызове addTimeout и охватывает ожидающий запрос и работу с телом в этой цепочке.

Для больших или неограниченных тел используйте потокового потребителя и представляйте его завершение так же. Срок на стороне клиента ограничивает, сколько ждёт ваше приложение; он не перенастраивает собственный тайм-аут вышестоящего соединения самого прокси.

Похожие статьи