Skip to content

Commit daf5d09

Browse files
authored
fix(middleware): enhance JSON parsing error handling (#73)
Added logging for JSON parsing errors in the JsonResponseMiddleware. If an invalid JSON is received, a 502 response is returned with an error message, improving error visibility and response management. closes #72
1 parent a942200 commit daf5d09

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/stac_auth_proxy/utils/middleware.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
"""Utilities for middleware response handling."""
22

33
import json
4+
import logging
45
from abc import ABC, abstractmethod
56
from typing import Any, Optional
67

78
from starlette.datastructures import MutableHeaders
89
from starlette.requests import Request
10+
from starlette.responses import JSONResponse
911
from starlette.types import ASGIApp, Message, Receive, Scope, Send
1012

13+
logger = logging.getLogger(__name__)
14+
1115

1216
class JsonResponseMiddleware(ABC):
1317
"""Base class for middleware that transforms JSON response bodies."""
@@ -78,7 +82,18 @@ async def transform_response(message: Message) -> None:
7882

7983
# Transform the JSON body
8084
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
8297
transformed = self.transform_json(data, request=request)
8398
body = json.dumps(transformed).encode()
8499

tests/test_middleware.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,21 @@ async def test_endpoint():
101101
assert response.status_code == 200
102102
assert "text/plain" in response.headers["content-type"]
103103
assert response.text == "invalid json"
104+
105+
106+
def test_json_response_middleware_invalid_json_upstream():
107+
"""Test that invalid JSON from upstream server returns 502 error."""
108+
app = FastAPI()
109+
app.add_middleware(ExampleJsonResponseMiddleware)
110+
111+
@app.get("/test")
112+
async def test_endpoint():
113+
# Return invalid JSON with JSON content type to trigger the error handling
114+
return Response(content="invalid json content", media_type="application/json")
115+
116+
client = TestClient(app)
117+
response = client.get("/test")
118+
assert response.status_code == 502
119+
assert response.headers["content-type"] == "application/json"
120+
data = response.json()
121+
assert data == {"error": "Received invalid JSON from upstream server"}

0 commit comments

Comments
 (0)