Skip to content

Commit

Permalink
More robust handling of a closing connection (Fixes #164)
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg committed Mar 2, 2020
1 parent 658e811 commit bdd584b
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 6 deletions.
15 changes: 10 additions & 5 deletions engineio/asyncio_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,16 @@ async def poll(self):
raise exceptions.QueueEmpty()
if packets == [None]:
return []
try:
packets.append(self.queue.get_nowait())
self.queue.task_done()
except asyncio.QueueEmpty:
pass
while True:
try:
pkt = self.queue.get_nowait()
self.queue.task_done()
if pkt is None:
self.queue.put_nowait(None)
break
packets.append(pkt)
except asyncio.QueueEmpty:
break
return packets

async def receive(self, pkt):
Expand Down
6 changes: 5 additions & 1 deletion engineio/socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,12 @@ def poll(self):
return []
while True:
try:
packets.append(self.queue.get(block=False))
pkt = self.queue.get(block=False)
self.queue.task_done()
if pkt is None:
self.queue.put(None)
break
packets.append(pkt)
except queue_empty:
break
return packets
Expand Down
9 changes: 9 additions & 0 deletions tests/asyncio/test_asyncio_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,15 @@ def test_poll_none(self):
_run(s.queue.put(None))
self.assertEqual(_run(s.poll()), [])

def test_poll_none_after_packet(self):
mock_server = self._get_mock_server()
s = asyncio_socket.AsyncSocket(mock_server, 'sid')
pkt = packet.Packet(packet.MESSAGE, data='hello')
_run(s.send(pkt))
_run(s.queue.put(None))
self.assertEqual(_run(s.poll()), [pkt])
self.assertEqual(_run(s.poll()), [])

def test_ping_pong(self):
mock_server = self._get_mock_server()
s = asyncio_socket.AsyncSocket(mock_server, 'sid')
Expand Down
15 changes: 15 additions & 0 deletions tests/common/test_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,21 @@ def test_poll(self):
s.send(pkt2)
self.assertEqual(s.poll(), [pkt1, pkt2])

def test_poll_none(self):
mock_server = self._get_mock_server()
s = socket.Socket(mock_server, 'sid')
s.queue.put(None)
self.assertEqual(s.poll(), [])

def test_poll_none_after_packet(self):
mock_server = self._get_mock_server()
s = socket.Socket(mock_server, 'sid')
pkt = packet.Packet(packet.MESSAGE, data='hello')
s.send(pkt)
s.queue.put(None)
self.assertEqual(s.poll(), [pkt])
self.assertEqual(s.poll(), [])

def test_ping_pong(self):
mock_server = self._get_mock_server()
s = socket.Socket(mock_server, 'sid')
Expand Down

0 comments on commit bdd584b

Please sign in to comment.