|
1 | 1 | """Utilities for middleware response handling.""" |
2 | 2 |
|
3 | 3 | import json |
| 4 | +import logging |
4 | 5 | from abc import ABC, abstractmethod |
5 | 6 | from typing import Any, Optional |
6 | 7 |
|
7 | 8 | from starlette.datastructures import MutableHeaders |
8 | 9 | from starlette.requests import Request |
| 10 | +from starlette.responses import JSONResponse |
9 | 11 | from starlette.types import ASGIApp, Message, Receive, Scope, Send |
10 | 12 |
|
| 13 | +logger = logging.getLogger(__name__) |
| 14 | + |
11 | 15 |
|
12 | 16 | class JsonResponseMiddleware(ABC): |
13 | 17 | """Base class for middleware that transforms JSON response bodies.""" |
@@ -78,7 +82,18 @@ async def transform_response(message: Message) -> None: |
78 | 82 |
|
79 | 83 | # Transform the JSON body |
80 | 84 | if body: |
81 | | - data = json.loads(body) |
| 85 | + try: |
| 86 | + data = json.loads(body) |
| 87 | + except json.JSONDecodeError as e: |
| 88 | + logger.error("Error parsing JSON: %s", e) |
| 89 | + logger.error("Body: %s", body) |
| 90 | + logger.error("Response scope: %s", scope) |
| 91 | + response = JSONResponse( |
| 92 | + {"error": "Received invalid JSON from upstream server"}, |
| 93 | + status_code=502, |
| 94 | + ) |
| 95 | + await response(scope, receive, send) |
| 96 | + return |
82 | 97 | transformed = self.transform_json(data, request=request) |
83 | 98 | body = json.dumps(transformed).encode() |
84 | 99 |
|
|
0 commit comments