diff --git a/src/engineio/async_client.py b/src/engineio/async_client.py index 238ba52..2820265 100644 --- a/src/engineio/async_client.py +++ b/src/engineio/async_client.py @@ -571,7 +571,7 @@ async def _read_loop_polling(self): async def _read_loop_websocket(self): """Read packets from the Engine.IO WebSocket connection.""" - while self.state == 'connected': + while self.state == 'connected' and self.write_loop_task: p = None try: p = await asyncio.wait_for( @@ -672,7 +672,6 @@ async def _write_loop(self): if r.status < 200 or r.status >= 300: self.logger.warning('Unexpected status code %s in server ' 'response, aborting', r.status) - self.write_loop_task = None break else: # websocket @@ -690,3 +689,4 @@ async def _write_loop(self): 'aborting') break self.logger.info('Exiting write loop task') + self.write_loop_task = None diff --git a/src/engineio/client.py b/src/engineio/client.py index e8865df..6fe4f4a 100644 --- a/src/engineio/client.py +++ b/src/engineio/client.py @@ -521,7 +521,7 @@ def _read_loop_polling(self): def _read_loop_websocket(self): """Read packets from the Engine.IO WebSocket connection.""" - while self.state == 'connected': + while self.state == 'connected' and self.write_loop_task: p = None try: p = self.ws.recv() @@ -616,7 +616,6 @@ def _write_loop(self): if r.status_code < 200 or r.status_code >= 300: self.logger.warning('Unexpected status code %s in server ' 'response, aborting', r.status_code) - self.write_loop_task = None break else: # websocket @@ -634,3 +633,4 @@ def _write_loop(self): 'WebSocket connection was closed, aborting') break self.logger.info('Exiting write loop task') + self.write_loop_task = None diff --git a/tests/common/test_socket.py b/tests/common/test_socket.py index f9b6176..20d13b2 100644 --- a/tests/common/test_socket.py +++ b/tests/common/test_socket.py @@ -101,7 +101,10 @@ def test_schedule_ping(self): s = socket.Socket(mock_server, 'sid') s.send = mock.MagicMock() s.schedule_ping() - time.sleep(0.05) + for _ in range(10): + time.sleep(0.05) + if s.last_ping is not None: + break assert s.last_ping is not None assert s.send.call_args_list[0][0][0].encode() == '2'