|
2 | 2 | from moesifapi.models import EventModel |
3 | 3 | from collections import namedtuple |
4 | 4 | from .. import global_variables |
5 | | -import urlparse |
| 5 | +import base64 |
| 6 | +import json |
| 7 | +from ..utility_function.utility_function import UtilityFunction |
6 | 8 |
|
7 | 9 |
|
8 | 10 | class OutgoingRecorder(): |
9 | | - # Function to transform the request headers |
10 | | - def transform_key(self, key): |
11 | | - key = key.upper() |
12 | | - key = key.replace('-', '_') |
13 | | - return key |
14 | | - |
15 | | - # Function to create request headers |
16 | | - def create_request_headers(self,req_headers): |
| 11 | + |
| 12 | + # Function to base64 encode data |
| 13 | + def base64_encode(self, data): |
17 | 14 | try: |
18 | | - req_headers = {self.transform_key(k): v for k, v in req_headers.items()} |
| 15 | + if global_variables.DEBUG: |
| 16 | + print("about to parse request body as base64") |
| 17 | + encoded_body = base64.standard_b64encode(data) |
| 18 | + transfer_encoding = 'base64' |
| 19 | + if global_variables.DEBUG: |
| 20 | + print("base64 encoded body: " + encoded_body) |
19 | 21 | except: |
20 | | - req_headers = {} |
21 | | - return req_headers |
22 | | - |
23 | | - # Function to mock the requests as Django Request and Response object |
24 | | - def create_mock_request_response(self, event_model): |
25 | | - |
26 | | - fake_django_incoming_request = { |
27 | | - 'mo_mocked': True, |
28 | | - 'method': event_model['request']['verb'], |
29 | | - 'url': event_model['request']['uri'], |
30 | | - 'path': urlparse.urlparse(event_model['request']['uri']).path, |
31 | | - 'META': self.create_request_headers(event_model['request']['headers']), |
32 | | - 'body': event_model['request']['body'] |
33 | | - } |
| 22 | + if global_variables.DEBUG: |
| 23 | + print("Request body is of type other than json or base64") |
| 24 | + encoded_body = None |
| 25 | + transfer_encoding = None |
34 | 26 |
|
35 | | - fake_django_incoming_response = { |
36 | | - 'mo_mocked': True, |
37 | | - 'statusCode': event_model['response']['status'], |
38 | | - 'content': event_model['response']['body'] |
39 | | - } |
| 27 | + return encoded_body, transfer_encoding |
40 | 28 |
|
41 | | - fake_request = namedtuple("fake_request", fake_django_incoming_request.keys())( |
42 | | - *fake_django_incoming_request.values()) |
43 | | - fake_response = namedtuple("fake_response", fake_django_incoming_response.keys())( |
44 | | - *fake_django_incoming_response.values()) |
| 29 | + # Function to prepare the event_model |
| 30 | + def prepare_model(self, mock_req, mock_res, event_model, start_time, end_time): |
| 31 | + |
| 32 | + # Create an instance of the class |
| 33 | + utility_function = UtilityFunction() |
| 34 | + |
| 35 | + if mock_req.body: |
| 36 | + try: |
| 37 | + if global_variables.DEBUG: |
| 38 | + print('about to parse request json') |
| 39 | + req_body = json.loads(mock_req.body) |
| 40 | + if global_variables.DEBUG: |
| 41 | + print("Req body json parsed successfully") |
| 42 | + req_body = utility_function.mask_body(req_body, global_variables.moesif_options.get('REQUEST_BODY_MASKS')) |
| 43 | + req_body_transfer_encoding = 'json' |
| 44 | + except: |
| 45 | + req_body, req_body_transfer_encoding = self.base64_encode(mock_req.body) |
| 46 | + else: |
| 47 | + req_body = None |
| 48 | + req_body_transfer_encoding = None |
| 49 | + |
| 50 | + if mock_res.content: |
| 51 | + try: |
| 52 | + if global_variables.DEBUG: |
| 53 | + print("about to process response body as json") |
| 54 | + rsp_body = json.loads(mock_res.content) |
| 55 | + if global_variables.DEBUG: |
| 56 | + print("Resp body json parsed successfully") |
| 57 | + rsp_body = utility_function.mask_body(rsp_body, global_variables.moesif_options.get('RESPONSE_BODY_MASKS')) |
| 58 | + rsp_body_transfer_encoding = 'json' |
| 59 | + except: |
| 60 | + rsp_body, rsp_body_transfer_encoding = self.base64_encode(mock_res.content) |
| 61 | + else: |
| 62 | + rsp_body = None |
| 63 | + rsp_body_transfer_encoding = None |
| 64 | + |
| 65 | + mo_model = { |
| 66 | + 'request': { |
| 67 | + 'time': start_time, |
| 68 | + 'uri': mock_req.url, |
| 69 | + 'verb': mock_req.method, |
| 70 | + 'api_version': global_variables.moesif_options.get('API_VERSION', None), |
| 71 | + 'ip_address': None, |
| 72 | + 'headers': mock_req.headers._store, |
| 73 | + 'body': req_body, |
| 74 | + 'transfer_encoding': req_body_transfer_encoding |
| 75 | + }, |
| 76 | + 'response': { |
| 77 | + 'time': end_time, |
| 78 | + 'status': mock_res.status_code, |
| 79 | + 'headers': mock_res.headers._store, |
| 80 | + 'body': rsp_body, |
| 81 | + 'transfer_encoding': rsp_body_transfer_encoding |
| 82 | + }, |
| 83 | + 'session_token': event_model['session_token'], |
| 84 | + 'user_id': event_model['user_id'], |
| 85 | + 'metadata': event_model['metadata'] |
| 86 | + } |
45 | 87 |
|
46 | | - return fake_request, fake_response |
| 88 | + return mo_model |
47 | 89 |
|
48 | 90 | # Function to prepare the recorder |
49 | | - def prepare_recorder(self, options, event_model): |
50 | | - mock_req, mock_res = self.create_mock_request_response(event_model) |
| 91 | + def prepare_recorder(self, options, mock_req, mock_res, start_time, end_time): |
51 | 92 |
|
| 93 | + event_model = {} |
| 94 | + event_model['user_id'] = None |
52 | 95 | try: |
53 | | - identify_user = options.get('IDENTIFY_USER', None) |
| 96 | + identify_user = options.get('IDENTIFY_USER_OUTGOING', None) |
54 | 97 | if identify_user is not None: |
55 | 98 | event_model['user_id'] = identify_user(mock_req, mock_res) |
56 | 99 | except: |
57 | | - event_model['user_id'] = None |
58 | 100 | if global_variables.DEBUG: |
59 | 101 | print("can not execute identify_user function, Please check moesif settings.") |
60 | 102 |
|
| 103 | + event_model['session_token'] = None |
61 | 104 | try: |
62 | | - get_session_token = options.get('GET_SESSION_TOKEN', None) |
| 105 | + get_session_token = options.get('GET_SESSION_TOKEN_OUTGOING', None) |
63 | 106 | if get_session_token is not None: |
64 | 107 | event_model['session_token'] = get_session_token(mock_req, mock_res) |
65 | 108 | except: |
66 | | - event_model['session_token'] = None |
67 | 109 | if global_variables.DEBUG: |
68 | 110 | print("Can not execute get_session_token function. Please check moesif settings.") |
69 | 111 |
|
| 112 | + event_model['metadata'] = None |
70 | 113 | try: |
71 | | - get_metadata = options.get('GET_METADATA', None) |
| 114 | + get_metadata = options.get('GET_METADATA_OUTGOING', None) |
72 | 115 | if get_metadata is not None: |
73 | 116 | event_model['metadata'] = get_metadata(mock_req, mock_res) |
74 | 117 | except: |
75 | | - event_model['metadata'] = None |
76 | 118 | if global_variables.DEBUG: |
77 | 119 | print("can not execute get_metadata function, please check moesif settings.") |
78 | 120 |
|
79 | 121 | try: |
80 | | - skip_event = options.get('SKIP', None) |
| 122 | + skip_event = options.get('SKIP_OUTGOING', None) |
81 | 123 | if skip_event is not None: |
82 | 124 | if skip_event(mock_req, mock_res): |
83 | 125 | return mock_res |
84 | 126 | except: |
85 | 127 | if global_variables.DEBUG: |
86 | 128 | print("Having difficulty executing skip_event function. Please check moesif settings.") |
87 | 129 |
|
88 | | - return EventModel().from_dictionary(event_model) |
| 130 | + # Prepare the moesif model |
| 131 | + mo_model = self.prepare_model(mock_req, mock_res, event_model, start_time, end_time) |
| 132 | + return EventModel().from_dictionary(mo_model) |
0 commit comments