From 866670a906d942eb1f5e5a817e86df647a689d0c Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Mon, 16 Nov 2020 08:41:08 -0800 Subject: [PATCH] (ixwebsocket) Fix #252 / regression in 11.0.2 with string comparisons --- docs/CHANGELOG.md | 4 +++ ixwebsocket/IXNetSystem.cpp | 18 +++++++++++ ixwebsocket/IXWebSocketHandshake.cpp | 4 +-- ixwebsocket/IXWebSocketVersion.h | 2 +- test/CMakeLists.txt | 5 ++- test/IXStrCaseCompareTest.cpp | 46 ++++++++++++++++++++++++++++ 6 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 test/IXStrCaseCompareTest.cpp diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e934b362..ddc608d9 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,10 @@ All changes to this project will be documented in this file. +## [11.0.3] - 2020-11-16 + +(ixwebsocket) Fix #252 / regression in 11.0.2 with string comparisons + ## [11.0.2] - 2020-11-15 (ixwebsocket) use a C++11 compatible make_unique shim diff --git a/ixwebsocket/IXNetSystem.cpp b/ixwebsocket/IXNetSystem.cpp index 195d1294..c7d45adc 100644 --- a/ixwebsocket/IXNetSystem.cpp +++ b/ixwebsocket/IXNetSystem.cpp @@ -105,6 +105,24 @@ namespace ix return ret; #else + // + // It was reported that on Android poll can fail and return -1 with + // errno == EINTR, which should be a temp error and should typically + // be handled by retrying in a loop. + // Maybe we need to put all syscall / C functions in + // a new IXSysCalls.cpp and wrap them all. + // + // The style from libuv is as such. + // + // int ret = -1; + // do + // { + // ret = ::poll(fds, nfds, timeout); + // } + // while (ret == -1 && errno == EINTR); + // return ret; + // + return ::poll(fds, nfds, timeout); #endif } diff --git a/ixwebsocket/IXWebSocketHandshake.cpp b/ixwebsocket/IXWebSocketHandshake.cpp index 0e0b0546..51497630 100644 --- a/ixwebsocket/IXWebSocketHandshake.cpp +++ b/ixwebsocket/IXWebSocketHandshake.cpp @@ -8,10 +8,10 @@ #include "IXHttp.h" #include "IXSocketConnect.h" +#include "IXStrCaseCompare.h" #include "IXUrlParser.h" #include "IXUserAgent.h" #include "IXWebSocketHandshakeKeyGen.h" -#include "IXStrCaseCompare.h" #include #include #include @@ -36,7 +36,7 @@ namespace ix bool WebSocketHandshake::insensitiveStringCompare(const std::string& a, const std::string& b) { - return CaseInsensitiveLess::cmp(a, b); + return CaseInsensitiveLess::cmp(a, b) == 0; } std::string WebSocketHandshake::genRandomString(const int len) diff --git a/ixwebsocket/IXWebSocketVersion.h b/ixwebsocket/IXWebSocketVersion.h index a7e75df7..0f2f88cc 100644 --- a/ixwebsocket/IXWebSocketVersion.h +++ b/ixwebsocket/IXWebSocketVersion.h @@ -6,4 +6,4 @@ #pragma once -#define IX_WEBSOCKET_VERSION "11.0.2" +#define IX_WEBSOCKET_VERSION "11.0.3" diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1a476411..0a3fde4c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -13,7 +13,6 @@ option(USE_TLS "Add TLS support" ON) set (TEST_TARGET_NAMES IXSocketTest IXSocketConnectTest - # IXWebSocketLeakTest.cpp # commented until we have a fix for #224 IXWebSocketServerTest IXWebSocketTestConnectionDisconnection IXUrlParserTest @@ -28,6 +27,7 @@ set (TEST_TARGET_NAMES IXWebSocketBroadcastTest IXWebSocketPerMessageDeflateCompressorTest IXStreamSqlTest + IXStrCaseCompareTest ) # Some unittest don't work on windows yet @@ -47,6 +47,9 @@ endif() # IXWebSocketPingTest.cpp # IXWebSocketPingTimeoutTest.cpp +# IXWebSocketLeakTest.cpp # commented until we have a fix for #224 / +# that was was fixed but now the test does not compile + # Disable tests for now that are failing or not reliable find_package(JsonCpp) diff --git a/test/IXStrCaseCompareTest.cpp b/test/IXStrCaseCompareTest.cpp new file mode 100644 index 00000000..2db994a2 --- /dev/null +++ b/test/IXStrCaseCompareTest.cpp @@ -0,0 +1,46 @@ +/* + * IXStrCaseCompareTest.cpp + * Author: Benjamin Sergeant + * Copyright (c) 2020 Machine Zone. All rights reserved. + */ + +#include "IXTest.h" +#include "catch.hpp" +#include +#include +#include + +using namespace ix; + +namespace ix +{ + TEST_CASE("str_case_compare", "[str_case_compare]") + { + SECTION("1") + { + using HttpHeaders = std::map; + + HttpHeaders httpHeaders; + + httpHeaders["foo"] = "foo"; + + REQUIRE(httpHeaders["foo"] == "foo"); + REQUIRE(httpHeaders["missing"] == ""); + + // Comparison should be case insensitive + REQUIRE(httpHeaders["Foo"] == "foo"); + } + + SECTION("2") + { + using HttpHeaders = std::map; + + HttpHeaders headers; + + headers["Upgrade"] = "webSocket"; + + REQUIRE(CaseInsensitiveLess::cmp(headers["upgrade"], "WebSocket") == 0); + } + } + +} // namespace ix