From e85b5bff3c3197c256bb40965efc96a2de962311 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Sun, 21 Jun 2020 00:05:18 +0200 Subject: [PATCH] Skip sending on WebSocket when having too much backpressure --- src/WebSocket.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/WebSocket.h b/src/WebSocket.h index de29b82..aa13401 100644 --- a/src/WebSocket.h +++ b/src/WebSocket.h @@ -58,6 +58,15 @@ public: /* Send or buffer a WebSocket frame, compressed or not. Returns false on increased user space backpressure. */ bool send(std::string_view message, uWS::OpCode opCode = uWS::OpCode::BINARY, bool compress = false) { + WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, + (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) + ); + + /* Skip sending and report success if we are over the limit of maxBackpressure */ + if (webSocketContextData->maxBackpressure < getBufferedAmount()) { + return true; + } + /* Transform the message to compressed domain if requested */ if (compress) { WebSocketData *webSocketData = (WebSocketData *) Super::getAsyncSocketData(); @@ -109,10 +118,7 @@ public: } /* Every successful send resets the timeout */ - WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, - (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) - ); - AsyncSocket::timeout(webSocketContextData->idleTimeout); + Super::timeout(webSocketContextData->idleTimeout); /* Return success */ return true;