mirror of
https://github.com/django/daphne.git
synced 2025-10-18 09:34:15 +03:00
* User friendly way to close websocket with status * More generic way to close(whatever) connection by exception * Fix import ordering for exceptions (isort)
78 lines
2.0 KiB
Python
78 lines
2.0 KiB
Python
from __future__ import unicode_literals
|
|
import six
|
|
|
|
|
|
class ConsumeLater(Exception):
|
|
"""
|
|
Exception that says that the current message should be re-queued back
|
|
onto its channel as it's not ready to be consumd yet (e.g. global order
|
|
is being enforced)
|
|
"""
|
|
pass
|
|
|
|
|
|
class ResponseLater(Exception):
|
|
"""
|
|
Exception raised inside a Django view when the view has passed
|
|
responsibility for the response to another consumer, and so is not
|
|
returning a response.
|
|
"""
|
|
pass
|
|
|
|
|
|
class RequestTimeout(Exception):
|
|
"""
|
|
Raised when it takes too long to read a request body.
|
|
"""
|
|
pass
|
|
|
|
|
|
class RequestAborted(Exception):
|
|
"""
|
|
Raised when the incoming request tells us it's aborted partway through
|
|
reading the body.
|
|
"""
|
|
pass
|
|
|
|
|
|
class DenyConnection(Exception):
|
|
"""
|
|
Raised during a websocket.connect (or other supported connection) handler
|
|
to deny the connection.
|
|
"""
|
|
pass
|
|
|
|
|
|
class ChannelSocketException(Exception):
|
|
"""
|
|
Base Exception is intended to run some action ('run' method)
|
|
when it is raised at a consumer body
|
|
"""
|
|
|
|
def run(self, message):
|
|
raise NotImplementedError
|
|
|
|
|
|
class WebsocketCloseException(ChannelSocketException):
|
|
"""
|
|
ChannelSocketException based exceptions for close websocket connection with code
|
|
"""
|
|
|
|
def __init__(self, code=None):
|
|
if code is not None and not isinstance(code, six.integer_types) \
|
|
and code != 1000 and not (3000 <= code <= 4999):
|
|
raise ValueError("invalid close code {} (must be 1000 or from [3000, 4999])".format(code))
|
|
self._code = code
|
|
|
|
def run(self, message):
|
|
if message.reply_channel.name.split('.')[0] != "websocket":
|
|
raise ValueError("You cannot raise CloseWebsocketError from a non-websocket handler.")
|
|
message.reply_channel.send({"close": self._code or True})
|
|
|
|
|
|
class SendNotAvailableOnDemultiplexer(Exception):
|
|
"""
|
|
Raised when trying to send with a WebsocketDemultiplexer. Use the multiplexer instead.
|
|
"""
|
|
pass
|