Package pyamf :: Package remoting :: Module amf0
[hide private]
[frames] | no frames]

Source Code for Module pyamf.remoting.amf0

  1  # Copyright (c) 2007-2009 The PyAMF Project. 
  2  # See LICENSE.txt for details. 
  3   
  4  """ 
  5  AMF0 Remoting support. 
  6   
  7  @since: 0.1.0 
  8  """ 
  9   
 10  import traceback 
 11  import sys 
 12   
 13  from pyamf import remoting 
 14  from pyamf.remoting import gateway 
 15   
 16   
17 -class RequestProcessor(object):
18 - def __init__(self, gateway):
19 self.gateway = gateway
20
21 - def authenticateRequest(self, request, service_request, *args, **kwargs):
22 """ 23 Authenticates the request against the service. 24 25 @param request: The AMF request 26 @type request: L{Request<pyamf.remoting.Request>} 27 """ 28 username = password = None 29 30 if 'Credentials' in request.headers: 31 cred = request.headers['Credentials'] 32 33 username = cred['userid'] 34 password = cred['password'] 35 36 return self.gateway.authenticateRequest(service_request, username, 37 password, *args, **kwargs)
38
39 - def buildErrorResponse(self, request, error=None):
40 """ 41 Builds an error response. 42 43 @param request: The AMF request 44 @type request: L{Request<pyamf.remoting.Request>} 45 @return: The AMF response 46 @rtype: L{Response<pyamf.remoting.Response>} 47 """ 48 if error is not None: 49 cls, e, tb = error 50 else: 51 cls, e, tb = sys.exc_info() 52 53 return remoting.Response(build_fault(cls, e, tb, self.gateway.debug), 54 status=remoting.STATUS_ERROR)
55
56 - def _getBody(self, request, response, service_request, **kwargs):
57 if 'DescribeService' in request.headers: 58 return service_request.service.description 59 60 return self.gateway.callServiceRequest(service_request, *request.body, 61 **kwargs)
62
63 - def __call__(self, request, *args, **kwargs):
64 """ 65 Processes an AMF0 request. 66 67 @param request: The request to be processed. 68 @type request: L{Request<pyamf.remoting.Request>} 69 70 @return: The response to the request. 71 @rtype: L{Response<pyamf.remoting.Response>} 72 """ 73 response = remoting.Response(None) 74 75 try: 76 service_request = self.gateway.getServiceRequest(request, 77 request.target) 78 except gateway.UnknownServiceError: 79 return self.buildErrorResponse(request) 80 81 # we have a valid service, now attempt authentication 82 try: 83 authd = self.authenticateRequest(request, service_request, *args, 84 **kwargs) 85 except (SystemExit, KeyboardInterrupt): 86 raise 87 except: 88 return self.buildErrorResponse(request) 89 90 if not authd: 91 # authentication failed 92 response.status = remoting.STATUS_ERROR 93 response.body = remoting.ErrorFault(code='AuthenticationError', 94 description='Authentication failed') 95 96 return response 97 98 # authentication succeeded, now fire the preprocessor (if there is one) 99 try: 100 self.gateway.preprocessRequest(service_request, *args, **kwargs) 101 except (SystemExit, KeyboardInterrupt): 102 raise 103 except: 104 return self.buildErrorResponse(request) 105 106 try: 107 response.body = self._getBody(request, response, service_request, 108 *args, **kwargs) 109 110 return response 111 except (SystemExit, KeyboardInterrupt): 112 raise 113 except: 114 return self.buildErrorResponse(request)
115 116
117 -def build_fault(cls, e, tb, include_traceback=False):
118 """ 119 Builds a L{ErrorFault<pyamf.remoting.ErrorFault>} object based on the last 120 exception raised. 121 122 If include_traceback is C{False} then the traceback will not be added to 123 the L{remoting.ErrorFault}. 124 """ 125 if hasattr(cls, '_amf_code'): 126 code = cls._amf_code 127 else: 128 code = cls.__name__ 129 130 details = None 131 132 if include_traceback: 133 details = str(traceback.format_exception(cls, e, tb)).replace("\\n", '') 134 135 return remoting.ErrorFault(code=code, description=str(e), details=details)
136