def _request(self, method, urn, genReceiver, bodyProducer=None, retries=3):
if self.backend_type == 'onion':
agent = TrueHeadersSOCKS5Agent(reactor,
proxyEndpoint=TCP4ClientEndpoint(reactor,
'127.0.0.1',
config.tor.socks_port))
else:
agent = Agent(reactor)
attempts = 0
finished = defer.Deferred()
def perform_request(attempts):
uri = urljoin(self.base_address, urn)
d = agent.request(method, uri, bodyProducer=bodyProducer,
headers=Headers(self.base_headers))
@d.addCallback
def callback(response):
try:
content_length = int(response.headers.getRawHeaders('content-length')[0])
except:
content_length = None
response.deliverBody(genReceiver(finished, content_length))
def errback(err, attempts):
# We we will recursively keep trying to perform a request until
# we have reached the retry count.
if attempts < retries:
log.err("Lookup {} failed. Retrying.".format(uri))
attempts += 1
perform_request(attempts)
else:
log.err("Failed. Giving up.")
finished.errback(err)
d.addErrback(errback, attempts)
perform_request(attempts)
return finished
评论列表
文章目录