Skip to content

Commit 8f619a5

Browse files
authored
Accept non-GET request for starting websocket handshake on server side (#3980)
1 parent ec5aee7 commit 8f619a5

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

@@ -134,8 +134,6 @@ def _handshake(self, request: BaseRequest) -> Tuple['CIMultiDict[str]',
134134
bool,
135135
bool]:
136136
headers = request.headers
137-
if request.method != hdrs.METH_GET:
138-
raise HTTPMethodNotAllowed(request.method, [hdrs.METH_GET])
139137
if 'websocket' != headers.get(hdrs.UPGRADE, '').lower().strip():
140138
raise HTTPBadRequest(
141139
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

@@ -175,12 +175,6 @@ def test_can_prepare_unknown_protocol(make_request) -> None:
175175
assert WebSocketReady(True, None) == ws.can_prepare(req)
176176

177177

178-
def test_can_prepare_invalid_method(make_request) -> None:
179-
req = make_request('POST', '/')
180-
ws = WebSocketResponse()
181-
assert WebSocketReady(False, None) == ws.can_prepare(req)
182-
183-
184178
def test_can_prepare_without_upgrade(make_request) -> None:
185179
req = make_request('GET', '/',
186180
headers=CIMultiDict({}))
@@ -274,11 +268,11 @@ async def test_close_idempotent(make_request) -> None:
274268
assert not (await ws.close(code=2, message='message2'))
275269

276270

277-
async def test_prepare_invalid_method(make_request) -> None:
271+
async def test_prepare_post_method_ok(make_request) -> None:
278272
req = make_request('POST', '/')
279273
ws = WebSocketResponse()
280-
with pytest.raises(HTTPMethodNotAllowed):
281-
await ws.prepare(req)
274+
await ws.prepare(req)
275+
assert ws.prepared
282276

283277

284278
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)