]> jfr.im git - irc/quakenet/qwebirc.git/blob - qwebirc/root.py
Merge default into stable.
[irc/quakenet/qwebirc.git] / qwebirc / root.py
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"