66from twisted .internet import defer
77
88from bwscanner .logger import log
9- from bwscanner .attacher import SOCKSClientStreamAttacher
109from bwscanner .circuit import TwoHop
11- from bwscanner .fetcher import OnionRoutedAgent , hashingReadBody
10+ from bwscanner .fetcher import OnionRoutedAgent
11+ from bwscanner .fetcher import get_tor_socks_endpoint , hashingReadBody
1212from bwscanner .writer import ResultSink
1313
1414# defer.setDebugging(True)
@@ -31,6 +31,7 @@ def __init__(self, state, clock, measurement_dir, **kwargs):
3131 this_partition: which partition of circuit we will process
3232 """
3333 self .state = state
34+ self ._socks = None
3435 self .clock = clock
3536 self .measurement_dir = measurement_dir
3637 self .partitions = kwargs .get ('partitions' , 1 )
@@ -55,9 +56,6 @@ def __init__(self, state, clock, measurement_dir, **kwargs):
5556
5657 self .result_sink = ResultSink (self .measurement_dir , chunk_size = 10 )
5758
58- # Add a stream attacher
59- self .state .set_attacher (SOCKSClientStreamAttacher (self .state ), clock )
60-
6159 def now (self ):
6260 return time .time ()
6361
@@ -162,14 +160,16 @@ def gotResult(result):
162160 return result
163161 deferred .addBoth (gotResult )
164162
165- agent = OnionRoutedAgent (self .clock , path = path , state = self .state )
166- request = agent .request ("GET" , url )
167- request .addCallback (hashingReadBody ) # returns a readBody Deferred
168- timeoutDeferred (request , self .request_timeout )
169- request .addCallbacks (get_circuit_bw )
170- request .addErrback (circ_failure )
171- request .addCallback (self .result_sink .send )
172- return request
163+ d = self .state .build_circuit (path , False )
164+ d .addCallback (lambda c : c .when_built ())
165+ d .addCallback (lambda c : c .web_agent (self .clock , self .socks ))
166+ d .addCallback (lambda a : a .request ("GET" , url ))
167+ d .addCallback (hashingReadBody )
168+ timeoutDeferred (d , self .request_timeout )
169+ d .addCallbacks (get_circuit_bw )
170+ d .addErrback (circ_failure )
171+ d .addCallback (self .result_sink .send )
172+ return d
173173
174174 @defer .inlineCallbacks
175175 def get_r_ns_bw (self , router ):
@@ -197,3 +197,10 @@ def get_r_desc_bw(self, router):
197197 defer .returnValue ((server_descriptor .average_bandwidth ,
198198 server_descriptor .burst_bandwidth ,
199199 server_descriptor .observed_bandwidth ))
200+
201+ @property
202+ @defer .inlineCallbacks
203+ def socks (self ):
204+ if self ._socks is None :
205+ self ._socks = yield get_tor_socks_endpoint (self .state )
206+ defer .returnValue (self ._socks )
0 commit comments