Skip to content

Commit 30ae919

Browse files
committed
1 parent bd0de65 commit 30ae919

3 files changed

Lines changed: 28 additions & 18 deletions

File tree

ws4py/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
__all__ = ['WS_KEY', 'WS_VERSION']
3333

3434
WS_KEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
35-
WS_VERSION = 13
35+
WS_VERSION = (8, 13)
3636

ws4py/server/cherrypyserver.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def ws(self):
7272
from cherrypy.process import plugins
7373
from cherrypy.wsgiserver import HTTPConnection, HTTPRequest
7474

75-
from ws4py import WS_KEY
75+
from ws4py import WS_KEY, WS_VERSION
7676
from ws4py.exc import HandshakeError
7777
from ws4py.websocket import WebSocket
7878

@@ -95,7 +95,7 @@ def _setup(self):
9595
hooks.attach('on_end_request', self.start_handler,
9696
priority=70)
9797

98-
def upgrade(self, protocols=None, extensions=None, version=13, handler_cls=WebSocket):
98+
def upgrade(self, protocols=None, extensions=None, version=WS_VERSION, handler_cls=WebSocket):
9999
"""
100100
Performs the upgrade of the connection to the WebSocket
101101
protocol.
@@ -131,13 +131,16 @@ def upgrade(self, protocols=None, extensions=None, version=13, handler_cls=WebSo
131131
(key, actual_value))
132132

133133
version = request.headers.get('Sec-WebSocket-Version')
134+
supported_versions = ', '.join([str(v) for v in ws_version])
135+
version_is_valid = False
134136
if version:
135-
if version != str(ws_version):
136-
cherrypy.response.headers['Sec-WebSocket-Version'] = str(ws_version)
137-
raise HandshakeError('Unsupported WebSocket version: %s' % version)
138-
else:
139-
cherrypy.response.headers['Sec-WebSocket-Version'] = str(ws_version)
140-
raise HandshakeError('WebSocket version required')
137+
try: version = int(version)
138+
except: pass
139+
else: version_is_valid = version in ws_version
140+
141+
if not version_is_valid:
142+
cherrypy.response.headers['Sec-WebSocket-Version'] = supported_versions
143+
raise HandshakeError('Unhandled or missing WebSocket version')
141144

142145
key = request.headers.get('Sec-WebSocket-Key')
143146
if key:
@@ -184,7 +187,7 @@ def upgrade(self, protocols=None, extensions=None, version=13, handler_cls=WebSo
184187
response.headers['Content-Type'] = 'text/plain'
185188
response.headers['Upgrade'] = 'websocket'
186189
response.headers['Connection'] = 'Upgrade'
187-
response.headers['Sec-WebSocket-Version'] = str(ws_version)
190+
response.headers['Sec-WebSocket-Version'] = str(version)
188191
response.headers['Sec-WebSocket-Accept'] = base64.b64encode(sha1(key + WS_KEY).digest())
189192
if ws_protocols:
190193
response.headers['Sec-WebSocket-Protocol'] = ', '.join(ws_protocols)

ws4py/server/wsgi/middleware.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class WebSocketUpgradeMiddleware(object):
1414
def __init__(self, app, fallback_app=None, protocols=None, extensions=None,
15-
websocket_class=WebSocket):
15+
websocket_class=WebSocket, versions=WS_VERSION):
1616
"""
1717
WSGI middleware that performs the WebSocket upgrade handshake.
1818
@@ -47,8 +47,10 @@ def ws_handler(websocket):
4747
self.protocols = protocols
4848
self.extensions = extensions
4949
self.websocket_class = websocket_class
50+
self.versions = versions
51+
self.supported_versions = ', '.join([str(v) for v in versions])
5052

51-
def __call__(self, environ, start_response):
53+
def __call__(self, environ, start_response):
5254
# Initial handshake validation
5355
try:
5456
if 'websocket' not in environ.get('upgrade.protocol', environ.get('HTTP_UPGRADE', '')).lower():
@@ -66,17 +68,22 @@ def __call__(self, environ, start_response):
6668
raise HandshakeError("Not a valid HyBi WebSocket request")
6769

6870
version = environ.get('HTTP_SEC_WEBSOCKET_VERSION')
71+
version_is_valid = False
6972
if version:
70-
if version != str(WS_VERSION):
71-
raise HandshakeError('Unsupported WebSocket version')
72-
environ['websocket.version'] = str(WS_VERSION)
73-
else:
74-
raise HandshakeError('WebSocket version required')
73+
try: version = int(version)
74+
except: pass
75+
else: version_is_valid = version in self.versions
76+
77+
if not version_is_valid:
78+
raise HandshakeError('Unsupported WebSocket version: %s' % version)
79+
80+
environ['websocket.version'] = str(version)
7581
except HandshakeError, e:
7682
if self.fallback_app:
7783
return self.fallback_app(environ, start_response)
7884
else:
79-
start_response("400 Bad Handshake", [])
85+
start_response("400 Bad Handshake",
86+
[('Sec-WebSocket-Version', self.supported_versions)])
8087
return [str(e)]
8188

8289
# Collect supported subprotocols

0 commit comments

Comments
 (0)