Gib einer Twisted-Proxy-Anfrage eine Frist für ihren Body
Kombiniere das Verbindungs-Timeout des Proxy-Endpunkts mit einer Deferred-Frist, die auch das Lesen eines kleinen Antwort-Bodys abdeckt.
Ein ProxyAgent kann schnell verbinden und dann unbegrenzt auf einen Antwort-Body warten. Das Verbindungs-Timeout seines Proxy-Endpunkts beschreibt dieses spätere Warten nicht.
Setze beim Aufbau des Agenten eine Verbindungsgrenze am Endpunkt. Für die öffentliche HTTP-Anfrage unten kann ein nicht authentifizierter Kandidat aus der HTTP-Proxy-Liste die Adresse ersetzen, sofern öffentliche Vermittler erlaubt sind:
endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)
Für eine kleine Antwort, die du im Speicher sammeln willst, nimm das Lesen des Bodys in die Deferred-Kette auf, bevor du die Frist hinzufügst:
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()))
Das Fragment setzt voraus, dass die Anwendung bereits ihren Reactor und einen konfigurierten Agenten hat. Das Anfrage-Deferred von ProxyAgent liefert ein Antwortobjekt; readBody gibt das Deferred für den Body zurück. Wird es aus dem Callback zurückgegeben, wartet die Kette auch auf diesen Vorgang.
Die Platzierung zählt. Twisted wendet addTimeout auf die Arbeit an, die die vorher installierten Callbacks darstellen. Ein danach hinzugefügter Body-Reader würde eine andere Grenze beschreiben. In dieser Anordnung startet der Timer beim Aufruf von addTimeout und deckt die ausstehende Anfrage und die Body-Arbeit in dieser Kette ab.
Nutze für große oder unbegrenzte Bodys einen Streaming-Consumer und stelle dessen Abschluss auf dieselbe Weise dar. Eine Frist auf Client-Seite begrenzt, wie lange deine Anwendung wartet; sie konfiguriert das eigene Upstream-Verbindungs-Timeout des Proxys nicht um.