From 4ce22858e46bbfa84a01ac0a38ed4d429b031b57 Mon Sep 17 00:00:00 2001 From: Nirvana Date: Fri, 4 Sep 2026 09:44:33 +0200 Subject: [PATCH] debug logging for timers --- routes/timers.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/routes/timers.py b/routes/timers.py index 52212d1..8346e5a 100644 --- a/routes/timers.py +++ b/routes/timers.py @@ -13,6 +13,7 @@ PUT /api/providers//timers/ DELETE /api/providers//timers/ """ +import json from bottle import request, response from streaming_providers.base.models.timer import ( @@ -331,7 +332,47 @@ def setup_timers_routes(app, manager, service): 500 on unexpected errors. """ try: - body = request.json + # TEMP DIAGNOSTIC (remove once the Invalid-JSON issue is confirmed + # fixed): request.json swallows the raw bytes on parse failure, so + # we can't tell what actually arrived. Read + log it manually first. + content_type = request.get_header("Content-Type", "") + content_length = request.get_header("Content-Length", "") + raw_body = request.body.read() + logger.info( + f"add_provider_timer[{provider}]: Content-Type={content_type!r} " + f"Content-Length header={content_length!r} actual bytes={len(raw_body)}" + ) + logger.info( + f"add_provider_timer[{provider}]: raw body (repr, truncated to 2000 chars)=" + f"{raw_body[:2000]!r}" + ) + + try: + body = json.loads(raw_body.decode("utf-8")) + except UnicodeDecodeError as e: + logger.error( + f"add_provider_timer[{provider}]: body is not valid UTF-8 — " + f"{e} — first 100 bytes hex: {raw_body[:100].hex()}" + ) + response.status = 400 + return { + "error": "Bad request", + "message": f"Request body is not valid UTF-8: {e}", + "provider": provider, + } + except json.JSONDecodeError as e: + logger.error( + f"add_provider_timer[{provider}]: JSON decode failed at " + f"line {e.lineno} col {e.colno} (char {e.pos}): {e.msg} — " + f"context: {raw_body[max(0, e.pos - 30):e.pos + 30]!r}" + ) + response.status = 400 + return { + "error": "Bad request", + "message": f"Request body must be valid JSON: {e.msg} at position {e.pos}", + "provider": provider, + } + if not body: response.status = 400 return {