1
2
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
20
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
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
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
92 response.status = remoting.STATUS_ERROR
93 response.body = remoting.ErrorFault(code='AuthenticationError',
94 description='Authentication failed')
95
96 return response
97
98
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
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