@@ -64,6 +64,7 @@ def __init__(self, handler):
6464 self .DEBUG = self .moesif_options .get ('DEBUG' , False )
6565 self .event = None
6666 self .context = None
67+ self .payload_version = None
6768
6869 # Intialized the client
6970 if os .environ .get ("MOESIF_APPLICATION_ID" ):
@@ -75,12 +76,17 @@ def clear_state(self):
7576 """Function to clear state of local variable"""
7677 self .event = None
7778 self .context = None
79+ self .payload_version = None
7880 self .event_req = None
7981 self .metadata = None
8082 self .session_token = None
8183 self .user_id = None
8284 self .company_id = None
8385
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+
8490 def get_user_id (self , event , context ):
8591 """Function to fetch UserId"""
8692 username = None
@@ -116,14 +122,20 @@ def get_company_id(self, event, context):
116122 print (e )
117123 return company_id
118124
119- def build_uri (self , event ):
125+ def build_uri (self , event , payload_format_version_1_0 ):
120126
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' ))
122128
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' ]
127139 return uri
128140
129141 def process_body (self , body_wrapper ):
@@ -159,16 +171,24 @@ def before(self, event, context):
159171 # Clear the state of the local variables
160172 self .clear_state ()
161173
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+
162178 # Set/Save event and context for use Skip Event function
163179 self .event = event
164180 self .context = context
165181
166182 # 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' )
168187 if request_verb is None :
169188 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.' )
170189 self .event = None
171190 self .context = None
191+ self .payload_version = None
172192 return event , context
173193
174194 # Request headers
@@ -182,9 +202,13 @@ def before(self, event, context):
182202 print (e )
183203
184204 # 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' )
186209 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 )
188212 else :
189213 request_time = datetime .utcnow ()
190214
@@ -257,11 +281,14 @@ def before(self, event, context):
257281 print (e )
258282
259283 # 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 )
261288
262289 # Event Request Object
263290 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 ) ),
265292 verb = request_verb ,
266293 api_version = api_version ,
267294 ip_address = self .client_ip .get_client_address (event ['headers' ], ip_address ),
0 commit comments