Skip to content

Commit 262fb12

Browse files
[PR #9667/5b654d57 backport][3.11] Simplify close logic in client WebSocketResponse (#9668)
Co-authored-by: J. Nick Koston <[email protected]>
1 parent aa42f60 commit 262fb12

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

aiohttp/client_ws.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,30 @@ async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bo
267267
self._reader.feed_data(WS_CLOSING_MESSAGE, 0)
268268
await self._close_wait
269269

270-
if not self._closed:
271-
self._set_closed()
270+
if self._closed:
271+
return False
272+
273+
self._set_closed()
274+
try:
275+
await self._writer.close(code, message)
276+
except asyncio.CancelledError:
277+
self._close_code = WSCloseCode.ABNORMAL_CLOSURE
278+
self._response.close()
279+
raise
280+
except Exception as exc:
281+
self._close_code = WSCloseCode.ABNORMAL_CLOSURE
282+
self._exception = exc
283+
self._response.close()
284+
return True
285+
286+
if self._close_code:
287+
self._response.close()
288+
return True
289+
290+
while True:
272291
try:
273-
await self._writer.close(code, message)
292+
async with async_timeout.timeout(self._timeout.ws_close):
293+
msg = await self._reader.read()
274294
except asyncio.CancelledError:
275295
self._close_code = WSCloseCode.ABNORMAL_CLOSURE
276296
self._response.close()
@@ -281,31 +301,11 @@ async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bo
281301
self._response.close()
282302
return True
283303

284-
if self._close_code:
304+
if msg.type is WSMsgType.CLOSE:
305+
self._close_code = msg.data
285306
self._response.close()
286307
return True
287308

288-
while True:
289-
try:
290-
async with async_timeout.timeout(self._timeout.ws_close):
291-
msg = await self._reader.read()
292-
except asyncio.CancelledError:
293-
self._close_code = WSCloseCode.ABNORMAL_CLOSURE
294-
self._response.close()
295-
raise
296-
except Exception as exc:
297-
self._close_code = WSCloseCode.ABNORMAL_CLOSURE
298-
self._exception = exc
299-
self._response.close()
300-
return True
301-
302-
if msg.type is WSMsgType.CLOSE:
303-
self._close_code = msg.data
304-
self._response.close()
305-
return True
306-
else:
307-
return False
308-
309309
async def receive(self, timeout: Optional[float] = None) -> WSMessage:
310310
receive_timeout = timeout or self._timeout.ws_receive
311311

0 commit comments

Comments
 (0)