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 << "TestHeader2: test2\r\n";
stream << "TestHeader3:test3a\r\n"; stream << "TestHeader3:test3a\r\n";
stream << "TestHeader3:test3b\r\n"; stream << "TestHeader3:test3b\r\n";
stream << "TestHeader4:\r\n";
stream << "TestHeader5: \r\n";
stream << "TestHeader6: \r\n";
stream << "\r\n"; stream << "\r\n";
assert(ResponseMessage::parse(response->content, response->http_version, response->status_code, response->header)); 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->http_version == "1.1");
assert(response->status_code == "200 OK"); assert(response->status_code == "200 OK");
assert(response->header.size() == 4); assert(response->header.size() == 7);
auto header_it = response->header.find("TestHeader"); auto header_it = response->header.find("TestHeader");
assert(header_it != response->header.end() && header_it->second == "test"); assert(header_it != response->header.end() && header_it->second == "test");
header_it = response->header.find("TestHeader2"); header_it = response->header.find("TestHeader2");
@ -105,6 +108,13 @@ public:
assert(range.first != response->header.end() && range.second != response->header.end() && assert(range.first != response->header.end() && range.second != response->header.end() &&
((first->second == "test3a" && second->second == "test3b") || ((first->second == "test3a" && second->second == "test3b") ||
(first->second == "test3b" && second->second == "test3a"))); (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; std::size_t param_end;
while((param_end = line.find(':')) != std::string::npos) { while((param_end = line.find(':')) != std::string::npos) {
std::size_t value_start = param_end + 1; std::size_t value_start = param_end + 1;
if(value_start < line.size()) { while(value_start + 1 < line.size() && line[value_start] == ' ')
if(line[value_start] == ' ') ++value_start;
value_start++;
if(value_start < line.size()) if(value_start < line.size())
result.emplace(line.substr(0, param_end), line.substr(value_start, line.size() - value_start - 1)); result.emplace(line.substr(0, param_end), line.substr(value_start, line.size() - value_start - 1));
}
getline(stream, line); getline(stream, line);
} }