Um ProxyAgent pode conectar-se rapidamente e depois esperar indefinidamente por um corpo de resposta. O tempo limite de conexão do seu endpoint proxy não descreve essa espera posterior.

Defina um limite de conexão no endpoint ao construir o agente. Para a requisição HTTP pública abaixo, um candidato não autenticado da lista de proxies HTTP pode substituir o endereço se intermediários públicos forem permitidos:

endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
                              timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)

Para uma resposta pequena que pretende recolher na memória, inclua a leitura do corpo na cadeia Deferred antes de acrescentar o prazo:

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()))

O trecho pressupõe que a aplicação já tem o seu reactor e um agente configurado. O Deferred da requisição do ProxyAgent devolve um objeto de resposta; o readBody devolve o Deferred do corpo. Devolvê-lo a partir do callback faz a cadeia esperar também por essa operação.

A colocação importa. O Twisted aplica addTimeout ao trabalho representado pelos callbacks instalados antes dele. Acrescentar um leitor de corpo depois descreveria outro limite. Nesta disposição, o temporizador começa quando addTimeout é chamado e cobre a requisição pendente e o trabalho do corpo nessa cadeia.

Use um consumidor em fluxo para corpos grandes ou ilimitados e represente a sua conclusão da mesma forma. Um prazo do lado do cliente limita quanto tempo a sua aplicação espera; não reconfigura o tempo limite de conexão do próprio proxy para a origem.

Artigos relacionados