Дайте запиту Twisted-проксі термін для його тіла
Поєднайте тайм-аут з'єднання кінцевої точки проксі з терміном Deferred, який також охоплює читання невеликого тіла відповіді.
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 і охоплює очікуваний запит і роботу з тілом у цьому ланцюзі.
Для великих або необмежених тіл використовуйте потокового споживача та подавайте його завершення так само. Термін на боці клієнта обмежує, скільки чекає ваш застосунок; він не переналаштовує власний тайм-аут висхідного з'єднання самого проксі.