diff --git a/daphne/ws_protocol.py b/daphne/ws_protocol.py index b1e29c3..b27cde8 100755 --- a/daphne/ws_protocol.py +++ b/daphne/ws_protocol.py @@ -71,6 +71,8 @@ class WebSocketProtocol(WebSocketServerProtocol): subprotocols = [ x.strip() for x in unquote(value.decode("ascii")).split(",") ] + if not all(isinstance(x, str) for x in subprotocols): + raise ValueError("Invalid subprotocol value") # Make new application instance with scope self.path = request.path.encode("ascii") self.application_deferred = defer.maybeDeferred( diff --git a/tests/test_websocket.py b/tests/test_websocket.py index 851143c..26b788f 100644 --- a/tests/test_websocket.py +++ b/tests/test_websocket.py @@ -138,7 +138,15 @@ class TestWebsocket(DaphneTestCase): scope, messages = test_app.get_received() self.assert_valid_websocket_scope(scope, subprotocols=subprotocols) self.assert_valid_websocket_connect_message(messages[0]) - + def test_invalid_subprotocols(self): + """ + Tests that the server rejects connections with invalid subprotocols. + """ + with DaphneTestingInstance() as test_app: + test_app.add_send_messages([{"type": "websocket.accept"}]) + with self.assertRaises(TypeError): + self.websocket_handshake(test_app, subprotocols=[1, 2]) + def test_xff(self): """ Tests that X-Forwarded-For headers get parsed right