@@ -64,6 +64,7 @@ def __init__(self, handler):
64
64
self .DEBUG = self .moesif_options .get ('DEBUG' , False )
65
65
self .event = None
66
66
self .context = None
67
+ self .payload_version = None
67
68
68
69
# Intialized the client
69
70
if os .environ .get ("MOESIF_APPLICATION_ID" ):
@@ -75,12 +76,17 @@ def clear_state(self):
75
76
"""Function to clear state of local variable"""
76
77
self .event = None
77
78
self .context = None
79
+ self .payload_version = None
78
80
self .event_req = None
79
81
self .metadata = None
80
82
self .session_token = None
81
83
self .user_id = None
82
84
self .company_id = None
83
85
86
+ def is_payload_format_version_1_0 (cls , payload_format_version ):
87
+ """Function to check if the payload format version is 1.0 (old) or 2.0 (new) """
88
+ return payload_format_version == "1.0"
89
+
84
90
def get_user_id (self , event , context ):
85
91
"""Function to fetch UserId"""
86
92
username = None
@@ -116,14 +122,20 @@ def get_company_id(self, event, context):
116
122
print (e )
117
123
return company_id
118
124
119
- def build_uri (self , event ):
125
+ def build_uri (self , event , payload_format_version_1_0 ):
120
126
121
- uri = event ['headers' ].get ('X-Forwarded-Proto' , event ['headers' ].get ('x-forwarded-proto' , 'http' )) + '://' + event ['headers' ].get ('Host' , event ['headers' ].get ('host' , 'localhost' )) + event . get ( 'path' , '/' )
127
+ uri = event ['headers' ].get ('X-Forwarded-Proto' , event ['headers' ].get ('x-forwarded-proto' , 'http' )) + '://' + event ['headers' ].get ('Host' , event ['headers' ].get ('host' , 'localhost' ))
122
128
123
- if event .get ('multiValueQueryStringParameters' , {}):
124
- uri = uri + '?' + urlencode (event ['multiValueQueryStringParameters' ], doseq = True )
125
- elif event .get ('queryStringParameters' , {}):
126
- uri = uri + '?' + urlencode (event ['queryStringParameters' ])
129
+ if payload_format_version_1_0 :
130
+ uri = uri + event .get ('path' , '/' )
131
+ if event .get ('multiValueQueryStringParameters' , {}):
132
+ uri = uri + '?' + urlencode (event ['multiValueQueryStringParameters' ], doseq = True )
133
+ elif event .get ('queryStringParameters' , {}):
134
+ uri = uri + '?' + urlencode (event ['queryStringParameters' ])
135
+ else :
136
+ uri = uri + event .get ('rawPath' , '/' )
137
+ if event .get ('rawQueryString' , {}):
138
+ uri = uri + '?' + event ['rawQueryString' ]
127
139
return uri
128
140
129
141
def process_body (self , body_wrapper ):
@@ -159,16 +171,24 @@ def before(self, event, context):
159
171
# Clear the state of the local variables
160
172
self .clear_state ()
161
173
174
+ # Get the payload format version
175
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html
176
+ self .payload_version = event .get ('version' , '1.0' )
177
+
162
178
# Set/Save event and context for use Skip Event function
163
179
self .event = event
164
180
self .context = context
165
181
166
182
# Request Method
167
- request_verb = event .get ('httpMethod' )
183
+ if self .is_payload_format_version_1_0 (self .payload_version ):
184
+ request_verb = event .get ('httpMethod' )
185
+ else :
186
+ request_verb = event .get ('requestContext' , {}).get ('http' , {}).get ('method' )
168
187
if request_verb is None :
169
188
print ('MOESIF: [before] AWS Lambda trigger must be a Load Balancer or API Gateway See https://docs.aws.amazon.com/lambda/latest/dg/services-alb.html or https://docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https.html.' )
170
189
self .event = None
171
190
self .context = None
191
+ self .payload_version = None
172
192
return event , context
173
193
174
194
# Request headers
@@ -182,9 +202,13 @@ def before(self, event, context):
182
202
print (e )
183
203
184
204
# Request Time
185
- epoch = event and event .get ('request_context' , {}).get ('requestTimeEpoch' )
205
+ if self .is_payload_format_version_1_0 (self .payload_version ):
206
+ epoch = event and event .get ('requestContext' , {}).get ('requestTimeEpoch' )
207
+ else :
208
+ epoch = event and event .get ('requestContext' , {}).get ('timeEpoch' )
186
209
if epoch is not None :
187
- request_time = datetime .utcfromtimestamp (epoch )
210
+ # Dividing by 1000 to convert from ms to seconds and `.0` to preserve millisecond precision
211
+ request_time = datetime .utcfromtimestamp (epoch / 1000.0 )
188
212
else :
189
213
request_time = datetime .utcnow ()
190
214
@@ -257,11 +281,14 @@ def before(self, event, context):
257
281
print (e )
258
282
259
283
# IpAddress
260
- ip_address = event .get ('requestContext' , {}).get ('identity' , {}).get ('sourceIp' , None )
284
+ if self .is_payload_format_version_1_0 (self .payload_version ):
285
+ ip_address = event .get ('requestContext' , {}).get ('identity' , {}).get ('sourceIp' , None )
286
+ else :
287
+ ip_address = event .get ('requestContext' , {}).get ('http' , {}).get ('sourceIp' , None )
261
288
262
289
# Event Request Object
263
290
self .event_req = EventRequestModel (time = request_time .strftime ("%Y-%m-%dT%H:%M:%S.%f" )[:- 3 ],
264
- uri = self .build_uri (event ),
291
+ uri = self .build_uri (event , self . is_payload_format_version_1_0 ( self . payload_version ) ),
265
292
verb = request_verb ,
266
293
api_version = api_version ,
267
294
ip_address = self .client_ip .get_client_address (event ['headers' ], ip_address ),
0 commit comments