1010app .template_folder = os .path .join (os .path .dirname (__file__ ), "templates" )
1111
1212# Configure logging
13- logging .basicConfig (level = logging .INFO , format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
13+ logging .basicConfig (level = logging .DEBUG , format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
1414logger = logging .getLogger (__name__ )
1515
1616@app .before_request
1717def log_request_info ():
1818 logger .info (f"Request: { request .method } { request .path } \n - Query: { request .args } \n - Headers: { request .headers } \n - Body: { request .get_data ()} " )
1919
20+
21+ def _extract_req_adornments (req : Request ) -> dict :
22+ """
23+ Extracts the request adornments from the request object.
24+ """
25+ req_adornments = {}
26+ if req .headers .get ('Authorization' ):
27+ auth_header = req .headers .get ('Authorization' )
28+ if auth_header .startswith ('Basic ' ):
29+ auth_value = auth_header .split (' ' )[1 ]
30+ decoded_value = base64 .b64decode (auth_value ).decode ('utf-8' )
31+ username , password = decoded_value .split (':' , 1 )
32+ req_adornments ['username' ] = username
33+ req_adornments ['password' ] = password
34+ elif auth_header .startswith ('Bearer ' ):
35+ token = auth_header .split (' ' )[1 ]
36+ req_adornments ['token' ] = token
37+ logger .debug (f"Host url: { request .host_url } " )
38+ host_components = request .host_url .split (':' )
39+ logger .debug (f"Host components: { host_components } " )
40+ if len (host_components ) == 3 :
41+ req_adornments ['scheme' ] = host_components [0 ]
42+ req_adornments ['host_name' ] = host_components [1 ].lstrip ('/' )
43+ req_adornments ['port' ] = int (host_components [2 ].strip ('/' ))
44+ elif len (host_components ) == 2 :
45+ req_adornments ['scheme' ] = host_components [0 ]
46+ req_adornments ['host_name' ] = host_components [1 ].lstrip ('/' )
47+
48+ logger .debug (f"Request adornments:\n { json .dumps (req_adornments , indent = 2 )} \n \n " )
49+
50+ return req_adornments
2051class GetMatcherConfig :
2152
2253 _ROOT_PATH_CFG : List [dict ] = {}
@@ -45,6 +76,7 @@ def _match_json_strict(self, lhs: dict, rhs: dict) -> bool:
4576
4677 def _match_json_by_key (self , lhs : dict , rhs : dict ) -> bool :
4778 for key , value in rhs .items ():
79+ logger .debug (f"Matching key: { key } from { json .dumps (lhs )} with value: { value } " )
4880 if key not in lhs :
4981 return False
5082 if isinstance (value , dict ):
@@ -53,6 +85,7 @@ def _match_json_by_key(self, lhs: dict, rhs: dict) -> bool:
5385 elif isinstance (value , list ):
5486 for item in value :
5587 if not self ._match_string (lhs [key ], item ):
88+ logger .debug (f"Matching item { item } in list { lhs [key ]} failed" )
5689 return False
5790 elif isinstance (value , str ):
5891 if not self ._match_string (lhs [key ], value ):
@@ -138,7 +171,7 @@ def match_route(self, req: Request) -> dict:
138171 for i in range (len (self ._ROOT_PATH_CFG )):
139172 route_name : str = f"route_{ i } "
140173 cfg : dict = self ._ROOT_PATH_CFG [i ]
141- logger .debug (f"Evaluating route: { route_name } " )
174+ logger .debug (f"Evaluating route: { route_name } with config: \n { json . dumps ( cfg , indent = 2 , sort_keys = True ) } \n \n " )
142175
143176 is_method_match : bool = self ._is_method_match (req , cfg )
144177 if not is_method_match :
@@ -200,87 +233,87 @@ def match_route(self, req: Request) -> dict:
200233@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-testing-keyvault/keys/' , methods = ['GET' ])
201234def keys_list_01 (resourceGroupName ):
202235 template_name = "keys-list-01.json"
203- response = make_response (render_template (template_name , request = request ))
236+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
204237 response .headers .update ({"Content-Type" : "application/json" })
205238 response .status_code = 200
206239 return response
207240
208241@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-alt-keyvault/keys/' , methods = ['GET' ])
209242def keys_list_02 (resourceGroupName ):
210243 template_name = "keys-list-02.json"
211- response = make_response (render_template (template_name , request = request ))
244+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
212245 response .headers .update ({"Content-Type" : "application/json" })
213246 response .status_code = 200
214247 return response
215248
216249@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-testing-keyvault/keys/dummy-key-01/' , methods = ['GET' ])
217250def key_detail_01 (resourceGroupName ):
218251 template_name = "key-detail-01.json"
219- response = make_response (render_template (template_name , request = request ))
252+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
220253 response .headers .update ({"Content-Type" : "application/json" })
221254 response .status_code = 200
222255 return response
223256
224257@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-testing-keyvault/keys/dummy-key-02/' , methods = ['GET' ])
225258def key_detail_02 (resourceGroupName ):
226259 template_name = "key-detail-02.json"
227- response = make_response (render_template (template_name , request = request ))
260+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
228261 response .headers .update ({"Content-Type" : "application/json" })
229262 response .status_code = 200
230263 return response
231264
232265@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-testing-keyvault/keys/alt-dummy-key-02/' , methods = ['GET' ])
233266def key_detail_03 (resourceGroupName ):
234267 template_name = "key-detail-03.json"
235- response = make_response (render_template (template_name , request = request ))
268+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
236269 response .headers .update ({"Content-Type" : "application/json" })
237270 response .status_code = 200
238271 return response
239272
240273@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-alt-keyvault/keys/alt-dummy-key-01/' , methods = ['GET' ])
241274def key_detail_04 (resourceGroupName ):
242275 template_name = "key-detail-04.json"
243- response = make_response (render_template (template_name , request = request ))
276+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
244277 response .headers .update ({"Content-Type" : "application/json" })
245278 response .status_code = 200
246279 return response
247280
248281@app .route ('/subscriptions/000000-0000-0000-0000-000000000022/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-alt-keyvault/keys/alt-dummy-key-02/' , methods = ['GET' ])
249282def key_detail_05 (resourceGroupName ):
250283 template_name = "key-detail-05.json"
251- response = make_response (render_template (template_name , request = request ))
284+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
252285 response .headers .update ({"Content-Type" : "application/json" })
253286 response .status_code = 200
254287 return response
255288
256289@app .route ('/subscriptions/000000-0000-0000-0000-000000000011/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-testing-keyvault/keys/dummy-key-01/' , methods = ['GET' ])
257290def key_detail_06 (resourceGroupName ):
258291 template_name = "key-detail-06.json"
259- response = make_response (render_template (template_name , request = request ))
292+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
260293 response .headers .update ({"Content-Type" : "application/json" })
261294 response .status_code = 200
262295 return response
263296
264297@app .route ('/subscriptions/000000-0000-0000-0000-000000000011/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/stackql-testing-keyvault/keys/' , methods = ['GET' ])
265298def keys_list_03 (resourceGroupName ):
266299 template_name = "keys-list-03.json"
267- response = make_response (render_template (template_name , request = request ))
300+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
268301 response .headers .update ({"Content-Type" : "application/json" })
269302 response .status_code = 200
270303 return response
271304
272305@app .route ('/subscriptions/<subscriptionId>/providers/Microsoft.Compute/sshPublicKeys/' , methods = ['GET' ])
273306def ssh_public_keys_list (subscriptionId ):
274307 template_name = "ssh-public-keys-list-01.json"
275- response = make_response (render_template (template_name , request = request ))
308+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
276309 response .headers .update ({"Content-Type" : "application/json" })
277310 response .status_code = 200
278311 return response
279312
280313@app .route ('/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupId>/providers/Microsoft.Compute/virtualMachines/' , methods = ['GET' ])
281314def virtual_machines_list (subscriptionId , resourceGroupId ):
282315 template_name = "virtual-machines-list-01.json"
283- response = make_response (render_template (template_name , request = request ))
316+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
284317 response .headers .update ({"Content-Type" : "application/json" })
285318 response .status_code = 200
286319 return response
@@ -295,11 +328,11 @@ def generic_handler(request: Request):
295328 route_cfg : dict = cfg_obj .match_route (request )
296329 template_name = route_cfg .get ("httpResponse" , {}).get ("template" , "" )
297330 if not template_name :
298- rv = make_response (render_template ('nil-response.json' , request = request ))
331+ rv = make_response (render_template ('nil-response.json' , request = request , ** _extract_req_adornments ( request ) ))
299332 rv .status_code = 404
300333 return rv
301334 logger .info (f"routing to template: { template_name } " )
302- response = make_response (render_template (template_name , request = request ))
335+ response = make_response (render_template (template_name , request = request , ** _extract_req_adornments ( request ) ))
303336 response .headers .update (route_cfg .get ("httpResponse" , {}).get ("headers" , {}))
304337 response .status_code = route_cfg .get ("httpResponse" , {}).get ("status" , 200 )
305338 return response
0 commit comments