diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 422f8183..6440f469 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog All changes to this project will be documented in this file. +## [8.1.2] - 2020-02-18 + +(WebSocketServer) add option to disable deflate compression, exposed with the -x option to ws echo_server + ## [8.1.1] - 2020-02-18 (ws cobra to statsd and sentry sender) exit if no messages are received for one minute, which is a sign that something goes wrong on the server side. That should be changed to be configurable in the future diff --git a/ixwebsocket/IXHttpServer.cpp b/ixwebsocket/IXHttpServer.cpp index 1341353f..4a197de9 100644 --- a/ixwebsocket/IXHttpServer.cpp +++ b/ixwebsocket/IXHttpServer.cpp @@ -42,7 +42,8 @@ namespace namespace ix { - HttpServer::HttpServer(int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) + HttpServer::HttpServer( + int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) : SocketServer(port, host, backlog, maxConnections, addressFamily) , _connectedClientsCount(0) { diff --git a/ixwebsocket/IXSocketServer.cpp b/ixwebsocket/IXSocketServer.cpp index e502c4a4..c2bd4b10 100644 --- a/ixwebsocket/IXSocketServer.cpp +++ b/ixwebsocket/IXSocketServer.cpp @@ -23,11 +23,8 @@ namespace ix const size_t SocketServer::kDefaultMaxConnections(32); const int SocketServer::kDefaultAddressFamily(AF_INET); - SocketServer::SocketServer(int port, - const std::string& host, - int backlog, - size_t maxConnections, - int addressFamily) + SocketServer::SocketServer( + int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) : _port(port) , _host(host) , _backlog(backlog) @@ -97,7 +94,8 @@ namespace ix { std::stringstream ss; ss << "SocketServer::listen() error calling inet_pton " - << "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno()); + << "at address " << _host << ":" << _port << " : " + << strerror(Socket::getErrno()); Socket::closeSocket(_serverFd); return std::make_pair(false, ss.str()); @@ -108,7 +106,8 @@ namespace ix { std::stringstream ss; ss << "SocketServer::listen() error calling bind " - << "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno()); + << "at address " << _host << ":" << _port << " : " + << strerror(Socket::getErrno()); Socket::closeSocket(_serverFd); return std::make_pair(false, ss.str()); @@ -124,7 +123,8 @@ namespace ix { std::stringstream ss; ss << "SocketServer::listen() error calling inet_pton " - << "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno()); + << "at address " << _host << ":" << _port << " : " + << strerror(Socket::getErrno()); Socket::closeSocket(_serverFd); return std::make_pair(false, ss.str()); @@ -135,7 +135,8 @@ namespace ix { std::stringstream ss; ss << "SocketServer::listen() error calling bind " - << "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno()); + << "at address " << _host << ":" << _port << " : " + << strerror(Socket::getErrno()); Socket::closeSocket(_serverFd); return std::make_pair(false, ss.str()); diff --git a/ixwebsocket/IXWebSocket.h b/ixwebsocket/IXWebSocket.h index 015171b0..eb33cb91 100644 --- a/ixwebsocket/IXWebSocket.h +++ b/ixwebsocket/IXWebSocket.h @@ -19,10 +19,10 @@ #include "IXWebSocketSendInfo.h" #include "IXWebSocketTransport.h" #include +#include #include #include #include -#include namespace ix { diff --git a/ixwebsocket/IXWebSocketHandshake.cpp b/ixwebsocket/IXWebSocketHandshake.cpp index dac14dac..64423179 100644 --- a/ixwebsocket/IXWebSocketHandshake.cpp +++ b/ixwebsocket/IXWebSocketHandshake.cpp @@ -12,6 +12,7 @@ #include "IXUserAgent.h" #include "libwshandshake.hpp" #include +#include #include #include @@ -335,8 +336,9 @@ namespace ix std::string header = headers["sec-websocket-extensions"]; WebSocketPerMessageDeflateOptions webSocketPerMessageDeflateOptions(header); - // If the client has requested that extension, enable it. - if (webSocketPerMessageDeflateOptions.enabled()) + // If the client has requested that extension, + // and the server does not prevent it, enable it. + if (_enablePerMessageDeflate && webSocketPerMessageDeflateOptions.enabled()) { _enablePerMessageDeflate = true; diff --git a/ixwebsocket/IXWebSocketServer.cpp b/ixwebsocket/IXWebSocketServer.cpp index 409ed277..16329ec3 100644 --- a/ixwebsocket/IXWebSocketServer.cpp +++ b/ixwebsocket/IXWebSocketServer.cpp @@ -28,6 +28,7 @@ namespace ix : SocketServer(port, host, backlog, maxConnections, addressFamily) , _handshakeTimeoutSecs(handshakeTimeoutSecs) , _enablePong(kDefaultEnablePong) + , _enablePerMessageDeflate(true) { } @@ -59,6 +60,11 @@ namespace ix _enablePong = false; } + void WebSocketServer::disablePerMessageDeflate() + { + _enablePerMessageDeflate = false; + } + void WebSocketServer::setOnConnectionCallback(const OnConnectionCallback& callback) { _onConnectionCallback = callback; @@ -73,9 +79,18 @@ namespace ix webSocket->disableAutomaticReconnection(); if (_enablePong) + { webSocket->enablePong(); + } else + { webSocket->disablePong(); + } + + if (!_enablePerMessageDeflate) + { + webSocket->disablePerMessageDeflate(); + } // Add this client to our client set { diff --git a/ixwebsocket/IXWebSocketServer.h b/ixwebsocket/IXWebSocketServer.h index c7f96469..dab0172f 100644 --- a/ixwebsocket/IXWebSocketServer.h +++ b/ixwebsocket/IXWebSocketServer.h @@ -36,6 +36,7 @@ namespace ix void enablePong(); void disablePong(); + void disablePerMessageDeflate(); void setOnConnectionCallback(const OnConnectionCallback& callback); @@ -48,6 +49,7 @@ namespace ix // Member variables int _handshakeTimeoutSecs; bool _enablePong; + bool _enablePerMessageDeflate; OnConnectionCallback _onConnectionCallback; diff --git a/ixwebsocket/IXWebSocketVersion.h b/ixwebsocket/IXWebSocketVersion.h index b31f98cc..af24d5e7 100644 --- a/ixwebsocket/IXWebSocketVersion.h +++ b/ixwebsocket/IXWebSocketVersion.h @@ -6,4 +6,4 @@ #pragma once -#define IX_WEBSOCKET_VERSION "8.1.1" +#define IX_WEBSOCKET_VERSION "8.1.2" diff --git a/ws/ws.cpp b/ws/ws.cpp index ccc0bcee..05c57e73 100644 --- a/ws/ws.cpp +++ b/ws/ws.cpp @@ -174,6 +174,7 @@ int main(int argc, char** argv) echoServerApp->add_option("--host", hostname, "Hostname"); echoServerApp->add_flag("-g", greetings, "Verbose"); echoServerApp->add_flag("-6", ipv6, "IpV6"); + echoServerApp->add_flag("-x", disablePerMessageDeflate, "Disable per message deflate"); addTLSOptions(echoServerApp); CLI::App* broadcastServerApp = app.add_subcommand("broadcast_server", "Broadcasting server"); @@ -336,8 +337,12 @@ int main(int argc, char** argv) addTLSOptions(proxyServerApp); CLI::App* minidumpApp = app.add_subcommand("upload_minidump", "Upload a minidump to sentry"); - minidumpApp->add_option("--minidump", minidump, "Minidump path")->required()->check(CLI::ExistingPath); - minidumpApp->add_option("--metadata", metadata, "Metadata path")->required()->check(CLI::ExistingPath); + minidumpApp->add_option("--minidump", minidump, "Minidump path") + ->required() + ->check(CLI::ExistingPath); + minidumpApp->add_option("--metadata", metadata, "Metadata path") + ->required() + ->check(CLI::ExistingPath); minidumpApp->add_option("--project", project, "Sentry Project")->required(); minidumpApp->add_option("--key", key, "Sentry Key")->required(); minidumpApp->add_flag("-v", verbose, "Verbose"); @@ -394,7 +399,8 @@ int main(int argc, char** argv) } else if (app.got_subcommand("echo_server")) { - ret = ix::ws_echo_server_main(port, greetings, hostname, tlsOptions, ipv6); + ret = ix::ws_echo_server_main( + port, greetings, hostname, tlsOptions, ipv6, disablePerMessageDeflate); } else if (app.got_subcommand("broadcast_server")) { diff --git a/ws/ws.h b/ws/ws.h index 7fc2501d..007793fa 100644 --- a/ws/ws.h +++ b/ws/ws.h @@ -30,7 +30,8 @@ namespace ix bool greetings, const std::string& hostname, const ix::SocketTLSOptions& tlsOptions, - bool ipv6); + bool ipv6, + bool disablePerMessageDeflate); int ws_broadcast_server_main(int port, const std::string& hostname, diff --git a/ws/ws_dns_lookup.cpp b/ws/ws_dns_lookup.cpp index b97e496f..e0bb3d5c 100644 --- a/ws/ws_dns_lookup.cpp +++ b/ws/ws_dns_lookup.cpp @@ -5,10 +5,10 @@ */ #include +#include +#include #include #include -#include -#include namespace ix diff --git a/ws/ws_echo_server.cpp b/ws/ws_echo_server.cpp index 8abb0d4c..37bb87fc 100644 --- a/ws/ws_echo_server.cpp +++ b/ws/ws_echo_server.cpp @@ -4,8 +4,8 @@ * Copyright (c) 2018 Machine Zone, Inc. All rights reserved. */ -#include #include +#include #include #include @@ -15,7 +15,8 @@ namespace ix bool greetings, const std::string& hostname, const ix::SocketTLSOptions& tlsOptions, - bool ipv6) + bool ipv6, + bool disablePerMessageDeflate) { spdlog::info("Listening on {}:{}", hostname, port); @@ -28,6 +29,12 @@ namespace ix server.setTLSOptions(tlsOptions); + if (disablePerMessageDeflate) + { + spdlog::info("Disable per message deflate"); + server.disablePerMessageDeflate(); + } + server.setOnConnectionCallback( [greetings](std::shared_ptr webSocket, std::shared_ptr connectionState) {