per-message deflate compression fixes
This commit is contained in:
parent
e847716076
commit
54da891f79
@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* cmd_websocket_chat.cpp
|
* broadcast-server.js
|
||||||
* Author: Benjamin Sergeant
|
* Author: Benjamin Sergeant
|
||||||
* Copyright (c) 2017-2018 Machine Zone, Inc. All rights reserved.
|
* Copyright (c) 2017-2018 Machine Zone, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
const WebSocket = require('ws');
|
const WebSocket = require('ws');
|
||||||
|
|
||||||
const wss = new WebSocket.Server({ port: 8080 });
|
const wss = new WebSocket.Server({ port: 8080, perMessageDeflate: true });
|
||||||
|
|
||||||
// Broadcast to all.
|
// Broadcast to all.
|
||||||
wss.broadcast = function broadcast(data) {
|
wss.broadcast = function broadcast(data) {
|
||||||
|
28
examples/chat/broadcast-server.py
Normal file
28
examples/chat/broadcast-server.py
Normal file
@ -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()
|
@ -14,7 +14,7 @@ namespace ix
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WebSocketPerMessageDeflateOptions(
|
WebSocketPerMessageDeflateOptions(
|
||||||
bool enabled = true,
|
bool enabled = false,
|
||||||
bool clientNoContextTakeover = false,
|
bool clientNoContextTakeover = false,
|
||||||
bool serverNoContextTakeover = false,
|
bool serverNoContextTakeover = false,
|
||||||
uint8_t clientMaxWindowBits = kDefaultClientMaxWindowBits,
|
uint8_t clientMaxWindowBits = kDefaultClientMaxWindowBits,
|
||||||
@ -33,14 +33,14 @@ namespace ix
|
|||||||
static bool startsWith(const std::string& str, const std::string& start);
|
static bool startsWith(const std::string& str, const std::string& start);
|
||||||
static std::string removeSpaces(const std::string& str);
|
static std::string removeSpaces(const std::string& str);
|
||||||
|
|
||||||
|
static uint8_t const kDefaultClientMaxWindowBits;
|
||||||
|
static uint8_t const kDefaultServerMaxWindowBits;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _enabled;
|
bool _enabled;
|
||||||
bool _clientNoContextTakeover;
|
bool _clientNoContextTakeover;
|
||||||
bool _serverNoContextTakeover;
|
bool _serverNoContextTakeover;
|
||||||
int _clientMaxWindowBits;
|
int _clientMaxWindowBits;
|
||||||
int _serverMaxWindowBits;
|
int _serverMaxWindowBits;
|
||||||
|
|
||||||
static uint8_t const kDefaultClientMaxWindowBits;
|
|
||||||
static uint8_t const kDefaultServerMaxWindowBits;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -578,7 +578,8 @@ namespace ix
|
|||||||
_rxbuf.begin()+ws.header_size + (size_t) ws.N);
|
_rxbuf.begin()+ws.header_size + (size_t) ws.N);
|
||||||
|
|
||||||
// Reply back right away
|
// Reply back right away
|
||||||
sendData(wsheader_type::PONG, pingData, _enablePerMessageDeflate);
|
bool compress = false;
|
||||||
|
sendData(wsheader_type::PONG, pingData, compress);
|
||||||
|
|
||||||
emitMessage(PING, pingData, ws, onMessageCallback);
|
emitMessage(PING, pingData, ws, onMessageCallback);
|
||||||
}
|
}
|
||||||
@ -627,15 +628,15 @@ namespace ix
|
|||||||
const wsheader_type& ws,
|
const wsheader_type& ws,
|
||||||
const OnMessageCallback& onMessageCallback)
|
const OnMessageCallback& onMessageCallback)
|
||||||
{
|
{
|
||||||
// ws.rsv1 means the message is compressed
|
size_t wireSize = message.size();
|
||||||
std::string decompressedMessage;
|
|
||||||
|
|
||||||
|
// When the RSV1 bit is 1 it means the message is compressed
|
||||||
if (_enablePerMessageDeflate && ws.rsv1)
|
if (_enablePerMessageDeflate && ws.rsv1)
|
||||||
{
|
{
|
||||||
|
std::string decompressedMessage;
|
||||||
if (_perMessageDeflate.decompress(message, decompressedMessage))
|
if (_perMessageDeflate.decompress(message, decompressedMessage))
|
||||||
{
|
{
|
||||||
onMessageCallback(decompressedMessage, decompressedMessage.size(),
|
onMessageCallback(decompressedMessage, wireSize, messageKind);
|
||||||
messageKind);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -644,7 +645,7 @@ namespace ix
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
onMessageCallback(message, message.size(), messageKind);
|
onMessageCallback(message, wireSize, messageKind);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -753,7 +754,8 @@ namespace ix
|
|||||||
|
|
||||||
WebSocketSendInfo WebSocketTransport::sendPing(const std::string& message)
|
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)
|
WebSocketSendInfo WebSocketTransport::sendBinary(const std::string& message)
|
||||||
|
Loading…
Reference in New Issue
Block a user