Skip to content

Commit b8548c7

Browse files
committed
Merge pull request #181 from flying-sheep/websocket-error-response
Made websocket subprotocols conform to spec
2 parents ec67f8d + 8f881a7 commit b8548c7

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

aiohttp/log.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
client_log = logging.getLogger('aiohttp.client')
66
internal_log = logging.getLogger('aiohttp.internal')
77
server_log = logging.getLogger('aiohttp.server')
8+
websocket_log = logging.getLogger('aiohttp.websocket')

aiohttp/websocket.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import hashlib
1111
import struct
1212
from aiohttp import errors
13+
from aiohttp.log import websocket_log
1314

1415
# Frame opcodes defined in the spec.
1516
OPCODE_CONTINUATION = 0x0
@@ -220,9 +221,9 @@ def do_handshake(method, headers, transport, protocols=()):
220221
protocol = proto
221222
break
222223
else:
223-
raise errors.HttpBadRequest(
224-
'Client protocols {!r} don’t overlap server-known ones {!r}'
225-
.format(protocols, req_protocols))
224+
websocket_log.warning( # No overlap found: Return no protocol as per spec
225+
'Client protocols %r don’t overlap server-known ones %r',
226+
protocols, req_protocols)
226227

227228
# check supported version
228229
version = headers.get('SEC-WEBSOCKET-VERSION')

tests/test_websocket.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -471,12 +471,21 @@ def test_handshake_protocol_agreement(self):
471471

472472
self.assertEqual(protocol, best_proto)
473473

474-
def test_handshake_protocol_unsupported(self):
474+
@unittest.mock.patch('aiohttp.websocket.websocket_log.warning')
475+
def test_handshake_protocol_unsupported(self, m_websocket_warn):
476+
'''Tests if a protocol mismatch handshake warns and returns None'''
477+
warn_called = False
478+
def websocket_warn(msg, *fmts):
479+
nonlocal warn_called
480+
warn_called = True
481+
m_websocket_warn.side_effect = websocket_warn
482+
475483
proto = 'chat'
476484
self.headers.extend(self.gen_ws_headers('test')[0])
477485

478-
self.assertRaises(
479-
errors.HttpBadRequest,
480-
websocket.do_handshake,
486+
_, _, _, _, protocol = websocket.do_handshake(
481487
self.message.method, self.message.headers, self.transport,
482488
protocols=[proto])
489+
490+
self.assertTrue(warn_called, 'protocol mismatch didn’t warn')
491+
self.assertIsNone(protocol)

0 commit comments

Comments
 (0)