1 #!/usr/bin/env python 2 3 """ 4 Twisted adapter. 5 """ 6 7 import WebStack.Twisted 8 from WebStack.Generic import EndOfResponse 9 import twisted.web.resource 10 11 class Dispatcher(twisted.web.resource.Resource): 12 13 "A class dispatching requests to WebStack resources." 14 15 isLeaf = 1 16 17 def __init__(self, resource, authenticator=None): 18 19 """ 20 Initialise the root application-specific 'resource' and optional 21 'authenticator'. 22 """ 23 24 twisted.web.resource.Resource.__init__(self) 25 self.webstack_resource = resource 26 self.webstack_authenticator = authenticator 27 28 def getChild(self, path, request): 29 raise NotImplementedError, "getChild" 30 31 def render(self, request): 32 33 "Dispatch the given 'request' to the root application-specific resource." 34 35 trans = WebStack.Twisted.Transaction(request) 36 if self.webstack_authenticator is None or self.webstack_authenticator.authenticate(trans): 37 try: 38 self.webstack_resource.respond(trans) 39 except EndOfResponse: 40 pass 41 else: 42 trans.set_response_code(401) # Unauthorized 43 trans.set_header_value("WWW-Authenticate", '%s realm="%s"' % ( 44 self.webstack_authenticator.get_auth_type(), self.webstack_authenticator.get_realm())) 45 46 trans.commit() 47 request.finish() 48 return twisted.web.server.NOT_DONE_YET 49 50 # vim: tabstop=4 expandtab shiftwidth=4