Skip to content

Commit 00fbdad

Browse files
committed
mmiddleware tests fixed
1 parent 404df7d commit 00fbdad

2 files changed

Lines changed: 34 additions & 19 deletions

File tree

fastapi_observer/middleware.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,9 @@ async def dispatch(
113113
raise
114114

115115
duration_ms = round((time.perf_counter() - start) * 1000, 3)
116-
response_body_for_log = (
117-
self._extract_response_body_for_log(response)
118-
if self.config.log_response_body
119-
else None
120-
)
116+
response_body_for_log: Any | None = None
117+
if self.config.log_response_body:
118+
response, response_body_for_log = await self._capture_response_for_log(response)
121119

122120
log_event(
123121
self.logger,
@@ -179,15 +177,37 @@ def _build_metadata(
179177
metadata["response_body"] = response_body
180178
return metadata
181179

182-
def _extract_response_body_for_log(self, response: Response) -> Any | None:
180+
async def _capture_response_for_log(
181+
self, response: Response
182+
) -> tuple[Response, Any | None]:
183183
body = getattr(response, "body", None)
184-
if body is None:
185-
return None
186184
if isinstance(body, bytes):
187-
return self._format_body_for_log(body)
185+
return response, self._format_body_for_log(body)
188186
if isinstance(body, str):
189-
return self._format_body_for_log(body.encode("utf-8"))
190-
return None
187+
return response, self._format_body_for_log(body.encode("utf-8"))
188+
189+
body_iterator = getattr(response, "body_iterator", None)
190+
if body_iterator is None:
191+
return response, None
192+
193+
chunks: list[bytes] = []
194+
async for chunk in body_iterator:
195+
if isinstance(chunk, bytes):
196+
chunks.append(chunk)
197+
else:
198+
chunks.append(str(chunk).encode("utf-8"))
199+
body_bytes = b"".join(chunks)
200+
201+
headers = dict(response.headers)
202+
headers.pop("content-length", None)
203+
replay_response = Response(
204+
content=body_bytes,
205+
status_code=response.status_code,
206+
headers=headers,
207+
media_type=response.media_type,
208+
background=response.background,
209+
)
210+
return replay_response, self._format_body_for_log(body_bytes)
191211

192212
def _format_body_for_log(self, body: bytes) -> Any:
193213
body_size = len(body)

tests/test_middleware.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
import logging
22

3-
import pytest
4-
5-
fastapi = pytest.importorskip("fastapi")
6-
testclient = pytest.importorskip("fastapi.testclient")
3+
# import httpx
4+
from fastapi import FastAPI
5+
from fastapi.testclient import TestClient
76

87
from fastapi_observer.config import ObserverConfig
98
from fastapi_observer.middleware import ObserverMiddleware
109

11-
FastAPI = fastapi.FastAPI
12-
TestClient = testclient.TestClient
13-
14-
1510
class InMemoryHandler(logging.Handler):
1611
def __init__(self) -> None:
1712
super().__init__()

0 commit comments

Comments
 (0)