ProxyAgent는 빠르게 연결한 뒤 응답 본문을 무기한 기다릴 수 있습니다. 프록시 엔드포인트의 연결 타임아웃은 그 이후의 대기를 설명하지 않습니다.

에이전트를 만들 때 엔드포인트에 연결 한도를 설정합니다. 아래의 공개 HTTP 요청에서는 공개 중개자가 허용된다면 HTTP 프록시 목록의 인증되지 않은 후보가 주소를 대체할 수 있습니다.

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

메모리에 모을 작은 응답이라면 기한을 추가하기 전에 본문 읽기를 Deferred 체인에 포함하십시오.

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

이 조각은 애플리케이션에 이미 reactor와 구성된 에이전트가 있다고 가정합니다. ProxyAgent의 요청 Deferred는 응답 객체를 내놓고, readBody는 본문의 Deferred를 반환합니다. 콜백에서 이것을 반환하면 체인이 그 작업도 기다립니다.

위치가 중요합니다. Twisted는 addTimeout을 그 이전에 설치된 콜백이 나타내는 작업에 적용합니다. 나중에 본문 읽기를 추가하면 다른 경계를 뜻하게 됩니다. 이 배치에서는 타이머가 addTimeout이 호출될 때 시작되어 그 체인의 대기 중인 요청과 본문 작업을 포괄합니다.

크거나 무한한 본문에는 스트리밍 소비자를 사용하고 완료를 같은 방식으로 표현하십시오. 클라이언트 측 기한은 애플리케이션이 기다리는 시간을 제한할 뿐, 프록시 자체의 업스트림 연결 타임아웃을 다시 구성하지는 않습니다.

관련 글