HTTPServer now gets it's dictionary of subdirectories externally.
[quix0rs-apt-p2p.git] / apt_dht / HTTPServer.py
1 import os.path, time
2
3 from twisted.python import log
4 from twisted.internet import defer
5 from twisted.web2 import server, http, resource, channel
6 from twisted.web2 import static, http_headers, responsecode
7
8 class FileDownloader(static.File):
9     
10     def __init__(self, path, manager, defaultType="text/plain", ignoredExts=(), processors=None, indexNames=None):
11         self.manager = manager
12         super(FileDownloader, self).__init__(path, defaultType, ignoredExts, processors, indexNames)
13         
14     def renderHTTP(self, req):
15         log.msg('Got request for %s from %s' % (req.uri, req.remoteAddr))
16         resp = super(FileDownloader, self).renderHTTP(req)
17         if isinstance(resp, defer.Deferred):
18             resp.addCallback(self._renderHTTP_done, req)
19         else:
20             resp = self._renderHTTP_done(resp, req)
21         return resp
22         
23     def _renderHTTP_done(self, resp, req):
24         log.msg('Initial response to %s: %r' % (req.uri, resp))
25         
26         if self.manager:
27             path = 'http:/' + req.uri
28             if resp.code >= 200 and resp.code < 400:
29                 return self.manager.check_freshness(path, resp.headers.getHeader('Last-Modified'), resp)
30             
31             log.msg('Not found, trying other methods for %s' % req.uri)
32             return self.manager.get_resp(path)
33         
34         return resp
35
36     def createSimilarFile(self, path):
37         return self.__class__(path, self.manager, self.defaultType, self.ignoredExts,
38                               self.processors, self.indexNames[:])
39         
40         
41 class TopLevel(resource.Resource):
42     addSlash = True
43     
44     def __init__(self, directory, manager):
45         self.directory = directory
46         self.manager = manager
47         self.subdirs = {}
48
49     def setDirectories(self, dirs):
50         self.subdirs = {}
51         for k in dirs:
52             # Don't allow empty subdirectory
53             if k:
54                 self.subdirs[k] = dirs[k]
55     
56     def render(self, ctx):
57         return http.Response(
58             200,
59             {'content-type': http_headers.MimeType('text', 'html')},
60             """<html><body>
61             <h2>Statistics</h2>
62             <p>TODO: eventually some stats will be shown here.</body></html>""")
63
64     def locateChild(self, request, segments):
65         name = segments[0]
66         if name in self.subdirs:
67             log.msg('Sharing %s with %s' % (request.uri, request.remoteAddr))
68             return static.File(self.subdirs[name]), segments[1:]
69         
70         if request.remoteAddr.host != "127.0.0.1":
71             log.msg('Blocked illegal access to %s from %s' % (request.uri, request.remoteAddr))
72             return None, ()
73             
74         if len(name) > 1:
75             return FileDownloader(self.directory, self.manager), segments[0:]
76         else:
77             return self, ()
78         
79 if __name__ == '__builtin__':
80     # Running from twistd -y
81     t = TopLevel('/home', None)
82     t.addDirectory('/tmp')
83     t.addDirectory('/var/log')
84     site = server.Site(t)
85     
86     # Standard twisted application Boilerplate
87     from twisted.application import service, strports
88     application = service.Application("demoserver")
89     s = strports.service('tcp:18080', channel.HTTPFactory(site))
90     s.setServiceParent(application)