1 #!/usr/bin/env python 2 3 """ 4 BaseHTTPRequestHandler adapter. 5 """ 6 7 import WebStack.BaseHTTPRequestHandler 8 import BaseHTTPServer 9 10 class HandlerFactory: 11 12 "A factory class creating WebStack dispatcher objects." 13 14 def __init__(self, resource, authenticator=None): 15 16 """ 17 Initialise the root application-specific 'resource' and optional 18 'authenticator'. 19 """ 20 21 self.webstack_resource = resource 22 self.webstack_authenticator = authenticator 23 24 def __call__(self, request, client_address, server): 25 26 "Act as a factory for the server objects." 27 28 handler = Handler(request, client_address, server, self.webstack_resource, 29 self.webstack_authenticator) 30 return handler 31 32 class Handler(BaseHTTPServer.BaseHTTPRequestHandler): 33 34 "A class dispatching requests to WebStack resources." 35 36 def __init__(self, request, client_address, server, resource, authenticator): 37 38 """ 39 Initialise the root application-specific 'resource' and 'authenticator'. 40 """ 41 42 self.webstack_resource = resource 43 self.webstack_authenticator = authenticator 44 BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server) 45 46 def handle(self): 47 48 "Dispatch the request to the root application-specific resource." 49 50 # NOTE: Overriding and trimming back the method's functionality. 51 52 self.raw_requestline = self.rfile.readline() 53 if not self.parse_request(): # An error code has been sent, just exit 54 return 55 56 trans = WebStack.BaseHTTPRequestHandler.Transaction(self) 57 if self.webstack_authenticator is None or self.webstack_authenticator.authenticate(trans): 58 self.webstack_resource.respond(trans) 59 else: 60 trans.set_response_code(401) # Unauthorized 61 trans.set_header_value("WWW-Authenticate", '%s realm="%s"' % ( 62 self.webstack_authenticator.get_auth_type(), self.webstack_authenticator.get_realm())) 63 64 trans.commit() 65 66 # vim: tabstop=4 expandtab shiftwidth=4