From 32525c1566696b4a200d72209ed87b67086bbf69 Mon Sep 17 00:00:00 2001 From: neru Date: Sat, 11 Apr 2026 12:21:43 -0300 Subject: [PATCH] fix: header matching issues --- src/unlocker/proxy.cpp | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/unlocker/proxy.cpp b/src/unlocker/proxy.cpp index 1e5aa40..a5a828b 100644 --- a/src/unlocker/proxy.cpp +++ b/src/unlocker/proxy.cpp @@ -55,7 +55,6 @@ void removeHeader(std::string& headers, const std::string& key) std::string keyLower = key; std::transform(keyLower.begin(), keyLower.end(), keyLower.begin(), ::tolower); - if (keyLower.back() != ':') keyLower += ':'; while ((end = headers.find('\n', start)) != std::string::npos) { @@ -63,7 +62,16 @@ void removeHeader(std::string& headers, const std::string& key) std::string lineLower = line; std::transform(lineLower.begin(), lineLower.end(), lineLower.begin(), ::tolower); - if (lineLower.compare(0, keyLower.length(), keyLower) != 0) result += line; + bool match = false; + if (lineLower.compare(0, keyLower.length(), keyLower) == 0) + { + size_t pos = keyLower.length(); + while (pos < lineLower.length() && (lineLower[pos] == ' ' || lineLower[pos] == '\t')) + pos++; + if (pos < lineLower.length() && lineLower[pos] == ':') match = true; + } + + if (!match) result += line; start = end + 1; } @@ -72,7 +80,16 @@ void removeHeader(std::string& headers, const std::string& key) { std::string line = headers.substr(start); std::string lineLower = line; - if (lineLower.compare(0, keyLower.length(), keyLower) != 0) result += line; + std::transform(lineLower.begin(), lineLower.end(), lineLower.begin(), ::tolower); + bool match = false; + if (lineLower.compare(0, keyLower.length(), keyLower) == 0) + { + size_t pos = keyLower.length(); + while (pos < lineLower.length() && (lineLower[pos] == ' ' || lineLower[pos] == '\t')) + pos++; + if (pos < lineLower.length() && lineLower[pos] == ':') match = true; + } + if (!match) result += line; } headers = std::move(result); @@ -86,7 +103,6 @@ std::string getHeaderValue(const std::string& headers, const std::string& key) std::string keyLower = key; std::transform(keyLower.begin(), keyLower.end(), keyLower.begin(), ::tolower); if (keyLower.empty()) return ""; - if (keyLower.back() != ':') keyLower += ':'; while (start < headers.length()) { @@ -98,14 +114,20 @@ std::string getHeaderValue(const std::string& headers, const std::string& key) if (lineLower.compare(0, keyLower.length(), keyLower) == 0) { - size_t valueStart = keyLower.length(); - while (valueStart < line.length() && (line[valueStart] == ' ' || line[valueStart] == '\t')) - valueStart++; + size_t pos = keyLower.length(); + while (pos < lineLower.length() && (lineLower[pos] == ' ' || lineLower[pos] == '\t')) + pos++; + if (pos < lineLower.length() && lineLower[pos] == ':') + { + size_t valueStart = pos + 1; + while (valueStart < line.length() && (line[valueStart] == ' ' || line[valueStart] == '\t')) + valueStart++; - size_t valueEnd = line.length(); - if (valueEnd > valueStart && line[valueEnd - 1] == '\r') valueEnd--; + size_t valueEnd = line.length(); + if (valueEnd > valueStart && line[valueEnd - 1] == '\r') valueEnd--; - return line.substr(valueStart, valueEnd - valueStart); + return line.substr(valueStart, valueEnd - valueStart); + } } if (end == std::string::npos) break;