From 55c65b08bf1ec8ddb5f596ec0aabec7f0da25684 Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Sun, 9 Jun 2019 11:55:34 -0700 Subject: [PATCH] - 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 --- CHANGELOG.md | 4 +++- DOCKER_VERSION | 2 +- ixwebsocket/IXWebSocket.cpp | 12 +++++++----- ixwebsocket/IXWebSocket.h | 4 ++-- ixwebsocket/IXWebSocketMessage.h | 4 +++- ixwebsocket/IXWebSocketTransport.cpp | 9 +++++++-- ixwebsocket/IXWebSocketTransport.h | 3 ++- test/IXTest.cpp | 2 +- ws/ws_broadcast_server.cpp | 1 + ws/ws_echo_server.cpp | 2 +- ws/ws_transfer.cpp | 1 + 11 files changed, 29 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a9ce327..4ba57504 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ # Changelog All notable changes to this project will be documented in this file. -## [Unreleased] - 2019-06-xx +## [4.0.0] - 2019-06-09 ### 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 callback only take one object, a const ix::WebSocketMessagePtr& msg - Add explicite WebSocket::sendBinary diff --git a/DOCKER_VERSION b/DOCKER_VERSION index ef538c28..fcdb2e10 100644 --- a/DOCKER_VERSION +++ b/DOCKER_VERSION @@ -1 +1 @@ -3.1.2 +4.0.0 diff --git a/ixwebsocket/IXWebSocket.cpp b/ixwebsocket/IXWebSocket.cpp index 5ff44d6c..dab858af 100644 --- a/ixwebsocket/IXWebSocket.cpp +++ b/ixwebsocket/IXWebSocket.cpp @@ -325,8 +325,8 @@ namespace ix WebSocketMessageType webSocketMessageType; switch (messageKind) { - default: - case WebSocketTransport::MessageKind::MSG: + case WebSocketTransport::MessageKind::MSG_TEXT: + case WebSocketTransport::MessageKind::MSG_BINARY: { webSocketMessageType = WebSocketMessageType::Message; } break; @@ -350,11 +350,13 @@ namespace ix WebSocketErrorInfo webSocketErrorInfo; webSocketErrorInfo.decompressionError = decompressionError; + bool binary = messageKind == WebSocketTransport::MessageKind::MSG_BINARY; + _onMessageCallback( std::make_shared( webSocketMessageType, msg, wireSize, webSocketErrorInfo, WebSocketOpenInfo(), - WebSocketCloseInfo())); + WebSocketCloseInfo(), binary)); WebSocket::invokeTrafficTrackerCallback(msg.size(), true); }); @@ -385,8 +387,8 @@ namespace ix } WebSocketSendInfo WebSocket::send(const std::string& data, - const OnProgressCallback& onProgressCallback, - bool binary) + bool binary, + const OnProgressCallback& onProgressCallback) { return sendMessage(data, (binary) ? SendMessageKind::Binary: SendMessageKind::Text, diff --git a/ixwebsocket/IXWebSocket.h b/ixwebsocket/IXWebSocket.h index 22b50d98..035fa05a 100644 --- a/ixwebsocket/IXWebSocket.h +++ b/ixwebsocket/IXWebSocket.h @@ -66,8 +66,8 @@ namespace ix // send is in binary mode by default WebSocketSendInfo send(const std::string& data, - const OnProgressCallback& onProgressCallback = nullptr, - bool binary = true); + bool binary = false, + const OnProgressCallback& onProgressCallback = nullptr); WebSocketSendInfo sendBinary(const std::string& text, const OnProgressCallback& onProgressCallback = nullptr); WebSocketSendInfo sendText(const std::string& text, diff --git a/ixwebsocket/IXWebSocketMessage.h b/ixwebsocket/IXWebSocketMessage.h index bca91eaa..be433edb 100644 --- a/ixwebsocket/IXWebSocketMessage.h +++ b/ixwebsocket/IXWebSocketMessage.h @@ -31,13 +31,15 @@ namespace ix size_t w, WebSocketErrorInfo e, WebSocketOpenInfo o, - WebSocketCloseInfo c) + WebSocketCloseInfo c, + bool b = false) : type(t) , str(std::move(s)) , wireSize(w) , errorInfo(e) , openInfo(o) , closeInfo(c) + , binary(b) { ; } diff --git a/ixwebsocket/IXWebSocketTransport.cpp b/ixwebsocket/IXWebSocketTransport.cpp index 51544212..cadf7631 100644 --- a/ixwebsocket/IXWebSocketTransport.cpp +++ b/ixwebsocket/IXWebSocketTransport.cpp @@ -542,12 +542,17 @@ namespace ix ) { unmaskReceiveBuffer(ws); + MessageKind messageKind = + (ws.opcode == wsheader_type::TEXT_FRAME) + ? MessageKind::MSG_TEXT + : MessageKind::MSG_BINARY; + // // Usual case. Small unfragmented messages // if (ws.fin && _chunks.empty()) { - emitMessage(MessageKind::MSG, + emitMessage(messageKind, std::string(_rxbuf.begin()+ws.header_size, _rxbuf.begin()+ws.header_size+(size_t) ws.N), ws, @@ -567,7 +572,7 @@ namespace ix _rxbuf.begin()+ws.header_size+(size_t)ws.N)); if (ws.fin) { - emitMessage(MessageKind::MSG, getMergedChunks(), ws, onMessageCallback); + emitMessage(messageKind, getMergedChunks(), ws, onMessageCallback); _chunks.clear(); } else diff --git a/ixwebsocket/IXWebSocketTransport.h b/ixwebsocket/IXWebSocketTransport.h index aa432319..3da2fa5d 100644 --- a/ixwebsocket/IXWebSocketTransport.h +++ b/ixwebsocket/IXWebSocketTransport.h @@ -50,7 +50,8 @@ namespace ix enum class MessageKind { - MSG, + MSG_TEXT, + MSG_BINARY, PING, PONG, FRAGMENT diff --git a/test/IXTest.cpp b/test/IXTest.cpp index f578c706..e246ce86 100644 --- a/test/IXTest.cpp +++ b/test/IXTest.cpp @@ -200,7 +200,7 @@ namespace ix { if (client != webSocket) { - client->send(msg->str); + client->send(msg->str, msg->binary); } } } diff --git a/ws/ws_broadcast_server.cpp b/ws/ws_broadcast_server.cpp index 505d61ec..1bddb603 100644 --- a/ws/ws_broadcast_server.cpp +++ b/ws/ws_broadcast_server.cpp @@ -62,6 +62,7 @@ namespace ix if (client != webSocket) { client->send(msg->str, + msg->binary, [](int current, int total) -> bool { std::cerr << "Step " << current diff --git a/ws/ws_echo_server.cpp b/ws/ws_echo_server.cpp index b5cb9a63..ab581f0d 100644 --- a/ws/ws_echo_server.cpp +++ b/ws/ws_echo_server.cpp @@ -59,7 +59,7 @@ namespace ix std::cerr << "Received " << msg->wireSize << " bytes" << std::endl; - webSocket->send(msg->str); + webSocket->send(msg->str, msg->binary); } } ); diff --git a/ws/ws_transfer.cpp b/ws/ws_transfer.cpp index ad78d064..7ec07bcb 100644 --- a/ws/ws_transfer.cpp +++ b/ws/ws_transfer.cpp @@ -62,6 +62,7 @@ namespace ix if (client != webSocket) { client->send(msg->str, + msg->binary, [](int current, int total) -> bool { std::cerr << "ws_transfer: Step " << current