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