Skip to content

Commit 3600d7e

Browse files
committed
[FIX] Fix and improve API Log
1 parent 306320e commit 3600d7e

3 files changed

Lines changed: 31 additions & 2 deletions

File tree

spp_api/controllers/api.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#################################################################
3636

3737
API_ENDPOINT = "/api"
38+
SENSITIVE_KEYS = ["Authorization", "Cookie", "X-Api-Key", "X-Odoo-Session-Id"]
3839

3940

4041
def 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

spp_api/models/spp_api_log.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class Log(models.Model):
2828
)
2929
model = fields.Char(required=True)
3030
namespace_id = fields.Many2one("spp_api.namespace", "Integration")
31+
headers = fields.Text()
3132
request = fields.Text()
3233

3334
request_id = fields.Text(string="Request ID")

spp_api/views/openapi_view.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
<field name="create_uid" readonly="1" />
4646
<field name="create_date" readonly="1" />
4747
<field name="request" readonly="1" />
48+
<field name="headers" readonly="1" />
4849
<field name="request_data" readonly="1" />
4950
<field name="response_data" readonly="1" />
5051
</group>
@@ -302,7 +303,7 @@
302303
<record model="ir.actions.act_window" id="spp_api_log_list_action">
303304
<field name="name">API Logs</field>
304305
<field name="res_model">spp_api.log</field>
305-
<field name="view_mode">tree</field>
306+
<field name="view_mode">tree,form</field>
306307
<field name="help">List of API Logs.</field>
307308
</record>
308309

0 commit comments

Comments
 (0)