Skip to content

Commit 1403c7f

Browse files
author
Keyur
committed
Refactor: Capture outgoing requests
Refactor: Capture outgoing requests Update: Copyright Bump: version to 0.1.2
1 parent 7a747bd commit 1403c7f

File tree

7 files changed

+105
-160
lines changed

7 files changed

+105
-160
lines changed

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright (c) 2017 Moesif, Inc
1+
Copyright (c) 2018 Moesif, Inc
22

33
Licensed under the Apache License, Version 2.0 (the "License");
44
you may not use this file except in compliance with the License.

moesifpythonrequest/data_preparation/__init__.py

Whitespace-only changes.

moesifpythonrequest/data_preparation/transform_data.py

Lines changed: 0 additions & 110 deletions
This file was deleted.

moesifpythonrequest/outgoing_recorder/outgoing_recorder.py

Lines changed: 88 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,87 +2,131 @@
22
from moesifapi.models import EventModel
33
from collections import namedtuple
44
from .. import global_variables
5-
import urlparse
5+
import base64
6+
import json
7+
from ..utility_function.utility_function import UtilityFunction
68

79

810
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):
1714
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)
1921
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
3426

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
4028

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+
}
4587

46-
return fake_request, fake_response
88+
return mo_model
4789

4890
# 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):
5192

93+
event_model = {}
94+
event_model['user_id'] = None
5295
try:
53-
identify_user = options.get('IDENTIFY_USER', None)
96+
identify_user = options.get('IDENTIFY_USER_OUTGOING', None)
5497
if identify_user is not None:
5598
event_model['user_id'] = identify_user(mock_req, mock_res)
5699
except:
57-
event_model['user_id'] = None
58100
if global_variables.DEBUG:
59101
print("can not execute identify_user function, Please check moesif settings.")
60102

103+
event_model['session_token'] = None
61104
try:
62-
get_session_token = options.get('GET_SESSION_TOKEN', None)
105+
get_session_token = options.get('GET_SESSION_TOKEN_OUTGOING', None)
63106
if get_session_token is not None:
64107
event_model['session_token'] = get_session_token(mock_req, mock_res)
65108
except:
66-
event_model['session_token'] = None
67109
if global_variables.DEBUG:
68110
print("Can not execute get_session_token function. Please check moesif settings.")
69111

112+
event_model['metadata'] = None
70113
try:
71-
get_metadata = options.get('GET_METADATA', None)
114+
get_metadata = options.get('GET_METADATA_OUTGOING', None)
72115
if get_metadata is not None:
73116
event_model['metadata'] = get_metadata(mock_req, mock_res)
74117
except:
75-
event_model['metadata'] = None
76118
if global_variables.DEBUG:
77119
print("can not execute get_metadata function, please check moesif settings.")
78120

79121
try:
80-
skip_event = options.get('SKIP', None)
122+
skip_event = options.get('SKIP_OUTGOING', None)
81123
if skip_event is not None:
82124
if skip_event(mock_req, mock_res):
83125
return mock_res
84126
except:
85127
if global_variables.DEBUG:
86128
print("Having difficulty executing skip_event function. Please check moesif settings.")
87129

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)

moesifpythonrequest/patch_request/patch_request.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Import Libraries
22
from moesifapi.models import EventModel
3-
from ..data_preparation.transform_data import DataPreparation
43
from ..utility_function.utility_function import UtilityFunction
54
from ..outgoing_recorder.outgoing_recorder import OutgoingRecorder
65
import requests
@@ -24,15 +23,13 @@ def new_request_function(method, url, **kwargs):
2423
# Create an instance of the Outgoing Recorder class
2524
outgoing_recorder = OutgoingRecorder()
2625
utility_function = UtilityFunction()
27-
data_preparation = DataPreparation()
2826

2927
start_time = utility_function.get_current_time()
3028
response = old_request_function(method, url, **kwargs)
3129
end_time = utility_function.get_current_time()
3230

3331
if not utility_function.is_moesif(kwargs.get('headers', None), url):
34-
transform_event = data_preparation.transform_data(method, url, start_time, end_time, response, kwargs)
35-
generated_recorder = outgoing_recorder.prepare_recorder(global_variables.moesif_options, transform_event)
32+
generated_recorder = outgoing_recorder.prepare_recorder(global_variables.moesif_options, response.request, response, start_time, end_time)
3633

3734
if isinstance(generated_recorder, EventModel):
3835
moesif_response = recorder(global_variables.moesif_options.get('APPLICATION_ID'), generated_recorder)

moesifpythonrequest/utility_function/utility_function.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,17 @@ def flatten_to_string(self, value):
5050
if value is None:
5151
return ''
5252
return APIHelper.json_serialize(value)
53+
54+
# Function to transform the request headers
55+
def transform_key(self, key):
56+
key = key.upper()
57+
key = key.replace('-', '_')
58+
return key
59+
60+
# Function to create request headers
61+
def create_request_headers(self, req_headers):
62+
try:
63+
req_headers = {self.transform_key(k): v for k, v in req_headers.items()}
64+
except:
65+
req_headers = {}
66+
return req_headers

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
# Versions should comply with PEP440. For a discussion on single-sourcing
2929
# the version across setup.py and the project code, see
3030
# https://packaging.python.org/en/latest/single_source_version.html
31-
version='0.1.1',
31+
version='0.1.2',
3232

3333
description='Moesif Python request',
3434
long_description=long_description,

0 commit comments

Comments
 (0)