- WebSocket::send() sends message in TEXT mode by default

- WebSocketMessage sets a new binary field, which tells whether the received incoming message is binary or text
This commit is contained in:
Benjamin Sergeant 2019-06-09 11:55:34 -07:00
parent a11aa3e0dd
commit 55c65b08bf
11 changed files with 29 additions and 15 deletions

View File

@ -1,8 +1,10 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [Unreleased] - 2019-06-xx ## [4.0.0] - 2019-06-09
### Changed ### Changed
- WebSocket::send() sends message in TEXT mode by default
- WebSocketMessage sets a new binary field, which tells whether the received incoming message is binary or text
- WebSocket::send takes a third arg, binary which default to true (can be text too) - WebSocket::send takes a third arg, binary which default to true (can be text too)
- WebSocket callback only take one object, a const ix::WebSocketMessagePtr& msg - WebSocket callback only take one object, a const ix::WebSocketMessagePtr& msg
- Add explicite WebSocket::sendBinary - Add explicite WebSocket::sendBinary

View File

@ -1 +1 @@
3.1.2 4.0.0

View File

@ -325,8 +325,8 @@ namespace ix
WebSocketMessageType webSocketMessageType; WebSocketMessageType webSocketMessageType;
switch (messageKind) switch (messageKind)
{ {
default: case WebSocketTransport::MessageKind::MSG_TEXT:
case WebSocketTransport::MessageKind::MSG: case WebSocketTransport::MessageKind::MSG_BINARY:
{ {
webSocketMessageType = WebSocketMessageType::Message; webSocketMessageType = WebSocketMessageType::Message;
} break; } break;
@ -350,11 +350,13 @@ namespace ix
WebSocketErrorInfo webSocketErrorInfo; WebSocketErrorInfo webSocketErrorInfo;
webSocketErrorInfo.decompressionError = decompressionError; webSocketErrorInfo.decompressionError = decompressionError;
bool binary = messageKind == WebSocketTransport::MessageKind::MSG_BINARY;
_onMessageCallback( _onMessageCallback(
std::make_shared<WebSocketMessage>( std::make_shared<WebSocketMessage>(
webSocketMessageType, msg, wireSize, webSocketMessageType, msg, wireSize,
webSocketErrorInfo, WebSocketOpenInfo(), webSocketErrorInfo, WebSocketOpenInfo(),
WebSocketCloseInfo())); WebSocketCloseInfo(), binary));
WebSocket::invokeTrafficTrackerCallback(msg.size(), true); WebSocket::invokeTrafficTrackerCallback(msg.size(), true);
}); });
@ -385,8 +387,8 @@ namespace ix
} }
WebSocketSendInfo WebSocket::send(const std::string& data, WebSocketSendInfo WebSocket::send(const std::string& data,
const OnProgressCallback& onProgressCallback, bool binary,
bool binary) const OnProgressCallback& onProgressCallback)
{ {
return sendMessage(data, return sendMessage(data,
(binary) ? SendMessageKind::Binary: SendMessageKind::Text, (binary) ? SendMessageKind::Binary: SendMessageKind::Text,

View File

@ -66,8 +66,8 @@ namespace ix
// send is in binary mode by default // send is in binary mode by default
WebSocketSendInfo send(const std::string& data, WebSocketSendInfo send(const std::string& data,
const OnProgressCallback& onProgressCallback = nullptr, bool binary = false,
bool binary = true); const OnProgressCallback& onProgressCallback = nullptr);
WebSocketSendInfo sendBinary(const std::string& text, WebSocketSendInfo sendBinary(const std::string& text,
const OnProgressCallback& onProgressCallback = nullptr); const OnProgressCallback& onProgressCallback = nullptr);
WebSocketSendInfo sendText(const std::string& text, WebSocketSendInfo sendText(const std::string& text,

View File

@ -31,13 +31,15 @@ namespace ix
size_t w, size_t w,
WebSocketErrorInfo e, WebSocketErrorInfo e,
WebSocketOpenInfo o, WebSocketOpenInfo o,
WebSocketCloseInfo c) WebSocketCloseInfo c,
bool b = false)
: type(t) : type(t)
, str(std::move(s)) , str(std::move(s))
, wireSize(w) , wireSize(w)
, errorInfo(e) , errorInfo(e)
, openInfo(o) , openInfo(o)
, closeInfo(c) , closeInfo(c)
, binary(b)
{ {
; ;
} }

View File

@ -542,12 +542,17 @@ namespace ix
) { ) {
unmaskReceiveBuffer(ws); unmaskReceiveBuffer(ws);
MessageKind messageKind =
(ws.opcode == wsheader_type::TEXT_FRAME)
? MessageKind::MSG_TEXT
: MessageKind::MSG_BINARY;
// //
// Usual case. Small unfragmented messages // Usual case. Small unfragmented messages
// //
if (ws.fin && _chunks.empty()) if (ws.fin && _chunks.empty())
{ {
emitMessage(MessageKind::MSG, emitMessage(messageKind,
std::string(_rxbuf.begin()+ws.header_size, std::string(_rxbuf.begin()+ws.header_size,
_rxbuf.begin()+ws.header_size+(size_t) ws.N), _rxbuf.begin()+ws.header_size+(size_t) ws.N),
ws, ws,
@ -567,7 +572,7 @@ namespace ix
_rxbuf.begin()+ws.header_size+(size_t)ws.N)); _rxbuf.begin()+ws.header_size+(size_t)ws.N));
if (ws.fin) if (ws.fin)
{ {
emitMessage(MessageKind::MSG, getMergedChunks(), ws, onMessageCallback); emitMessage(messageKind, getMergedChunks(), ws, onMessageCallback);
_chunks.clear(); _chunks.clear();
} }
else else

View File

@ -50,7 +50,8 @@ namespace ix
enum class MessageKind enum class MessageKind
{ {
MSG, MSG_TEXT,
MSG_BINARY,
PING, PING,
PONG, PONG,
FRAGMENT FRAGMENT

View File

@ -200,7 +200,7 @@ namespace ix
{ {
if (client != webSocket) if (client != webSocket)
{ {
client->send(msg->str); client->send(msg->str, msg->binary);
} }
} }
} }

View File

@ -62,6 +62,7 @@ namespace ix
if (client != webSocket) if (client != webSocket)
{ {
client->send(msg->str, client->send(msg->str,
msg->binary,
[](int current, int total) -> bool [](int current, int total) -> bool
{ {
std::cerr << "Step " << current std::cerr << "Step " << current

View File

@ -59,7 +59,7 @@ namespace ix
std::cerr << "Received " std::cerr << "Received "
<< msg->wireSize << " bytes" << msg->wireSize << " bytes"
<< std::endl; << std::endl;
webSocket->send(msg->str); webSocket->send(msg->str, msg->binary);
} }
} }
); );

View File

@ -62,6 +62,7 @@ namespace ix
if (client != webSocket) if (client != webSocket)
{ {
client->send(msg->str, client->send(msg->str,
msg->binary,
[](int current, int total) -> bool [](int current, int total) -> bool
{ {
std::cerr << "ws_transfer: Step " << current std::cerr << "ws_transfer: Step " << current