From ad94175cbd086ad29ff95965a3c0d38fbee82517 Mon Sep 17 00:00:00 2001 From: flagarde Date: Thu, 28 May 2026 21:24:35 +0800 Subject: [PATCH 1/3] fix parseHttpHeaders for not conforming servers --- ixwebsocket/IXWebSocketHttpHeaders.cpp | 29 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/ixwebsocket/IXWebSocketHttpHeaders.cpp b/ixwebsocket/IXWebSocketHttpHeaders.cpp index c6fbbf19..91834898 100644 --- a/ixwebsocket/IXWebSocketHttpHeaders.cpp +++ b/ixwebsocket/IXWebSocketHttpHeaders.cpp @@ -17,34 +17,43 @@ namespace ix WebSocketHttpHeaders headers; char line[1024]; - int i; while (true) { - int colon = 0; - - for (i = 0; i < 2 || (i < 1023 && line[i - 2] != '\r' && line[i - 1] != '\n'); ++i) + std::size_t i{0}; + int colon = -1; + for(i=0;i<1023;++i) { if (!socket->readByte(line + i, isCancellationRequested)) { return std::make_pair(false, headers); } - - if (line[i] == ':' && colon == 0) + if (line[i] == ':' && colon == -1) { - colon = i; + colon = static_cast(i); + } + if(line[i] == '\n') + { + ++i; + break; } } - if (line[0] == '\r' && line[1] == '\n') + if((i == 2 && line[0] == '\r' && line[1] == '\n') || (i == 1 && line[0] == '\n')) { break; } - + // strip all \n \r + std::size_t end = i; + auto rbegin = std::make_reverse_iterator(line + end); + auto rend = std::make_reverse_iterator(line); + auto it = std::find_if(rbegin,rend,[](const unsigned char c){return c != '\r' && c != '\n'; }); + end = static_cast(it.base() - line); + line[end] = '\0'; + // line is a single header entry. split by ':', and add it to our // header map. ignore lines with no colon. if (colon > 0) { - line[i] = '\0'; std::string lineStr(line); int start = colon + 1; From 6ef1ca0fd2efbee2ec949968927412ed1c358340 Mon Sep 17 00:00:00 2001 From: flagarde Date: Thu, 28 May 2026 21:29:35 +0800 Subject: [PATCH 2/3] fix --- ixwebsocket/IXWebSocketHttpHeaders.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ixwebsocket/IXWebSocketHttpHeaders.cpp b/ixwebsocket/IXWebSocketHttpHeaders.cpp index 91834898..931320dd 100644 --- a/ixwebsocket/IXWebSocketHttpHeaders.cpp +++ b/ixwebsocket/IXWebSocketHttpHeaders.cpp @@ -44,12 +44,12 @@ namespace ix } // strip all \n \r std::size_t end = i; - auto rbegin = std::make_reverse_iterator(line + end); - auto rend = std::make_reverse_iterator(line); + auto rbegin = std::reverse_iterator(line + end); + auto rend = std::reverse_iterator(line); auto it = std::find_if(rbegin,rend,[](const unsigned char c){return c != '\r' && c != '\n'; }); end = static_cast(it.base() - line); line[end] = '\0'; - + // line is a single header entry. split by ':', and add it to our // header map. ignore lines with no colon. if (colon > 0) From ce2dcbdca257b19e4cbb8ddae0bd16e13dccd34b Mon Sep 17 00:00:00 2001 From: flagarde Date: Thu, 28 May 2026 21:59:25 +0800 Subject: [PATCH 3/3] Fix reverse_iterator template usage for char* --- ixwebsocket/IXWebSocketHttpHeaders.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ixwebsocket/IXWebSocketHttpHeaders.cpp b/ixwebsocket/IXWebSocketHttpHeaders.cpp index 931320dd..497de0ee 100644 --- a/ixwebsocket/IXWebSocketHttpHeaders.cpp +++ b/ixwebsocket/IXWebSocketHttpHeaders.cpp @@ -44,8 +44,8 @@ namespace ix } // strip all \n \r std::size_t end = i; - auto rbegin = std::reverse_iterator(line + end); - auto rend = std::reverse_iterator(line); + auto rbegin = std::reverse_iterator(line + end); + auto rend = std::reverse_iterator(line); auto it = std::find_if(rbegin,rend,[](const unsigned char c){return c != '\r' && c != '\n'; }); end = static_cast(it.base() - line); line[end] = '\0';