Geef een Twisted-proxyverzoek een deadline voor zijn body
Combineer de verbindingstimeout van het proxy-eindpunt met een Deferred-deadline die ook het lezen van een kleine antwoordbody dekt.
Een ProxyAgent kan snel verbinden en daarna onbeperkt wachten op een antwoordbody. De verbindingstimeout van zijn proxy-eindpunt beschrijft dat latere wachten niet.
Stel bij het bouwen van de agent een verbindingsgrens in op het eindpunt. Voor het openbare HTTP-verzoek hieronder kan een niet-geverifieerde kandidaat uit de HTTP-proxylijst het adres vervangen als openbare tussenpartijen zijn toegestaan:
endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)
Voor een klein antwoord dat je in het geheugen wilt verzamelen, neem je het lezen van de body op in de Deferred-keten voordat je de deadline toevoegt:
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()))
Het fragment gaat ervan uit dat de toepassing al zijn reactor en een geconfigureerde agent heeft. De request-Deferred van ProxyAgent levert een antwoordobject op; readBody geeft de Deferred voor de body terug. Als je die vanuit de callback teruggeeft, wacht de keten ook op die bewerking.
De plaatsing is belangrijk. Twisted past addTimeout toe op het werk dat de callbacks vóór hem vertegenwoordigen. Een bodylezer daarna toevoegen zou een andere grens beschrijven. In deze opstelling start de timer wanneer addTimeout wordt aangeroepen en dekt die het wachtende verzoek en het bodywerk in die keten.
Gebruik een streaming-consument voor grote of onbegrensde bodies en geef de voltooiing ervan op dezelfde manier weer. Een deadline aan de clientzijde beperkt hoe lang je toepassing wacht; die herconfigureert niet de eigen upstream-verbindingstimeout van de proxy.