def __init__(self, host, port=80):
self.host = host
self.port = port
+ self.mirror = False
self.rank = 0.5
self.busy = False
self.pipeline = False
self._downloadSpeeds = []
self._lastResponse = None
self._responseTimes = []
+
+ def __repr__(self):
+ return "(%r, %r, %r)" % (self.host, self.port, self.rank)
#{ Manage the request queue
def connect(self):
assert self.closed and not self.connecting
self.connecting = True
d = protocol.ClientCreator(reactor, HTTPClientProtocol, self).connectTCP(self.host, self.port)
- d.addCallback(self.connected)
+ d.addCallbacks(self.connected, self.connectionError)
def connected(self, proto):
"""Begin processing the queued requests."""
self.proto = proto
self.processQueue()
+ def connectionError(self, err):
+ """Cancel the requests."""
+ log.msg('Failed to connect to the peer by HTTP.')
+ log.err(err)
+
+ # Remove one request so that we don't loop indefinitely
+ if self.request_queue:
+ req = self.request_queue.pop(0)
+ req.deferRequest.errback(err)
+
+ self._completed += 1
+ self._errors += 1
+ self.rerank()
+ if self.connecting:
+ self.connecting = False
+ self.clientGone(None)
+
def close(self):
"""Close the connection to the peer."""
if not self.closed:
req = self.response_queue.pop(0)
log.msg('%s of %s completed with code %d' % (req.method, req.uri, resp.code))
self._completed += 1
- if resp.code >= 400:
- self._errors += 1
now = datetime.now()
self._responseTimes.append((now, now - req.submissionTime))
self._lastResponse = (now, resp.stream.length)