fix: header matching issues

This commit is contained in:
2026-04-11 12:21:43 -03:00
parent 75171b4557
commit 32525c1566
+32 -10
View File
@@ -55,7 +55,6 @@ void removeHeader(std::string& headers, const std::string& key)
std::string keyLower = key; std::string keyLower = key;
std::transform(keyLower.begin(), keyLower.end(), keyLower.begin(), ::tolower); std::transform(keyLower.begin(), keyLower.end(), keyLower.begin(), ::tolower);
if (keyLower.back() != ':') keyLower += ':';
while ((end = headers.find('\n', start)) != std::string::npos) 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::string lineLower = line;
std::transform(lineLower.begin(), lineLower.end(), lineLower.begin(), ::tolower); 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; start = end + 1;
} }
@@ -72,7 +80,16 @@ void removeHeader(std::string& headers, const std::string& key)
{ {
std::string line = headers.substr(start); std::string line = headers.substr(start);
std::string lineLower = line; 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); headers = std::move(result);
@@ -86,7 +103,6 @@ std::string getHeaderValue(const std::string& headers, const std::string& key)
std::string keyLower = key; std::string keyLower = key;
std::transform(keyLower.begin(), keyLower.end(), keyLower.begin(), ::tolower); std::transform(keyLower.begin(), keyLower.end(), keyLower.begin(), ::tolower);
if (keyLower.empty()) return ""; if (keyLower.empty()) return "";
if (keyLower.back() != ':') keyLower += ':';
while (start < headers.length()) 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) if (lineLower.compare(0, keyLower.length(), keyLower) == 0)
{ {
size_t valueStart = keyLower.length(); size_t pos = keyLower.length();
while (valueStart < line.length() && (line[valueStart] == ' ' || line[valueStart] == '\t')) while (pos < lineLower.length() && (lineLower[pos] == ' ' || lineLower[pos] == '\t'))
valueStart++; 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(); size_t valueEnd = line.length();
if (valueEnd > valueStart && line[valueEnd - 1] == '\r') valueEnd--; 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; if (end == std::string::npos) break;