Skip to content

Commit

Permalink
added async_handlers option to server
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg committed Aug 21, 2016
1 parent 3f0b4e3 commit c9133c2
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 9 deletions.
7 changes: 6 additions & 1 deletion engineio/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ class Server(object):
packets. Custom json modules must have ``dumps`` and ``loads``
functions that are compatible with the standard library
versions.
:param async_handlers: If set to ``True``, run message event handlers in
non-blocking threads. To run handlers synchronously,
set to ``False``. The default is ``True``.
:param kwargs: Reserved for future extensions, any additional parameters
given as keyword arguments will be silently ignored.
"""
Expand All @@ -57,7 +60,8 @@ def __init__(self, async_mode=None, ping_timeout=60, ping_interval=25,
max_http_buffer_size=100000000, allow_upgrades=True,
http_compression=True, compression_threshold=1024,
cookie='io', cors_allowed_origins=None,
cors_credentials=True, logger=False, json=None, **kwargs):
cors_credentials=True, logger=False, json=None,
async_handlers=True, **kwargs):
self.ping_timeout = ping_timeout
self.ping_interval = ping_interval
self.max_http_buffer_size = max_http_buffer_size
Expand All @@ -67,6 +71,7 @@ def __init__(self, async_mode=None, ping_timeout=60, ping_interval=25,
self.cookie = cookie
self.cors_allowed_origins = cors_allowed_origins
self.cors_credentials = cors_credentials
self.async_handlers = async_handlers
self.sockets = {}
self.handlers = {}
if json is not None:
Expand Down
2 changes: 1 addition & 1 deletion engineio/socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def receive(self, pkt):
self.send(packet.Packet(packet.PONG, pkt.data))
elif pkt.packet_type == packet.MESSAGE:
self.server._trigger_event('message', self.sid, pkt.data,
async=True)
async=self.server.async_handlers)
elif pkt.packet_type == packet.UPGRADE:
self.send(packet.Packet(packet.NOOP))
else:
Expand Down
3 changes: 2 additions & 1 deletion tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ def test_create(self):
'compression_threshold': 4,
'cookie': 'foo',
'cors_allowed_origins': ['foo', 'bar', 'baz'],
'cors_credentials': False}
'cors_credentials': False,
'async_handlers': False}
s = server.Server(**kwargs)
for arg in six.iterkeys(kwargs):
self.assertEqual(getattr(s, arg), kwargs[arg])
Expand Down
22 changes: 16 additions & 6 deletions tests/test_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def _get_mock_server(self):
mock_server = mock.Mock()
mock_server.ping_timeout = 0.2
mock_server.ping_interval = 0.2
mock_server.async_handlers = True

try:
import queue
Expand Down Expand Up @@ -79,6 +80,21 @@ def test_ping_pong(self):
self.assertEqual(len(r), 1)
self.assertTrue(r[0].encode(), b'3abc')

def test_message_async_handler(self):
mock_server = self._get_mock_server()
s = socket.Socket(mock_server, 'sid')
s.receive(packet.Packet(packet.MESSAGE, data='foo'))
mock_server._trigger_event.assert_called_once_with('message', 'sid',
'foo', async=True)

def test_message_sync_handler(self):
mock_server = self._get_mock_server()
mock_server.async_handlers = False
s = socket.Socket(mock_server, 'sid')
s.receive(packet.Packet(packet.MESSAGE, data='foo'))
mock_server._trigger_event.assert_called_once_with('message', 'sid',
'foo', async=False)

def test_invalid_packet(self):
mock_server = self._get_mock_server()
s = socket.Socket(mock_server, 'sid')
Expand Down Expand Up @@ -241,8 +257,6 @@ def test_websocket_read_write(self):
self._join_bg_tasks()
self.assertTrue(s.connected)
self.assertTrue(s.upgraded)
print(mock_server._trigger_event.call_args_list)
print(ws.send.call_args_list)
self.assertEqual(mock_server._trigger_event.call_count, 2)
mock_server._trigger_event.assert_has_calls([
mock.call('message', 'sid', 'foo', async=True),
Expand Down Expand Up @@ -270,8 +284,6 @@ def test_websocket_upgrade_read_write(self):
s._websocket_handler(ws)
self._join_bg_tasks()
self.assertTrue(s.upgraded)
print(mock_server._trigger_event.call_args_list)
print(ws.send.call_args_list)
self.assertEqual(mock_server._trigger_event.call_count, 2)
mock_server._trigger_event.assert_has_calls([
mock.call('message', 'sid', 'foo', async=True),
Expand Down Expand Up @@ -332,8 +344,6 @@ def test_websocket_ignore_invalid_packet(self):
s._websocket_handler(ws)
self._join_bg_tasks()
self.assertTrue(s.connected)
print(mock_server._trigger_event.call_args_list)
print(ws.send.call_args_list)
self.assertEqual(mock_server._trigger_event.call_count, 2)
mock_server._trigger_event.assert_has_calls([
mock.call('message', 'sid', foo, async=True),
Expand Down

0 comments on commit c9133c2

Please sign in to comment.