@@ -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 )
0 commit comments