(websocket) reset per-message deflate codec everytime we connect to a server/client

This commit is contained in:
Benjamin Sergeant 2020-03-23 18:46:30 -07:00
parent f41a54186c
commit 9dcc2538ae
7 changed files with 17 additions and 9 deletions

View File

@ -1,6 +1,10 @@
# Changelog # Changelog
All changes to this project will be documented in this file. All changes to this project will be documented in this file.
## [9.0.0] - 2020-03-23
(websocket) reset per-message deflate codec everytime we connect to a server/client
## [8.3.4] - 2020-03-23 ## [8.3.4] - 2020-03-23
(websocket) fix #167, a long standing issue with sending empty messages with per-message deflate extension (and hopefully other zlib bug) (websocket) fix #167, a long standing issue with sending empty messages with per-message deflate extension (and hopefully other zlib bug)

View File

@ -22,7 +22,7 @@ namespace ix
WebSocketHandshake::WebSocketHandshake( WebSocketHandshake::WebSocketHandshake(
std::atomic<bool>& requestInitCancellation, std::atomic<bool>& requestInitCancellation,
std::shared_ptr<Socket> socket, std::shared_ptr<Socket> socket,
WebSocketPerMessageDeflate& perMessageDeflate, WebSocketPerMessageDeflatePtr& perMessageDeflate,
WebSocketPerMessageDeflateOptions& perMessageDeflateOptions, WebSocketPerMessageDeflateOptions& perMessageDeflateOptions,
std::atomic<bool>& enablePerMessageDeflate) std::atomic<bool>& enablePerMessageDeflate)
: _requestInitCancellation(requestInitCancellation) : _requestInitCancellation(requestInitCancellation)
@ -230,7 +230,7 @@ namespace ix
_enablePerMessageDeflate = false; _enablePerMessageDeflate = false;
} }
// Otherwise try to initialize the deflate engine (zlib) // Otherwise try to initialize the deflate engine (zlib)
else if (!_perMessageDeflate.init(webSocketPerMessageDeflateOptions)) else if (!_perMessageDeflate->init(webSocketPerMessageDeflateOptions))
{ {
return WebSocketInitResult( return WebSocketInitResult(
false, 0, "Failed to initialize per message deflate engine"); false, 0, "Failed to initialize per message deflate engine");
@ -341,7 +341,7 @@ namespace ix
{ {
_enablePerMessageDeflate = true; _enablePerMessageDeflate = true;
if (!_perMessageDeflate.init(webSocketPerMessageDeflateOptions)) if (!_perMessageDeflate->init(webSocketPerMessageDeflateOptions))
{ {
return WebSocketInitResult( return WebSocketInitResult(
false, 0, "Failed to initialize per message deflate engine"); false, 0, "Failed to initialize per message deflate engine");

View File

@ -24,7 +24,7 @@ namespace ix
public: public:
WebSocketHandshake(std::atomic<bool>& requestInitCancellation, WebSocketHandshake(std::atomic<bool>& requestInitCancellation,
std::shared_ptr<Socket> _socket, std::shared_ptr<Socket> _socket,
WebSocketPerMessageDeflate& perMessageDeflate, WebSocketPerMessageDeflatePtr& perMessageDeflate,
WebSocketPerMessageDeflateOptions& perMessageDeflateOptions, WebSocketPerMessageDeflateOptions& perMessageDeflateOptions,
std::atomic<bool>& enablePerMessageDeflate); std::atomic<bool>& enablePerMessageDeflate);
@ -47,7 +47,7 @@ namespace ix
std::atomic<bool>& _requestInitCancellation; std::atomic<bool>& _requestInitCancellation;
std::shared_ptr<Socket> _socket; std::shared_ptr<Socket> _socket;
WebSocketPerMessageDeflate& _perMessageDeflate; WebSocketPerMessageDeflatePtr& _perMessageDeflate;
WebSocketPerMessageDeflateOptions& _perMessageDeflateOptions; WebSocketPerMessageDeflateOptions& _perMessageDeflateOptions;
std::atomic<bool>& _enablePerMessageDeflate; std::atomic<bool>& _enablePerMessageDeflate;
}; };

View File

@ -57,4 +57,6 @@ namespace ix
std::unique_ptr<WebSocketPerMessageDeflateCompressor> _compressor; std::unique_ptr<WebSocketPerMessageDeflateCompressor> _compressor;
std::unique_ptr<WebSocketPerMessageDeflateDecompressor> _decompressor; std::unique_ptr<WebSocketPerMessageDeflateDecompressor> _decompressor;
}; };
using WebSocketPerMessageDeflatePtr = std::unique_ptr<WebSocketPerMessageDeflate>;
} // namespace ix } // namespace ix

View File

@ -117,6 +117,7 @@ namespace ix
std::string errorMsg; std::string errorMsg;
bool tls = protocol == "wss"; bool tls = protocol == "wss";
_socket = createSocket(tls, -1, errorMsg, _socketTLSOptions); _socket = createSocket(tls, -1, errorMsg, _socketTLSOptions);
_perMessageDeflate = std::make_unique<WebSocketPerMessageDeflate>();
if (!_socket) if (!_socket)
{ {
@ -149,6 +150,7 @@ namespace ix
_blockingSend = true; _blockingSend = true;
_socket = socket; _socket = socket;
_perMessageDeflate = std::make_unique<WebSocketPerMessageDeflate>();
WebSocketHandshake webSocketHandshake(_requestInitCancellation, WebSocketHandshake webSocketHandshake(_requestInitCancellation,
_socket, _socket,
@ -711,7 +713,7 @@ namespace ix
if (compressedMessage && messageKind != MessageKind::FRAGMENT) if (compressedMessage && messageKind != MessageKind::FRAGMENT)
{ {
std::string decompressedMessage; std::string decompressedMessage;
bool success = _perMessageDeflate.decompress(message, decompressedMessage); bool success = _perMessageDeflate->decompress(message, decompressedMessage);
if (messageKind == MessageKind::MSG_TEXT && !validateUtf8(decompressedMessage)) if (messageKind == MessageKind::MSG_TEXT && !validateUtf8(decompressedMessage))
{ {
@ -765,7 +767,7 @@ namespace ix
if (compress) if (compress)
{ {
if (!_perMessageDeflate.compress(message, compressedMessage)) if (!_perMessageDeflate->compress(message, compressedMessage))
{ {
bool success = false; bool success = false;
compressionError = true; compressionError = true;

View File

@ -185,7 +185,7 @@ namespace ix
mutable std::mutex _closeDataMutex; mutable std::mutex _closeDataMutex;
// Data used for Per Message Deflate compression (with zlib) // Data used for Per Message Deflate compression (with zlib)
WebSocketPerMessageDeflate _perMessageDeflate; WebSocketPerMessageDeflatePtr _perMessageDeflate;
WebSocketPerMessageDeflateOptions _perMessageDeflateOptions; WebSocketPerMessageDeflateOptions _perMessageDeflateOptions;
std::atomic<bool> _enablePerMessageDeflate; std::atomic<bool> _enablePerMessageDeflate;

View File

@ -6,4 +6,4 @@
#pragma once #pragma once
#define IX_WEBSOCKET_VERSION "8.3.4" #define IX_WEBSOCKET_VERSION "9.0.0"