From: Cameron Dale Date: Fri, 11 Jan 2008 00:40:23 +0000 (-0800) Subject: Make downloaded files accessible via the HTTP server. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=3348b1340e4c881d930071e85d0ef986c71c93cf;p=quix0rs-apt-p2p.git Make downloaded files accessible via the HTTP server. MirrorManager calls back to the main code, which adds an appropriate ~ (tilde) directory to the web server. --- diff --git a/apt_dht/HTTPServer.py b/apt_dht/HTTPServer.py index 181da4e..ebb34f1 100644 --- a/apt_dht/HTTPServer.py +++ b/apt_dht/HTTPServer.py @@ -47,8 +47,13 @@ class TopLevel(resource.Resource): self.subdirs = [] def addDirectory(self, directory): - path = "~" + str(len(self.subdirs)) - self.subdirs.append(directory) + assert directory + try: + idx = self.subdirs.index(directory) + except ValueError: + idx = len(self.subdirs) + self.subdirs.append(directory) + path = "~" + str(idx) return path def removeDirectory(self, directory): diff --git a/apt_dht/MirrorManager.py b/apt_dht/MirrorManager.py index 7f7805a..dd1b163 100644 --- a/apt_dht/MirrorManager.py +++ b/apt_dht/MirrorManager.py @@ -149,7 +149,8 @@ class ProxyFileStream(stream.SimpleStream): class MirrorManager: """Manages all requests for mirror objects.""" - def __init__(self, cache_dir): + def __init__(self, manager, cache_dir): + self.manager = manager self.cache_dir = cache_dir self.cache = filepath.FilePath(self.cache_dir) self.apt_caches = {} @@ -256,6 +257,8 @@ class MirrorManager: self.updatedFile(url, destFile.path) if ext: self.updatedFile(url[:-len(ext)], decFile.path) + + self.manager.download_complete(hash, url, destFile.path) else: log.msg("Hashes don't match %s != %s: %s" % (hash.hexexpected(), hash.hexdigest(), url)) diff --git a/apt_dht/apt_dht.py b/apt_dht/apt_dht.py index 73cfcb5..c3f1a76 100644 --- a/apt_dht/apt_dht.py +++ b/apt_dht/apt_dht.py @@ -1,5 +1,6 @@ from binascii import b2a_hex +import os.path from twisted.internet import defer from twisted.web2 import server, http, http_headers @@ -18,7 +19,7 @@ class AptDHT: self.http_server = TopLevel(config.get('DEFAULT', 'cache_dir'), self) self.http_site = server.Site(self.http_server) self.peers = PeerManager() - self.mirrors = MirrorManager(config.get('DEFAULT', 'cache_dir')) + self.mirrors = MirrorManager(self, config.get('DEFAULT', 'cache_dir')) def getSite(self): return self.http_site @@ -77,3 +78,16 @@ class AptDHT: getDefer.addCallback(self.mirrors.save_file, hash, path) getDefer.addErrback(self.mirrors.save_error, path) getDefer.addCallbacks(d.callback, d.errback) + + def download_complete(self, hash, url, file_path): + assert file_path.startswith(config.get('DEFAULT', 'cache_dir')) + directory = file_path[:len(config.get('DEFAULT', 'cache_dir'))] + url_path = file_path[len(config.get('DEFAULT', 'cache_dir')):] + if url_path[0] == '/': + url_path = url_path[1:] + top_directory = url_path.split('/',1)[0] + url_path = url_path[len(top_directory):] + http_dir = os.path.join(directory, top_directory) + new_top = self.http_server.addDirectory(http_dir) + url_path = '/' + new_top + url_path + log.msg('now avaliable at %s: %s' % (url_path, url))