Skip to content

Commit bdd584b

Browse files
More robust handling of a closing connection (Fixes miguelgrinberg#164)
1 parent 658e811 commit bdd584b

4 files changed

Lines changed: 39 additions & 6 deletions

File tree

engineio/asyncio_socket.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@ async def poll(self):
2020
raise exceptions.QueueEmpty()
2121
if packets == [None]:
2222
return []
23-
try:
24-
packets.append(self.queue.get_nowait())
25-
self.queue.task_done()
26-
except asyncio.QueueEmpty:
27-
pass
23+
while True:
24+
try:
25+
pkt = self.queue.get_nowait()
26+
self.queue.task_done()
27+
if pkt is None:
28+
self.queue.put_nowait(None)
29+
break
30+
packets.append(pkt)
31+
except asyncio.QueueEmpty:
32+
break
2833
return packets
2934

3035
async def receive(self, pkt):

engineio/socket.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@ def poll(self):
3636
return []
3737
while True:
3838
try:
39-
packets.append(self.queue.get(block=False))
39+
pkt = self.queue.get(block=False)
4040
self.queue.task_done()
41+
if pkt is None:
42+
self.queue.put(None)
43+
break
44+
packets.append(pkt)
4145
except queue_empty:
4246
break
4347
return packets

tests/asyncio/test_asyncio_socket.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@ def test_poll_none(self):
9494
_run(s.queue.put(None))
9595
self.assertEqual(_run(s.poll()), [])
9696

97+
def test_poll_none_after_packet(self):
98+
mock_server = self._get_mock_server()
99+
s = asyncio_socket.AsyncSocket(mock_server, 'sid')
100+
pkt = packet.Packet(packet.MESSAGE, data='hello')
101+
_run(s.send(pkt))
102+
_run(s.queue.put(None))
103+
self.assertEqual(_run(s.poll()), [pkt])
104+
self.assertEqual(_run(s.poll()), [])
105+
97106
def test_ping_pong(self):
98107
mock_server = self._get_mock_server()
99108
s = asyncio_socket.AsyncSocket(mock_server, 'sid')

tests/common/test_socket.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,21 @@ def test_poll(self):
7777
s.send(pkt2)
7878
self.assertEqual(s.poll(), [pkt1, pkt2])
7979

80+
def test_poll_none(self):
81+
mock_server = self._get_mock_server()
82+
s = socket.Socket(mock_server, 'sid')
83+
s.queue.put(None)
84+
self.assertEqual(s.poll(), [])
85+
86+
def test_poll_none_after_packet(self):
87+
mock_server = self._get_mock_server()
88+
s = socket.Socket(mock_server, 'sid')
89+
pkt = packet.Packet(packet.MESSAGE, data='hello')
90+
s.send(pkt)
91+
s.queue.put(None)
92+
self.assertEqual(s.poll(), [pkt])
93+
self.assertEqual(s.poll(), [])
94+
8095
def test_ping_pong(self):
8196
mock_server = self._get_mock_server()
8297
s = socket.Socket(mock_server, 'sid')

0 commit comments

Comments
 (0)