Websockets not working behind Skipper reverse proxy due to Transfer-Encoding: chunked #3798
Description
Long story short
When running the websockets example server behind Skipper the websocket connection is dropped immediately after connect. "One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 1"
Expected behaviour
Websocket connection is established without problems when running behind Skipper.
Actual behaviour
Websocket connection is dropped immediately after connect.
"One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 1"
@szuecs helped to debug this issue and found that Transfer-Encoding: chunked seems to be the issue.
When i commented out the Transfer-Encoding header in:
- https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_ws.py#L182
- https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_response.py#L380
- https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_response.py#L388
The example started to work.
Question: Is Transfer encoding really necessary for websockets or could it be removed / made optional to increase compatibility with http proxy servers like Skipper?
Steps to reproduce
- Run skipper with docker (forwards 8000 to 8080):
docker run --rm -it --network host registry.opensource.zalan.do/pathfinder/skipper:v0.10.216 skipper -experimental-upgrade -experimental-upgrade-audit -application-log-level DEBUG -address :8000 -inline-routes 'r: * -> "http://127.0.0.1:8080/"'
- Run the
web_ws.pyexample - Check the logs in the Browser and Skipper console
Your environment
- Fedora Linux 29 64bit
- python 3.7.3 (also tested with python 3.6.8)
- aiohttp 3.5.4
- skipper v0.10.216
- Chrome 74.0.3729.169
This issue was initially raised @ miguelgrinberg/python-socketio#300
