Browse Source

Support Python's ConnectionRefusedError to reject a connection (#1515)

* Support Python's ConnectionRefusedError to reject a connection

* unit tests
pull/1516/head
Miguel Grinberg 7 months ago
committed by GitHub
parent
commit
f3b18bde3f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      docs/server.rst
  2. 3
      src/socketio/async_server.py
  3. 3
      src/socketio/server.py
  4. 15
      tests/async/test_server.py
  5. 14
      tests/common/test_server.py

2
docs/server.rst

@ -246,6 +246,8 @@ a :class:`socketio.exceptions.ConnectionRefusedError` exception can be raised,
and all of its arguments will be sent to the client with the rejection and all of its arguments will be sent to the client with the rejection
message:: message::
from socketio.exceptions import ConnectionRefusedError
@sio.event @sio.event
def connect(sid, environ, auth): def connect(sid, environ, auth):
raise ConnectionRefusedError('authentication failed') raise ConnectionRefusedError('authentication failed')

3
src/socketio/async_server.py

@ -561,6 +561,9 @@ class AsyncServer(base_server.BaseServer):
except exceptions.ConnectionRefusedError as exc: except exceptions.ConnectionRefusedError as exc:
fail_reason = exc.error_args fail_reason = exc.error_args
success = False success = False
except ConnectionRefusedError:
fail_reason = {"message": "Connection refused by server"}
success = False
if success is False: if success is False:
if self.always_connect: if self.always_connect:

3
src/socketio/server.py

@ -543,6 +543,9 @@ class Server(base_server.BaseServer):
except exceptions.ConnectionRefusedError as exc: except exceptions.ConnectionRefusedError as exc:
fail_reason = exc.error_args fail_reason = exc.error_args
success = False success = False
except ConnectionRefusedError:
fail_reason = {"message": "Connection refused by server"}
success = False
if success is False: if success is False:
if self.always_connect: if self.always_connect:

15
tests/async/test_server.py

@ -482,6 +482,21 @@ class TestAsyncServer:
'123', '4{"message":"fail_reason"}') '123', '4{"message":"fail_reason"}')
assert s.environ == {'123': 'environ'} assert s.environ == {'123': 'environ'}
async def test_handle_connect_rejected_with_python_exception(self, eio):
eio.return_value.send = mock.AsyncMock()
s = async_server.AsyncServer()
handler = mock.MagicMock(
side_effect=ConnectionRefusedError()
)
s.on('connect', handler)
await s._handle_eio_connect('123', 'environ')
await s._handle_eio_message('123', '0')
assert not s.manager.is_connected('1', '/')
handler.assert_called_once_with('1', 'environ')
s.eio.send.assert_awaited_once_with(
'123', '4{"message":"Connection refused by server"}')
assert s.environ == {'123': 'environ'}
async def test_handle_connect_rejected_with_empty_exception(self, eio): async def test_handle_connect_rejected_with_empty_exception(self, eio):
eio.return_value.send = mock.AsyncMock() eio.return_value.send = mock.AsyncMock()
s = async_server.AsyncServer() s = async_server.AsyncServer()

14
tests/common/test_server.py

@ -462,6 +462,20 @@ class TestServer:
s.eio.send.assert_called_once_with('123', '4{"message":"fail_reason"}') s.eio.send.assert_called_once_with('123', '4{"message":"fail_reason"}')
assert s.environ == {'123': 'environ'} assert s.environ == {'123': 'environ'}
def test_handle_connect_rejected_with_python_exception(self, eio):
s = server.Server()
handler = mock.MagicMock(
side_effect=ConnectionRefusedError()
)
s.on('connect', handler)
s._handle_eio_connect('123', 'environ')
s._handle_eio_message('123', '0')
assert not s.manager.is_connected('1', '/')
handler.assert_called_once_with('1', 'environ')
s.eio.send.assert_called_once_with(
'123', '4{"message":"Connection refused by server"}')
assert s.environ == {'123': 'environ'}
def test_handle_connect_rejected_with_empty_exception(self, eio): def test_handle_connect_rejected_with_empty_exception(self, eio):
s = server.Server() s = server.Server()
handler = mock.MagicMock( handler = mock.MagicMock(

Loading…
Cancel
Save