mirror of
https://github.com/django/daphne.git
synced 2024-11-26 01:33:44 +03:00
Take note of backpressure
This commit is contained in:
parent
905b71a745
commit
2d777e75f9
|
@ -111,6 +111,7 @@ class WebRequest(http.Request):
|
||||||
self.client_addr = None
|
self.client_addr = None
|
||||||
self.server_addr = None
|
self.server_addr = None
|
||||||
# Send message
|
# Send message
|
||||||
|
try:
|
||||||
self.factory.channel_layer.send("http.request", {
|
self.factory.channel_layer.send("http.request", {
|
||||||
"reply_channel": self.reply_channel,
|
"reply_channel": self.reply_channel,
|
||||||
# TODO: Correctly say if it's 1.1 or 1.0
|
# TODO: Correctly say if it's 1.1 or 1.0
|
||||||
|
@ -124,6 +125,9 @@ class WebRequest(http.Request):
|
||||||
"client": self.client_addr,
|
"client": self.client_addr,
|
||||||
"server": self.server_addr,
|
"server": self.server_addr,
|
||||||
})
|
})
|
||||||
|
except self.factory.channel_layer.ChannelFull:
|
||||||
|
# Channel is too full; reject request with 503
|
||||||
|
self.basic_error(503, b"Service Unavailable", "Request queue full.")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def unquote(cls, value):
|
def unquote(cls, value):
|
||||||
|
@ -140,9 +144,12 @@ class WebRequest(http.Request):
|
||||||
Sends a disconnect message on the http.disconnect channel.
|
Sends a disconnect message on the http.disconnect channel.
|
||||||
Useful only really for long-polling.
|
Useful only really for long-polling.
|
||||||
"""
|
"""
|
||||||
|
try:
|
||||||
self.factory.channel_layer.send("http.disconnect", {
|
self.factory.channel_layer.send("http.disconnect", {
|
||||||
"reply_channel": self.reply_channel,
|
"reply_channel": self.reply_channel,
|
||||||
})
|
})
|
||||||
|
except self.factory.channel_layer.ChannelFull:
|
||||||
|
pass
|
||||||
|
|
||||||
def connectionLost(self, reason):
|
def connectionLost(self, reason):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -82,7 +82,11 @@ class WebSocketProtocol(WebSocketServerProtocol):
|
||||||
def onOpen(self):
|
def onOpen(self):
|
||||||
# Send news that this channel is open
|
# Send news that this channel is open
|
||||||
logger.debug("WebSocket open for %s", self.reply_channel)
|
logger.debug("WebSocket open for %s", self.reply_channel)
|
||||||
|
try:
|
||||||
self.channel_layer.send("websocket.connect", self.request_info)
|
self.channel_layer.send("websocket.connect", self.request_info)
|
||||||
|
except self.channel_layer.ChannelFull:
|
||||||
|
# We don't drop the connection here as you don't _have_ to consume websocket.connect
|
||||||
|
pass
|
||||||
self.factory.log_action("websocket", "connected", {
|
self.factory.log_action("websocket", "connected", {
|
||||||
"path": self.request.path,
|
"path": self.request.path,
|
||||||
"client": "%s:%s" % tuple(self.client_addr) if self.client_addr else None,
|
"client": "%s:%s" % tuple(self.client_addr) if self.client_addr else None,
|
||||||
|
@ -92,6 +96,7 @@ class WebSocketProtocol(WebSocketServerProtocol):
|
||||||
logger.debug("WebSocket incoming packet on %s", self.reply_channel)
|
logger.debug("WebSocket incoming packet on %s", self.reply_channel)
|
||||||
self.packets_received += 1
|
self.packets_received += 1
|
||||||
self.last_data = time.time()
|
self.last_data = time.time()
|
||||||
|
try:
|
||||||
if isBinary:
|
if isBinary:
|
||||||
self.channel_layer.send("websocket.receive", {
|
self.channel_layer.send("websocket.receive", {
|
||||||
"reply_channel": self.reply_channel,
|
"reply_channel": self.reply_channel,
|
||||||
|
@ -106,6 +111,10 @@ class WebSocketProtocol(WebSocketServerProtocol):
|
||||||
"order": self.packets_received,
|
"order": self.packets_received,
|
||||||
"text": payload.decode("utf8"),
|
"text": payload.decode("utf8"),
|
||||||
})
|
})
|
||||||
|
except self.channel_layer.ChannelFull:
|
||||||
|
# We don't drop the connection here as you don't _have_ to consume websocket.receive
|
||||||
|
# TODO: Maybe add an option to drop if this is backlogged?
|
||||||
|
pass
|
||||||
|
|
||||||
def serverSend(self, content, binary=False):
|
def serverSend(self, content, binary=False):
|
||||||
"""
|
"""
|
||||||
|
@ -128,11 +137,14 @@ class WebSocketProtocol(WebSocketServerProtocol):
|
||||||
if hasattr(self, "reply_channel"):
|
if hasattr(self, "reply_channel"):
|
||||||
logger.debug("WebSocket closed for %s", self.reply_channel)
|
logger.debug("WebSocket closed for %s", self.reply_channel)
|
||||||
del self.factory.reply_protocols[self.reply_channel]
|
del self.factory.reply_protocols[self.reply_channel]
|
||||||
|
try:
|
||||||
self.channel_layer.send("websocket.disconnect", {
|
self.channel_layer.send("websocket.disconnect", {
|
||||||
"reply_channel": self.reply_channel,
|
"reply_channel": self.reply_channel,
|
||||||
"path": self.unquote(self.path),
|
"path": self.unquote(self.path),
|
||||||
"order": self.packets_received + 1,
|
"order": self.packets_received + 1,
|
||||||
})
|
})
|
||||||
|
except self.channel_layer.ChannelFull:
|
||||||
|
pass
|
||||||
self.factory.log_action("websocket", "disconnected", {
|
self.factory.log_action("websocket", "disconnected", {
|
||||||
"path": self.request.path,
|
"path": self.request.path,
|
||||||
"client": "%s:%s" % tuple(self.client_addr) if self.client_addr else None,
|
"client": "%s:%s" % tuple(self.client_addr) if self.client_addr else None,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user