Date una scadenza alla richiesta proxy di Twisted per il suo corpo
Combina il timeout di connessione dell'endpoint del proxy con una scadenza Deferred che copra anche la lettura di un piccolo corpo di risposta.
Un ProxyAgent può connettersi rapidamente e poi attendere indefinitamente un corpo di risposta. Il timeout di connessione del suo endpoint proxy non descrive quell'attesa successiva.
Imposta un limite di connessione sull'endpoint quando costruisci l'agente. Per la richiesta HTTP pubblica qui sotto, un candidato non autenticato dalla lista di proxy HTTP può sostituire l'indirizzo se gli intermediari pubblici sono ammessi:
endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)
Per una risposta piccola che intendi raccogliere in memoria, includi la lettura del corpo nella catena Deferred prima di aggiungere la scadenza:
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()))
Il frammento presuppone che l'applicazione abbia già il suo reactor e un agente configurato. Il Deferred della richiesta di ProxyAgent restituisce un oggetto risposta; readBody restituisce il Deferred del corpo. Restituirlo dal callback fa sì che la catena attenda anche quell'operazione.
La posizione conta. Twisted applica addTimeout al lavoro rappresentato dai callback installati prima. Aggiungere dopo un lettore del corpo descriverebbe un confine diverso. In questa disposizione il timer parte quando viene chiamato addTimeout e copre la richiesta in sospeso e il lavoro sul corpo in quella catena.
Usa un consumatore in streaming per corpi grandi o illimitati e rappresentane il completamento allo stesso modo. Una scadenza lato client limita quanto a lungo attende la tua applicazione; non riconfigura il timeout di connessione a monte del proxy stesso.