Skip to content

Commit 612cdb4

Browse files
authored
Handle exception in connection accept handler (#450)
* Handle exception in connection accept handler * Add test * shorter sleep
1 parent 9032fa3 commit 612cdb4

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

snitun/server/run.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,11 @@ def run(self) -> None:
284284
for fileno, event in events:
285285
# New Connection
286286
if fileno == fd_server:
287-
con, _ = self._server.accept()
287+
try:
288+
con, _ = self._server.accept()
289+
except OSError as err:
290+
_LOGGER.warning("Accept failed: %s", err)
291+
continue
288292
con.setblocking(False)
289293

290294
self._poller.register(

tests/server/test_run.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,30 @@ async def test_snitun_single_runner_updown() -> None:
5252
await server.stop()
5353

5454

55+
def test_snitun_worker_runner_accept_exception(
56+
caplog: pytest.LogCaptureFixture,
57+
event_loop: asyncio.AbstractEventLoop,
58+
) -> None:
59+
"""Test SniTunWorker Server handles accept() exception."""
60+
server = SniTunServerWorker(
61+
FERNET_TOKENS,
62+
host="127.0.0.1",
63+
port=32003,
64+
worker_size=2,
65+
)
66+
67+
server.start()
68+
with patch("socket.socket.accept", side_effect=OSError("BOOM!")):
69+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
70+
sock.connect(("127.0.0.1", 32003))
71+
sock.close()
72+
73+
time.sleep(0.1)
74+
75+
assert "Accept failed: BOOM!" in caplog.text
76+
server.stop()
77+
78+
5579
def test_snitun_worker_runner_updown(event_loop: asyncio.AbstractEventLoop) -> None:
5680
"""Test SniTun Worker Server runner object."""
5781
server = SniTunServerWorker(

0 commit comments

Comments
 (0)