Move all url parsing into the PeerManager.
[quix0rs-apt-p2p.git] / apt_dht / apt_dht.py
1
2 from twisted.internet import defer
3 from twisted.web2 import server, http, http_headers
4
5 from apt_dht_conf import config
6 from PeerManager import PeerManager
7 from HTTPServer import TopLevel
8 from MirrorManager import MirrorManager
9
10 class AptDHT:
11     def __init__(self, dht):
12         self.dht = 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'))
17     
18     def getSite(self):
19         return self.http_site
20     
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)
24         return d
25     
26     def check_freshness_done(self, resp, path, orig_resp):
27         if resp.code == "304":
28             return orig_resp
29         else:
30             return self.get_resp(path)
31     
32     def get_resp(self, path):
33         d = defer.Deferred()
34         
35         findDefer = self.mirrors.findHash(path)
36         
37         findDefer.addcallback(self.findHash_done, path, d)
38         return d
39         
40     def findHash_done(self, (hash, size), path, d):
41         if hash is None:
42             getDefer = self.peers.get([path])
43             getDefer.addCallback(d.callback)
44         else:
45             # Lookup hash from DHT
46             lookupDefer = self.dht.getValue(hash)
47             lookupDefer.addCallback(self.lookupHash_done, hash, size, path, d)
48             
49     def lookupHash_done(self, locations, hash, size, path, d):
50         if not locations:
51             getDefer = self.peers.get([path])
52             getDefer.addCallback(d.callback)
53         else:
54             # Download from the found peers
55             getDefer = self.peers.get(locations)
56             getDefer.addCallback(d.callback)
57