Donnez à une requête proxy Twisted une échéance pour son corps
Combinez le délai de connexion du point de terminaison du proxy avec une échéance Deferred qui couvre aussi la lecture d'un petit corps de réponse.
Un ProxyAgent peut se connecter rapidement puis attendre indéfiniment un corps de réponse. Le délai de connexion de son point de terminaison proxy ne décrit pas cette attente ultérieure.
Fixez une limite de connexion sur le point de terminaison lors de la construction de l'agent. Pour la requête HTTP publique ci-dessous, un candidat non authentifié de la liste de proxys HTTP peut remplacer l'adresse si les intermédiaires publics sont autorisés :
endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)
Pour une petite réponse que vous comptez collecter en mémoire, incluez la lecture du corps dans la chaîne Deferred avant d'ajouter son échéance :
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()))
L'extrait suppose que l'application possède déjà son reactor et un agent configuré. Le Deferred de requête de ProxyAgent renvoie un objet de réponse ; readBody renvoie le Deferred du corps. Le renvoyer depuis le callback fait que la chaîne attend aussi cette opération.
Le placement compte. Twisted applique addTimeout au travail représenté par les callbacks installés avant lui. Ajouter un lecteur de corps ensuite décrirait une autre limite. Dans cette disposition, le minuteur démarre à l'appel de addTimeout et couvre la requête en attente et le travail sur le corps dans cette chaîne.
Utilisez un consommateur en flux pour les corps volumineux ou non bornés et représentez son achèvement de la même façon. Une échéance côté client limite la durée d'attente de votre application ; elle ne reconfigure pas le délai de connexion amont du proxy lui-même.