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