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