mirror of
https://github.com/django/daphne.git
synced 2025-07-11 08:22:17 +03:00
Change to accept being part of send/close
This commit is contained in:
parent
5d697c9308
commit
09b2a12be1
|
@ -122,7 +122,7 @@ class Worker(object):
|
||||||
# They want to deny a WebSocket connection.
|
# They want to deny a WebSocket connection.
|
||||||
if message.channel.name != "websocket.connect":
|
if message.channel.name != "websocket.connect":
|
||||||
raise ValueError("You cannot DenyConnection from a non-websocket.connect handler.")
|
raise ValueError("You cannot DenyConnection from a non-websocket.connect handler.")
|
||||||
message.reply_channel.send({"accept": False})
|
message.reply_channel.send({"close": True})
|
||||||
except ConsumeLater:
|
except ConsumeLater:
|
||||||
# They want to not handle it yet. Re-inject it with a number-of-tries marker.
|
# They want to not handle it yet. Re-inject it with a number-of-tries marker.
|
||||||
content['__retries__'] = content.get("__retries__", 0) + 1
|
content['__retries__'] = content.get("__retries__", 0) + 1
|
||||||
|
|
|
@ -735,7 +735,7 @@ server must close the connection with either HTTP status code ``503`` or
|
||||||
WebSocket close code ``1013``.
|
WebSocket close code ``1013``.
|
||||||
|
|
||||||
This message must be responded to on the ``reply_channel`` with a
|
This message must be responded to on the ``reply_channel`` with a
|
||||||
*Connection Reply* message before the socket will pass messages on the
|
*Send/Close/Accept* message before the socket will pass messages on the
|
||||||
``receive`` channel. The protocol server should ideally send this message
|
``receive`` channel. The protocol server should ideally send this message
|
||||||
during the handshake phase of the WebSocket and not complete the handshake
|
during the handshake phase of the WebSocket and not complete the handshake
|
||||||
until it gets a reply, returning HTTP status code ``403`` if the connection is
|
until it gets a reply, returning HTTP status code ``403`` if the connection is
|
||||||
|
@ -743,10 +743,6 @@ denied. If this is not possible, it must buffer WebSocket frames and not
|
||||||
send them onto ``websocket.receive`` until a reply is received, and if the
|
send them onto ``websocket.receive`` until a reply is received, and if the
|
||||||
connection is rejected, return WebSocket close code ``4403``.
|
connection is rejected, return WebSocket close code ``4403``.
|
||||||
|
|
||||||
Receiving a WebSocket *Send/Close* message while waiting for a
|
|
||||||
*Connection Reply* must make the server accept the connection and then send
|
|
||||||
the message immediately.
|
|
||||||
|
|
||||||
Channel: ``websocket.connect``
|
Channel: ``websocket.connect``
|
||||||
|
|
||||||
Keys:
|
Keys:
|
||||||
|
@ -782,25 +778,6 @@ Keys:
|
||||||
* ``order``: The integer value ``0``.
|
* ``order``: The integer value ``0``.
|
||||||
|
|
||||||
|
|
||||||
Connection Reply
|
|
||||||
''''''''''''''''
|
|
||||||
|
|
||||||
Sent back on the reply channel from an application when a ``connect`` message
|
|
||||||
is received to say if the connection should be accepted or dropped.
|
|
||||||
|
|
||||||
Behaviour on WebSocket rejection is defined in the Connection section above.
|
|
||||||
|
|
||||||
If received while the socket is already accepted, the protocol server should
|
|
||||||
log an error, but not do anything.
|
|
||||||
|
|
||||||
Channel: ``websocket.send!``
|
|
||||||
|
|
||||||
Keys:
|
|
||||||
|
|
||||||
* ``accept``: If the connection should be accepted (``True``) or rejected and
|
|
||||||
dropped (``False``).
|
|
||||||
|
|
||||||
|
|
||||||
Receive
|
Receive
|
||||||
'''''''
|
'''''''
|
||||||
|
|
||||||
|
@ -852,14 +829,27 @@ Keys:
|
||||||
``order`` values in ``websocket.receive``.
|
``order`` values in ``websocket.receive``.
|
||||||
|
|
||||||
|
|
||||||
Send/Close
|
Send/Close/Accept
|
||||||
''''''''''
|
'''''''''''''''''
|
||||||
|
|
||||||
Sends a data frame to the client and/or closes the connection from the
|
Sends a data frame to the client and/or closes the connection from the
|
||||||
server end. If ``ChannelFull`` is raised, wait and try again.
|
server end and/or accepts a connection. If ``ChannelFull`` is raised, wait
|
||||||
|
and try again.
|
||||||
|
|
||||||
If sent while the connection is waiting for acceptance or rejection,
|
If received while the connection is waiting for acceptance after a ``connect``
|
||||||
will accept the connection before the frame is sent.
|
message:
|
||||||
|
|
||||||
|
* If ``bytes`` or ``text`` is present, accept the connection and send the data.
|
||||||
|
* If ``accept`` is ``True``, accept the connection and do nothing else.
|
||||||
|
* If ``close`` is ``True``, reject the connection. If ``bytes`` or ``text`` is
|
||||||
|
also set, it should accept the connection, send the frame, then immediately
|
||||||
|
close the connection.
|
||||||
|
|
||||||
|
If received while the connection is established:
|
||||||
|
|
||||||
|
* If ``bytes`` or ``text`` is present, send the data.
|
||||||
|
* If ``close`` is ``True``, close the connection after any send.
|
||||||
|
* ``accept`` is ignored.
|
||||||
|
|
||||||
Channel: ``websocket.send!``
|
Channel: ``websocket.send!``
|
||||||
|
|
||||||
|
@ -872,6 +862,9 @@ Keys:
|
||||||
* ``close``: Boolean saying if the connection should be closed after data
|
* ``close``: Boolean saying if the connection should be closed after data
|
||||||
is sent, if any. Optional, default ``False``.
|
is sent, if any. Optional, default ``False``.
|
||||||
|
|
||||||
|
* ``accept``: Boolean saying if the connection should be accepted without
|
||||||
|
sending a frame if it is in the handshake phase.
|
||||||
|
|
||||||
A maximum of one of ``bytes`` or ``text`` may be provided. If both are
|
A maximum of one of ``bytes`` or ``text`` may be provided. If both are
|
||||||
provided, the protocol server should ignore the message entirely.
|
provided, the protocol server should ignore the message entirely.
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ you can still do that by passing the ``immediately`` argument::
|
||||||
|
|
||||||
Channel("thumbnailing-tasks").send({"id": 34245}, immediately=True)
|
Channel("thumbnailing-tasks").send({"id": 34245}, immediately=True)
|
||||||
|
|
||||||
This should be entirely backwards compatible, and may actually fix race
|
This should be mostly backwards compatible, and may actually fix race
|
||||||
conditions in some apps that were pre-existing.
|
conditions in some apps that were pre-existing.
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,3 +60,28 @@ Demultiplexer Overhaul
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
TBD
|
TBD
|
||||||
|
|
||||||
|
|
||||||
|
Backwards Incompatible Changes
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Connect Consumers
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If you have a custom consumer for ``websocket.connect``, you must ensure that
|
||||||
|
it either:
|
||||||
|
|
||||||
|
* Sends at least one message onto the ``reply_channel`` that generates a
|
||||||
|
WebSocket frame (either ``bytes`` or ``text`` is set), either directly
|
||||||
|
or via a group.
|
||||||
|
* Sends a message onto the ``reply_channel`` that is ``{"accept": True}``,
|
||||||
|
to accept a connection without sending data.
|
||||||
|
* Sends a message onto the ``reply_channel`` that is ``{"close": True}``,
|
||||||
|
to reject a connection mid-handshake.
|
||||||
|
|
||||||
|
Many consumers already do the former, but if your connect consumer does not
|
||||||
|
send anything you MUST now send an accept message or the socket will remain
|
||||||
|
in the handshaking phase forever and you'll never get any messages.
|
||||||
|
|
||||||
|
All built-in Channels consumers (e.g. in the generic consumers) have been
|
||||||
|
upgraded to do this.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user