Skip to content

Commit f26630f

Browse files
authored
Fix client disconnect check in Starlette middleware (#113)
* Fix client disconnect check in Starlette middleware * Fix * Fix
1 parent c3ac678 commit f26630f

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

apitally/starlette.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
9191

9292
async def receive_wrapper() -> Message:
9393
nonlocal request_body, request_body_too_large
94+
9495
message = await receive()
9596
if message["type"] == "http.request" and self.capture_request_body and not request_body_too_large:
9697
request_body += message.get("body", b"")
@@ -109,6 +110,7 @@ async def send_wrapper(message: Message) -> None:
109110
response_chunked, \
110111
response_content_type, \
111112
response_size
113+
112114
if message["type"] == "http.response.start":
113115
response_time = time.perf_counter() - start_time
114116
response_status = message["status"]
@@ -120,9 +122,11 @@ async def send_wrapper(message: Message) -> None:
120122
response_content_type = response_headers.get("Content-Type")
121123
response_size = parse_int(response_headers.get("Content-Length")) if not response_chunked else 0
122124
response_body_too_large = response_size is not None and response_size > MAX_BODY_SIZE
125+
123126
elif message["type"] == "http.response.body":
124127
if response_chunked and response_size is not None:
125128
response_size += len(message.get("body", b""))
129+
126130
if (
127131
(self.capture_response_body or response_status == 422)
128132
and RequestLogger.is_supported_content_type(response_content_type)
@@ -132,6 +136,11 @@ async def send_wrapper(message: Message) -> None:
132136
if len(response_body) > MAX_BODY_SIZE:
133137
response_body_too_large = True
134138
response_body = b""
139+
140+
if self.capture_client_disconnects and await request.is_disconnected():
141+
# Client closed connection (report NGINX specific status code)
142+
response_status = 499
143+
135144
await send(message)
136145

137146
try:
@@ -142,9 +151,6 @@ async def send_wrapper(message: Message) -> None:
142151
finally:
143152
if response_time is None:
144153
response_time = time.perf_counter() - start_time
145-
if self.capture_client_disconnects and await request.is_disconnected():
146-
# Client closed connection (report NGINX specific status code)
147-
response_status = 499
148154
self.add_request(
149155
timestamp=timestamp,
150156
request=request,

0 commit comments

Comments
 (0)