]> git.mxchange.org Git - quix0rs-apt-p2p.git/blob - apt_dht/HTTPServer.py
f5e969ccfc81c8565c77d56c56b3d60ea8662803
[quix0rs-apt-p2p.git] / apt_dht / HTTPServer.py
1 import os.path, time
2
3 from twisted.web2 import server, http, resource, channel
4 from twisted.web2 import static, http_headers, responsecode
5
6 class FileDownloader(static.File):
7     
8     def __init__(self, path, manager, defaultType="text/plain", ignoredExts=(), processors=None, indexNames=None):
9         self.manager = manager
10         super(FileDownloader, self).__init__(path, defaultType, ignoredExts, processors, indexNames)
11         
12     def render(self, req):
13         resp = super(FileDownloader, self).render(req)
14         
15         if self.manager:
16             path = 'http:/' + req.uri
17             if resp != responsecode.NOT_FOUND:
18                 return self.manager.check_freshness(path, resp.headers.getHeader('Last-Modified'), resp)
19             
20             return self.manager.get_resp(path)
21         
22         return resp
23
24     def createSimilarFile(self, path):
25         return self.__class__(path, self.manager, self.defaultType, self.ignoredExts,
26                               self.processors, self.indexNames[:])
27 class TopLevel(resource.Resource):
28     addSlash = True
29     
30     def __init__(self, directory, manager):
31         self.directory = directory
32         self.manager = manager
33         self.subdirs = []
34
35     def addDirectory(self, directory):
36         path = "~" + str(len(self.subdirs))
37         self.subdirs.append(directory)
38         return path
39     
40     def removeDirectory(self, directory):
41         loc = self.subdirs.index(directory)
42         self.subdirs[loc] = ''
43         
44     def render(self, ctx):
45         return http.Response(
46             200,
47             {'content-type': http_headers.MimeType('text', 'html')},
48             """<html><body>
49             <h2>Statistics</h2>
50             <p>TODO: eventually some stats will be shown here.</body></html>""")
51
52     def locateChild(self, request, segments):
53         name = segments[0]
54         if len(name) > 1 and name[0] == '~':
55             try:
56                 loc = int(name[1:])
57             except:
58                 return None, ()
59             
60             if loc >= 0 and loc < len(self.subdirs) and self.subdirs[loc]:
61                 return static.File(self.subdirs[loc]), segments[1:]
62             else:
63                 return None, ()
64         
65         if len(name) > 1:
66             return FileDownloader(self.directory, self.manager), segments[0:]
67         else:
68             return self, ()
69         
70 if __name__ == '__builtin__':
71     # Running from twistd -y
72     t = TopLevel('/home', None)
73     t.addDirectory('/tmp')
74     t.addDirectory('/var/log')
75     site = server.Site(t)
76     
77     # Standard twisted application Boilerplate
78     from twisted.application import service, strports
79     application = service.Application("demoserver")
80     s = strports.service('tcp:18080', channel.HTTPFactory(site))
81     s.setServiceParent(application)