from twisted.web2.client.http import ProtocolError, ClientRequest, HTTPClientProtocol
from twisted.trial import unittest
from zope.interface import implements
+from twisted.web2 import stream as stream_mod, http, http_headers, responsecode
class HTTPClientManager(ClientFactory):
"""A manager for all HTTP requests to a single site.
def __init__(self):
self.clients = {}
+
+ def setCommonHeaders(self, host):
+ headers = http_headers.Headers()
+ headers.setHeader('Host', host)
+ headers.setHeader('User-Agent', 'apt-dht/0.0.0 (twisted.web2 0.2.0+svn20070403)')
+ return headers
- def get(self, host, port, request):
+ def get(self, host, port, path, method="GET"):
site = host + ":" + str(port)
if site not in self.clients:
self.clients[site] = HTTPClientManager(host, port)
- return self.clients[site].submitRequest(request)
+ headers = self.setCommonHeaders(host)
+ return self.clients[site].submitRequest(ClientRequest(method, path, headers, None))
+
+ def getRange(self, host, port, path, rangeStart, rangeEnd, method="GET"):
+ site = host + ":" + str(port)
+ if site not in self.clients:
+ self.clients[site] = HTTPClientManager(host, port)
+ headers = self.setCommonHeaders(host)
+ headers.setHeader('Range', ('bytes', [(rangeStart, rangeEnd)]))
+ return self.clients[site].submitRequest(ClientRequest(method, path, headers, None))
def closeAll(self):
for site in self.clients:
def gotResp(self, resp, num, expect):
self.failUnless(resp.code >= 200 and resp.code < 300, "Got a non-200 response: %r" % resp.code)
- self.failUnless(resp.stream.length == expect, "Length was incorrect, got %r, expected %r" % (resp.stream.length, expect))
- resp.stream.close()
+ if expect is not None:
+ self.failUnless(resp.stream.length == expect, "Length was incorrect, got %r, expected %r" % (resp.stream.length, expect))
+ def print_(n):
+ pass
+ def printdone(n):
+ pass
+ stream_mod.readStream(resp.stream, print_).addCallback(printdone)
def test_download(self):
host = 'www.camrdale.org'
self.failUnless(resp.code >= 200 and resp.code < 300, "Got a non-200 response: %r" % resp.code)
if expect is not None:
self.failUnless(resp.stream.length == expect, "Length was incorrect, got %r, expected %r" % (resp.stream.length, expect))
- resp.stream.close()
+ def print_(n):
+ pass
+ def printdone(n):
+ pass
+ stream_mod.readStream(resp.stream, print_).addCallback(printdone)
def test_download(self):
self.manager = HTTPDownloader()
lastDefer = defer.Deferred()
host = 'www.camrdale.org'
- d = self.manager.get(host, 80, ClientRequest("GET", '/robots.txt', {'Host':host}, None))
+ d = self.manager.get(host, 80, '/robots.txt')
d.addCallback(self.gotResp, 1, 309)
d.addBoth(lastDefer.callback)
return lastDefer
lastDefer = defer.Deferred()
host = 'www.camrdale.org'
- d = self.manager.get(host, 80, ClientRequest("HEAD", '/robots.txt', {'Host':host}, None))
+ d = self.manager.get(host, 80, '/robots.txt', "HEAD")
d.addCallback(self.gotResp, 1, 0)
d.addBoth(lastDefer.callback)
return lastDefer
lastDefer = defer.Deferred()
def newRequest(host, path, num, expect, last=False):
- d = self.manager.get(host, 80, ClientRequest("GET", path, {'Host':host}, None))
+ d = self.manager.get(host, 80, path)
d.addCallback(self.gotResp, num, expect)
if last:
d.addCallback(lastDefer.callback)
lastDefer = defer.Deferred()
host = 'www.camrdale.org'
- d = self.manager.get(host, 80, ClientRequest("GET", '/robots.txt', {'Host':host, 'Range': ('bytes', [(100, 199)])}, None))
+ d = self.manager.getRange(host, 80, '/robots.txt', 100, 199)
d.addCallback(self.gotResp, 1, 100)
d.addBoth(lastDefer.callback)
return lastDefer