Django channels handshake headers are ignored

82 views
Skip to first unread message

Albertas Gimbutas

unread,
Jun 17, 2020, 5:55:51 AM6/17/20
to Django users
Hi,

  I want to add WebSocket extension support to my Django channels consumer class. As I know a list of accepted extensions should be included in the headers of the handshake response of the consumer. I tried adding the response headers, however browser does not get them. I am not sure whether its a bug, or I have done something wrong.

  As specified in the asgiref documentation: "websocket.accept" message can have "headers" section https://asgi.readthedocs.io/en/latest/specs/www.html#accept-send-event
  In my AsyncJsonWebsocketConsumer class I am accepting the connection with this code:

    await self.base_send({
      "type": "websocket.accept",
      "subprotocol": None,
      "headers": [(b'sec-websocket-extensions', b'permessage-deflate')]
    })

  since the original accept() method implementation does not have headers parameter https://github.com/django/channels/blob/507cb54fcb36df63282dd19653ea743036e7d63c/channels/generic/websocket.py#L184

  With this implementation latest Chrome/Firefox does not receive "Sec-WebSocket-Extensions: permessage-deflate" headeres in the handshake response. For example, I provide request and response headers:

  The request headers are:
GET ws://localhost:8080/ws/my_route/ HTTP/1.1
Host: localhost:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
Upgrade: websocket
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Sec-WebSocket-Key: XXXXXXXXXXXXXXXXXXXXXX==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

  The response headers are:
HTTP/1.1 101 Switching Protocols
Server: Daphne
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: XXXXXXXXXXXXXXXXXXXXXXXXXXX=


  I am using manage.py runserver command. Major packages of my pip freeze are:
aiohttp==3.6.2
aioredis==1.2.0
asgiref==3.2.9
async-timeout==3.0.1
asyncio==3.4.3
billiard==3.6.0.0
channels==2.4.0
channels-redis==2.4.0
daphne==2.3.0
Django==2.2
django-cors-headers==2.3.0
django-crequest==2018.5.11
gunicorn==19.9.0
pika==0.12.0
redis==3.2.1
tornado==5.1
Twisted==18.9.0
txaio==18.8.1
urllib3==1.24.1

    Maybe you could advice me how to find the reason why the response headers are ignored? Should I report this as a bug to channels/asgiref?

Best regards,
Albertas

Reply all
Reply to author
Forward
0 new messages