8d81c3de5f8c17d61cb43b243a8a53bd3d77f634
[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         host, path = path.split('/',1)
23         if not host:
24             host, path = path.split('/',1)
25         path = '/'+path
26         
27         # Make sure a port is included for consistency
28         if host.find(':') >= 0:
29             host, port = host.split(':', 1)
30             port = int(port)
31         else:
32             port = 80
33         
34         d = self.peers.get([(host, port, path)], "HEAD", modtime)
35         d.addCallback(self.check_freshness_done, path, resp)
36         return d
37     
38     def check_freshness_done(self, resp, path, orig_resp):
39         if resp.code == "304":
40             return orig_resp
41         else:
42             return self.get_resp(path)
43     
44     def get_resp(self, path):
45         d = defer.Deferred()
46         
47         findDefer = self.mirrors.findHash(path)
48         
49         findDefer.addcallback(self.findHash_done, path, d)
50         return d
51         
52     def findHash_done(self, (hash, size), path, d):
53         if hash is None:
54             host, path = path.split('/',1)
55             if not host:
56                 host, path = path.split('/',1)
57             path = '/'+path
58             
59             # Make sure a port is included for consistency
60             if host.find(':') >= 0:
61                 host, port = host.split(':', 1)
62                 port = int(port)
63             else:
64                 port = 80
65             getDefer = self.peers.get([(host, port, path)])
66             getDefer.addCallback(d.callback)
67