From 54da891f7943002a448730bf130e5196f06590ee Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Tue, 13 Nov 2018 17:46:05 -0800 Subject: [PATCH] per-message deflate compression fixes --- examples/chat/broadcast-server.js | 4 +-- examples/chat/broadcast-server.py | 28 +++++++++++++++++++ .../IXWebSocketPerMessageDeflateOptions.h | 8 +++--- ixwebsocket/IXWebSocketTransport.cpp | 16 ++++++----- 4 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 examples/chat/broadcast-server.py diff --git a/examples/chat/broadcast-server.js b/examples/chat/broadcast-server.js index 35d98455..b4016449 100644 --- a/examples/chat/broadcast-server.js +++ b/examples/chat/broadcast-server.js @@ -1,11 +1,11 @@ /* - * cmd_websocket_chat.cpp + * broadcast-server.js * Author: Benjamin Sergeant * Copyright (c) 2017-2018 Machine Zone, Inc. All rights reserved. */ const WebSocket = require('ws'); -const wss = new WebSocket.Server({ port: 8080 }); +const wss = new WebSocket.Server({ port: 8080, perMessageDeflate: true }); // Broadcast to all. wss.broadcast = function broadcast(data) { diff --git a/examples/chat/broadcast-server.py b/examples/chat/broadcast-server.py new file mode 100644 index 00000000..573f94bb --- /dev/null +++ b/examples/chat/broadcast-server.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import os +import asyncio +import websockets + +connections = set() + +async def echo(websocket, path): + + connections.add(websocket) + + try: + async for message in websocket: + print(message) + + for ws in connections: + if ws != websocket: + await ws.send(message) + except: + raise + finally: + connections.remove(websocket) + + +asyncio.get_event_loop().run_until_complete( + websockets.serve(echo, 'localhost', 8080)) +asyncio.get_event_loop().run_forever() diff --git a/ixwebsocket/IXWebSocketPerMessageDeflateOptions.h b/ixwebsocket/IXWebSocketPerMessageDeflateOptions.h index 5caceead..cfb8e16f 100644 --- a/ixwebsocket/IXWebSocketPerMessageDeflateOptions.h +++ b/ixwebsocket/IXWebSocketPerMessageDeflateOptions.h @@ -14,7 +14,7 @@ namespace ix { public: WebSocketPerMessageDeflateOptions( - bool enabled = true, + bool enabled = false, bool clientNoContextTakeover = false, bool serverNoContextTakeover = false, uint8_t clientMaxWindowBits = kDefaultClientMaxWindowBits, @@ -33,14 +33,14 @@ namespace ix static bool startsWith(const std::string& str, const std::string& start); static std::string removeSpaces(const std::string& str); + static uint8_t const kDefaultClientMaxWindowBits; + static uint8_t const kDefaultServerMaxWindowBits; + private: bool _enabled; bool _clientNoContextTakeover; bool _serverNoContextTakeover; int _clientMaxWindowBits; int _serverMaxWindowBits; - - static uint8_t const kDefaultClientMaxWindowBits; - static uint8_t const kDefaultServerMaxWindowBits; }; } diff --git a/ixwebsocket/IXWebSocketTransport.cpp b/ixwebsocket/IXWebSocketTransport.cpp index c76f10c8..b79c1354 100644 --- a/ixwebsocket/IXWebSocketTransport.cpp +++ b/ixwebsocket/IXWebSocketTransport.cpp @@ -578,7 +578,8 @@ namespace ix _rxbuf.begin()+ws.header_size + (size_t) ws.N); // Reply back right away - sendData(wsheader_type::PONG, pingData, _enablePerMessageDeflate); + bool compress = false; + sendData(wsheader_type::PONG, pingData, compress); emitMessage(PING, pingData, ws, onMessageCallback); } @@ -627,15 +628,15 @@ namespace ix const wsheader_type& ws, const OnMessageCallback& onMessageCallback) { - // ws.rsv1 means the message is compressed - std::string decompressedMessage; + size_t wireSize = message.size(); + // When the RSV1 bit is 1 it means the message is compressed if (_enablePerMessageDeflate && ws.rsv1) { + std::string decompressedMessage; if (_perMessageDeflate.decompress(message, decompressedMessage)) { - onMessageCallback(decompressedMessage, decompressedMessage.size(), - messageKind); + onMessageCallback(decompressedMessage, wireSize, messageKind); } else { @@ -644,7 +645,7 @@ namespace ix } else { - onMessageCallback(message, message.size(), messageKind); + onMessageCallback(message, wireSize, messageKind); } } @@ -753,7 +754,8 @@ namespace ix WebSocketSendInfo WebSocketTransport::sendPing(const std::string& message) { - return sendData(wsheader_type::PING, message, _enablePerMessageDeflate); + bool compress = false; + return sendData(wsheader_type::PING, message, compress); } WebSocketSendInfo WebSocketTransport::sendBinary(const std::string& message)