measurement.py 文件源码

python
阅读 23 收藏 0 点赞 0 评论 0

项目:bwscanner 作者: TheTorProject 项目源码 文件源码
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)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号