]> git.mxchange.org Git - quix0rs-apt-p2p.git/blobdiff - HTTPDownloader.py
AptPackages only takes a single cache directory.
[quix0rs-apt-p2p.git] / HTTPDownloader.py
index 290c7f9a8a56f0a77e3bd27025d52912fc8a6da5..c580ed4714d946edd9dab01f1b9eec28da68737d 100644 (file)
@@ -5,6 +5,7 @@ from twisted.web2.client.interfaces import IHTTPClientManager
 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.
@@ -109,12 +110,27 @@ class HTTPDownloader:
     
     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:
@@ -129,8 +145,13 @@ class TestClientManager(unittest.TestCase):
     
     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'
@@ -208,7 +229,11 @@ class TestDownloader(unittest.TestCase):
         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()
@@ -216,7 +241,7 @@ class TestDownloader(unittest.TestCase):
         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
@@ -227,7 +252,7 @@ class TestDownloader(unittest.TestCase):
         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
@@ -238,7 +263,7 @@ class TestDownloader(unittest.TestCase):
         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)
@@ -261,7 +286,7 @@ class TestDownloader(unittest.TestCase):
         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