Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions docs/project/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ notice.

*In development*

Bug fixes
.........

* Handled ``process_request`` or ``process_response`` rejecting the opening
handshake cleanly in the :mod:`threading` implementation, instead of raising
a silenced :exc:`AssertionError`.

.. _16.1:

16.1
Expand Down
8 changes: 7 additions & 1 deletion src/websockets/sync/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,13 @@ def protocol_select_subprotocol(
connection.recv_events_thread.join()
return

assert connection.protocol.state is OPEN
if connection.protocol.state is not OPEN:
# process_request or process_response rejected the handshake.
# The connection is already closing or closed.
connection.close_socket()
connection.recv_events_thread.join()
return

try:
connection.start_keepalive()
handler(connection)
Expand Down
17 changes: 9 additions & 8 deletions tests/sync/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,15 @@ def process_request(ws, request):
def handler(ws):
self.fail("handler must not run")

with run_server(handler, process_request=process_request) as server:
with self.assertRaises(InvalidStatus) as raised:
with connect(get_uri(server)):
self.fail("did not raise")
self.assertEqual(
str(raised.exception),
"server rejected WebSocket connection: HTTP 403",
)
with self.assertNoLogs("websockets", logging.ERROR):
with run_server(handler, process_request=process_request) as server:
with self.assertRaises(InvalidStatus) as raised:
with connect(get_uri(server)):
self.fail("did not raise")
self.assertEqual(
str(raised.exception),
"server rejected WebSocket connection: HTTP 403",
)

def test_process_request_raises_exception(self):
"""Server returns an error if process_request raises an exception."""
Expand Down