Fixes #203: header field values are now correctly parsed even with more than 1 space after :

This commit is contained in:
eidheim 2018-01-24 13:04:06 +01:00
commit fb4a17d5ed
2 changed files with 16 additions and 8 deletions

View file

@ -80,6 +80,9 @@ public:
stream << "TestHeader2: test2\r\n";
stream << "TestHeader3:test3a\r\n";
stream << "TestHeader3:test3b\r\n";
stream << "TestHeader4:\r\n";
stream << "TestHeader5: \r\n";
stream << "TestHeader6: \r\n";
stream << "\r\n";
assert(ResponseMessage::parse(response->content, response->http_version, response->status_code, response->header));
@ -87,7 +90,7 @@ public:
assert(response->http_version == "1.1");
assert(response->status_code == "200 OK");
assert(response->header.size() == 4);
assert(response->header.size() == 7);
auto header_it = response->header.find("TestHeader");
assert(header_it != response->header.end() && header_it->second == "test");
header_it = response->header.find("TestHeader2");
@ -105,6 +108,13 @@ public:
assert(range.first != response->header.end() && range.second != response->header.end() &&
((first->second == "test3a" && second->second == "test3b") ||
(first->second == "test3b" && second->second == "test3a")));
header_it = response->header.find("TestHeader4");
assert(header_it != response->header.end() && header_it->second == "");
header_it = response->header.find("TestHeader5");
assert(header_it != response->header.end() && header_it->second == "");
header_it = response->header.find("TestHeader6");
assert(header_it != response->header.end() && header_it->second == "");
}
};

View file

@ -142,12 +142,10 @@ namespace SimpleWeb {
std::size_t param_end;
while((param_end = line.find(':')) != std::string::npos) {
std::size_t value_start = param_end + 1;
if(value_start < line.size()) {
if(line[value_start] == ' ')
value_start++;
while(value_start + 1 < line.size() && line[value_start] == ' ')
++value_start;
if(value_start < line.size())
result.emplace(line.substr(0, param_end), line.substr(value_start, line.size() - value_start - 1));
}
getline(stream, line);
}