]> git.mxchange.org Git - quix0rs-apt-p2p.git/blob - apt_dht/apt_dht.py
Add some of the fetching logic.
[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):
12         self.http_server = TopLevel(config.defaults()['cache_dir'], self)
13         self.http_site = server.Site(self.http_server)
14         self.peers = PeerManager()
15         self.mirrors = MirrorManager(config.defaults()['cache_dir'])
16     
17     def getSite(self):
18         return self.http_site
19     
20     def check_freshness(self, path, modtime, resp):
21         host, path = path.split('/',1)
22         if not host:
23             host, path = path.split('/',1)
24         path = '/'+path
25         
26         # Make sure a port is included for consistency
27         if host.find(':') >= 0:
28             host, port = host.split(':', 1)
29             port = int(port)
30         else:
31             port = 80
32         
33         d = self.peers.get([(host, port, path)], "HEAD", modtime)
34         d.addCallback(self.check_freshness_done, path, resp)
35         return d
36     
37     def check_freshness_done(self, resp, path, orig_resp):
38         if resp.code == "304":
39             return orig_resp
40         else:
41             return self.get_resp(path)
42     
43     def get_resp(self, path):
44         d = defer.Deferred()
45         
46         findDefer = self.mirrors.findHash(path)
47         
48         findDefer.addcallback(self.findHash_done, path, d)
49         return d
50         
51     def findHash_done(self, (hash, size), path, d):
52         if hash is None:
53             host, path = path.split('/',1)
54             if not host:
55                 host, path = path.split('/',1)
56             path = '/'+path
57             
58             # Make sure a port is included for consistency
59             if host.find(':') >= 0:
60                 host, port = host.split(':', 1)
61                 port = int(port)
62             else:
63                 port = 80
64             getDefer = self.peers.get([(host, port, path)])
65             getDefer.addCallback(d.callback)
66