2 from twisted.internet import defer
3 from twisted.web2 import server, http, http_headers
5 from apt_dht_conf import config
6 from PeerManager import PeerManager
7 from HTTPServer import TopLevel
8 from MirrorManager import MirrorManager
11 def __init__(self, dht):
13 self.http_server = TopLevel(config.get('DEFAULT', 'cache_dir'), self)
14 self.http_site = server.Site(self.http_server)
15 self.peers = PeerManager()
16 self.mirrors = MirrorManager(config.get('DEFAULT', 'cache_dir'))
21 def check_freshness(self, path, modtime, resp):
22 d = self.peers.get([path], "HEAD", modtime)
23 d.addCallback(self.check_freshness_done, path, resp)
26 def check_freshness_done(self, resp, path, orig_resp):
27 if resp.code == "304":
30 return self.get_resp(path)
32 def get_resp(self, path):
35 findDefer = self.mirrors.findHash(path)
37 findDefer.addcallback(self.findHash_done, path, d)
40 def findHash_done(self, (hash, size), path, d):
42 getDefer = self.peers.get([path])
43 getDefer.addCallback(d.callback)
45 # Lookup hash from DHT
46 lookupDefer = self.dht.getValue(hash)
47 lookupDefer.addCallback(self.lookupHash_done, hash, size, path, d)
49 def lookupHash_done(self, locations, hash, size, path, d):
51 getDefer = self.peers.get([path])
52 getDefer.addCallback(d.callback)
54 # Download from the found peers
55 getDefer = self.peers.get(locations)
56 getDefer.addCallback(d.callback)