Skip to content

Commit 58c72e1

Browse files
committed
[3.6] Accept non-GET request for starting websocket handshake on server side (#3980)
(cherry picked from commit 8f619a5) Co-authored-by: Andrew Svetlov <andrew.svetlov@gmail.com>
1 parent d4f05dd commit 58c72e1

File tree

4 files changed

+6
-20
lines changed

4 files changed

+6
-20
lines changed

CHANGES/3980.feature

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Accept non-GET request for starting websocket handshake on server side.

aiohttp/web_ws.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from .log import ws_logger
2727
from .streams import EofStream, FlowControlDataQueue
2828
from .typedefs import JSONDecoder, JSONEncoder
29-
from .web_exceptions import HTTPBadRequest, HTTPException, HTTPMethodNotAllowed
29+
from .web_exceptions import HTTPBadRequest, HTTPException
3030
from .web_request import BaseRequest
3131
from .web_response import StreamResponse
3232

@@ -130,8 +130,6 @@ def _handshake(self, request: BaseRequest) -> Tuple['CIMultiDict[str]',
130130
bool,
131131
bool]:
132132
headers = request.headers
133-
if request.method != hdrs.METH_GET:
134-
raise HTTPMethodNotAllowed(request.method, [hdrs.METH_GET])
135133
if 'websocket' != headers.get(hdrs.UPGRADE, '').lower().strip():
136134
raise HTTPBadRequest(
137135
text=('No WebSocket UPGRADE hdr: {}\n Can '

tests/test_web_websocket.py

+4-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from aiohttp.log import ws_logger
99
from aiohttp.streams import EofStream
1010
from aiohttp.test_utils import make_mocked_coro, make_mocked_request
11-
from aiohttp.web import HTTPBadRequest, HTTPMethodNotAllowed, WebSocketResponse
11+
from aiohttp.web import HTTPBadRequest, WebSocketResponse
1212
from aiohttp.web_ws import WS_CLOSED_MESSAGE, WebSocketReady
1313

1414

@@ -203,12 +203,6 @@ def test_can_prepare_unknown_protocol(make_request) -> None:
203203
assert WebSocketReady(True, None) == ws.can_prepare(req)
204204

205205

206-
def test_can_prepare_invalid_method(make_request) -> None:
207-
req = make_request('POST', '/')
208-
ws = WebSocketResponse()
209-
assert WebSocketReady(False, None) == ws.can_prepare(req)
210-
211-
212206
def test_can_prepare_without_upgrade(make_request) -> None:
213207
req = make_request('GET', '/',
214208
headers=CIMultiDict({}))
@@ -302,11 +296,11 @@ async def test_close_idempotent(make_request) -> None:
302296
assert not (await ws.close(code=2, message='message2'))
303297

304298

305-
async def test_prepare_invalid_method(make_request) -> None:
299+
async def test_prepare_post_method_ok(make_request) -> None:
306300
req = make_request('POST', '/')
307301
ws = WebSocketResponse()
308-
with pytest.raises(HTTPMethodNotAllowed):
309-
await ws.prepare(req)
302+
await ws.prepare(req)
303+
assert ws.prepared
310304

311305

312306
async def test_prepare_without_upgrade(make_request) -> None:

tests/test_websocket_handshake.py

-7
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,6 @@ def gen_ws_headers(protocols='', compress=0, extension_text='',
3232
return hdrs, key
3333

3434

35-
async def test_not_get() -> None:
36-
ws = web.WebSocketResponse()
37-
req = make_mocked_request('POST', '/')
38-
with pytest.raises(web.HTTPMethodNotAllowed):
39-
await ws.prepare(req)
40-
41-
4235
async def test_no_upgrade() -> None:
4336
ws = web.WebSocketResponse()
4437
req = make_mocked_request('GET', '/')

0 commit comments

Comments
 (0)