4 from twisted.web2.client import http
5 from twisted.internet.defer import Deferred
6 from twisted.internet.protocol import ClientFactory
7 from twisted.web2.client.interfaces import IHTTPClientManager
8 from zope.interface import implements
10 class HTTPClientManager(ClientFactory):
11 """A manager for all HTTP requests to a site.
16 implements(IHTTPClientManager)
18 protocol = HTTPClientProtocol
20 def __init__(self, host, port):
23 self.client = http.HTTPClientProtocol(self)
27 self.pending_requests = []
30 uri = 'http://' + self.host + ':' + str(self.port) + path
31 request = http.ClientRequest('GET', uri, {}, None)
32 request.responseDefer = Deferred()
33 self.pending_requests.append(request)
37 return request.responseDefer
39 def _submitRequest(self):
40 assert self.pending_requests
43 self.client = http.HTTPClientProtocol(self)
45 request = self.pending_requests.pop()
46 d = self.client.submitRequest(request, False)
47 d.addCallback(request.responseDefer.callback)
49 def clientBusy(self, proto):
52 def clientIdle(self, proto):
54 if self.pending_requests:
57 def clientPipelining(self, proto):
60 def clientGone(self, proto):
65 if self.pending_requests:
68 class TestDownloader(unittest.TestCase):
70 def test_download(self):
71 h = HTTPClientManager('www.google.ca', 80)
72 def print_resutls(result):
75 d = h.get('/index.html')
76 d.addCallback(print_results)
79 if __name__ == '__main__':