]>
Commit | Line | Data |
---|---|---|
1 | from twisted.web import resource, server, static, http | |
2 | from twisted.internet import error, reactor | |
3 | import engines | |
4 | import mimetypes | |
5 | import config | |
6 | import sigdebug | |
7 | ||
8 | class RootResource(resource.Resource): | |
9 | def getChild(self, name, request): | |
10 | if name == "": | |
11 | name = "qui.html" | |
12 | return self.primaryChild.getChild(name, request) | |
13 | ||
14 | # we do NOT use the built-in timeOut mixin as it's very very buggy! | |
15 | class TimeoutHTTPChannel(http.HTTPChannel): | |
16 | timeout = config.HTTP_REQUEST_TIMEOUT | |
17 | ||
18 | def connectionMade(self): | |
19 | self.customTimeout = reactor.callLater(self.timeout, self.timeoutOccured) | |
20 | http.HTTPChannel.connectionMade(self) | |
21 | ||
22 | def timeoutOccured(self): | |
23 | self.customTimeout = None | |
24 | self.transport.loseConnection() | |
25 | ||
26 | def cancelTimeout(self): | |
27 | if self.customTimeout is not None: | |
28 | try: | |
29 | self.customTimeout.cancel() | |
30 | self.customTimeout = None | |
31 | except error.AlreadyCalled: | |
32 | pass | |
33 | ||
34 | def connectionLost(self, reason): | |
35 | self.cancelTimeout() | |
36 | http.HTTPChannel.connectionLost(self, reason) | |
37 | ||
38 | class RootSite(server.Site): | |
39 | # we do this ourselves as the built in timeout stuff is really really buggy | |
40 | protocol = TimeoutHTTPChannel | |
41 | ||
42 | def __init__(self, path, *args, **kwargs): | |
43 | root = RootResource() | |
44 | server.Site.__init__(self, root, *args, **kwargs) | |
45 | ||
46 | services = {} | |
47 | services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path) | |
48 | ||
49 | def register(service, path, *args, **kwargs): | |
50 | sobj = service("/" + path, *args, **kwargs) | |
51 | services[service.__name__] = sobj | |
52 | root.putChild(path, sobj) | |
53 | ||
54 | register(engines.AJAXEngine, "e") | |
55 | register(engines.FeedbackEngine, "feedback") | |
56 | register(engines.AuthgateEngine, "auth") | |
57 | register(engines.AdminEngine, "adminengine", services) | |
58 | ||
59 | mimetypes.types_map[".ico"] = "image/vnd.microsoft.icon" |