22from urllib .parse import urlparse
33
44
5- def asgi_proxy (backend , log = None , timeout = None ):
5+ def asgi_proxy (
6+ backend , log = None , timeout = None , log_request_body = None , log_response_body = None
7+ ):
68 backend_host = urlparse (backend ).netloc
79
810 async def asgi_proxy (scope , receive , send ):
@@ -32,6 +34,10 @@ async def asgi_proxy(scope, receive, send):
3234 body += message .get ("body" , b"" )
3335 more_body = message .get ("more_body" , False )
3436
37+ # Log request body if requested
38+ if log_request_body :
39+ log_request_body (body )
40+
3541 async with httpx .AsyncClient (timeout = timeout ) as client :
3642 try :
3743 # Stream it, in case of long streaming responses
@@ -41,6 +47,10 @@ async def asgi_proxy(scope, receive, send):
4147 if log :
4248 log .info (f"Request: { method } { url } " )
4349 log .info (f"Response: { resp .status_code } { resp .reason_phrase } " )
50+
51+ # Initialize response body accumulator if needed
52+ response_body = b"" if log_response_body else None
53+
4454 # Start the response
4555 await send (
4656 {
@@ -57,6 +67,8 @@ async def asgi_proxy(scope, receive, send):
5767 # aiter_raw not aiter_bytes because we don't want
5868 # content decoding to have been applied
5969 async for chunk in resp .aiter_raw ():
70+ if log_response_body :
71+ response_body += chunk
6072 await send (
6173 {
6274 "type" : "http.response.body" ,
@@ -71,9 +83,18 @@ async def asgi_proxy(scope, receive, send):
7183 f"Client disconnected: { e .__class__ .__name__ } : { e } "
7284 )
7385 await send ({"type" : "http.response.body" , "more_body" : False })
86+
87+ # Log response body even if client disconnected
88+ if log_response_body and response_body is not None :
89+ log_response_body (response_body )
7490 return
7591
7692 await send ({"type" : "http.response.body" , "more_body" : False })
93+
94+ # Log response body if requested
95+ if log_response_body and response_body is not None :
96+ log_response_body (response_body )
97+
7798 except httpx .TimeoutException as ex :
7899 if log :
79100 log .error (f"Timeout error occurred: { ex .__class__ .__name__ } : { ex } " )
0 commit comments