@@ -163,6 +163,7 @@ class RequestHandler(BaseProtocol):
163163 "_lingering_time" ,
164164 "_messages" ,
165165 "_message_tail" ,
166+ "_handler_waiter" ,
166167 "_waiter" ,
167168 "_task_handler" ,
168169 "_upgrade" ,
@@ -215,6 +216,7 @@ def __init__(
215216 self ._message_tail = b""
216217
217218 self ._waiter : Optional [asyncio .Future [None ]] = None
219+ self ._handler_waiter : Optional [asyncio .Future [None ]] = None
218220 self ._task_handler : Optional [asyncio .Task [None ]] = None
219221
220222 self ._upgrade = False
@@ -278,11 +280,11 @@ async def shutdown(self, timeout: Optional[float] = 15.0) -> None:
278280 if self ._waiter :
279281 self ._waiter .cancel ()
280282
281- # Wait for graceful disconnection
282- if self ._current_request is not None :
283+ # Wait for graceful handler completion
284+ if self ._handler_waiter is not None :
283285 with suppress (asyncio .CancelledError , asyncio .TimeoutError ):
284286 async with ceil_timeout (timeout ):
285- await self ._current_request . wait_for_disconnection ()
287+ await self ._handler_waiter
286288 # Then cancel handler and wait
287289 with suppress (asyncio .CancelledError , asyncio .TimeoutError ):
288290 async with ceil_timeout (timeout ):
@@ -466,6 +468,7 @@ async def _handle_request(
466468 start_time : float ,
467469 request_handler : Callable [[BaseRequest ], Awaitable [StreamResponse ]],
468470 ) -> Tuple [StreamResponse , bool ]:
471+ self ._handler_waiter = self ._loop .create_future ()
469472 try :
470473 try :
471474 self ._current_request = request
@@ -489,6 +492,8 @@ async def _handle_request(
489492 reset = await self .finish_response (request , resp , start_time )
490493 else :
491494 reset = await self .finish_response (request , resp , start_time )
495+ finally :
496+ self ._handler_waiter .set_result (None )
492497
493498 return resp , reset
494499
0 commit comments