def fetch(self, path):
url = self.choose_url(path)
assert None not in path
log.msg('Downloading {} over {}, {}'.format(url,path[0].id_hex, path[-1].id_hex))
file_size = self.choose_file_size(path)
time_start = self.now()
@defer.inlineCallbacks
def get_circuit_bw(result):
time_end = self.now()
if len(result) < file_size:
raise DownloadIncomplete
report = dict()
report['time_end'] = time_end
report['time_start'] = time_start
report['circ_bw'] = (len(result) * 1000) / (report['time_end'] - report['time_start'])
report['path'] = [r.id_hex for r in path]
# We need to wait for these deferreds to be ready, we can't serialize
# deferreds.
report['path_desc_bws'] = []
report['path_ns_bws'] = []
for relay in path:
report['path_desc_bws'].append((yield self.get_r_desc_bw(relay)))
report['path_ns_bws'].append((yield self.get_r_ns_bw(relay)))
report['path_bws'] = [r.bandwidth for r in path]
defer.returnValue(report)
def circ_failure(failure):
time_end = self.now()
report = dict()
report['time_end'] = time_end
report['time_start'] = time_start
report['path'] = [r.id_hex for r in path]
report['failure'] = failure.__repr__()
return report
agent = OnionRoutedAgent(self.clock, path=path, state=self.state)
request = agent.request("GET", url)
timeout_circuit = self.clock.callLater(self.circuit_lifetime, request.cancel)
request.addCallback(readBody)
request.addCallbacks(get_circuit_bw, errback=circ_failure)
request.addCallback(self.result_sink.send)
# Stop circuit timeout callLater when we have been successful
request.addCallback(lambda _: timeout_circuit.cancel())
self.tasks.append(request)
评论列表
文章目录