3535#################################################################
3636
3737API_ENDPOINT = "/api"
38+ SENSITIVE_KEYS = ["Authorization" , "Cookie" , "X-Api-Key" , "X-Odoo-Session-Id" ]
3839
3940
4041def create_api_log (func ):
@@ -43,6 +44,7 @@ def wrapper(self, *args, **kwargs):
4344 # Request Log
4445 path = kwargs .get ("path" )
4546 request_id = kwargs .get ("request_id" , False )
47+ namespace = kwargs .get ("namespace" , False )
4648 if not request_id :
4749 raise werkzeug .exceptions .HTTPException (
4850 response = error_response (400 , "Bad Request" , "request_id is required." )
@@ -52,10 +54,15 @@ def wrapper(self, *args, **kwargs):
5254 response = error_response (400 , "Bad Request" , "request_id is already taken." )
5355 )
5456
57+ namespace_id = False
58+ if namespace :
59+ namespace_id = request .env ["spp_api.namespace" ].search ([("name" , "=" , namespace )])
60+
5561 initial_val = {
5662 "method" : path .method ,
5763 "model" : path .model ,
5864 "request" : http .request .httprequest .full_path ,
65+ "namespace_id" : namespace_id .id if namespace_id else False ,
5966 }
6067
6168 request_log_val = initial_val .copy ()
@@ -64,7 +71,27 @@ def wrapper(self, *args, **kwargs):
6471 if path .method in ["get" ]:
6572 request_log_val ["request_parameter" ] = kwargs
6673 else :
67- request_log_val ["request_data" ] = kwargs
74+ # Try to get parsed JSON first
75+ # silent=True prevents Werkzeug from raising a 400 error on bad JSON
76+ json_payload = request .httprequest .get_json (silent = True )
77+
78+ if json_payload :
79+ request_data = json .dumps (json_payload )
80+ else :
81+ # Fallback to raw data if not JSON
82+ # errors='replace' inserts a character instead of crashing on bad bytes
83+ request_data = request .httprequest .get_data ().decode ("utf-8" , errors = "replace" )
84+
85+ request_log_val ["request_data" ] = request_data
86+
87+ # Sanitize headers
88+ safe_headers = {}
89+ for key , value in request .httprequest .headers .items ():
90+ if key in SENSITIVE_KEYS :
91+ safe_headers [key ] = "REDACTED"
92+ else :
93+ safe_headers [key ] = value
94+ request_log_val ["headers" ] = json .dumps (safe_headers )
6895
6996 request .env ["spp_api.log" ].create (request_log_val )
7097 del request_log_val
0 commit comments