vector<string> ret;
string current_token;
+ bool in_quote = false;
+
for (size_t i = 0; i < line.size(); ++i) {
- if (isspace(line[i])) {
+ // Handle all escaped characters.
+ if (line[i] == '\\' && i < line.size() - 1) {
+ current_token.push_back(line[++i]);
+ continue;
+ }
+
+ // Handle start and end quote.
+ if (line[i] == '"') {
+ in_quote = !in_quote;
+ continue;
+ }
+
+ // Handle break.
+ if (isspace(line[i]) && !in_quote) {
if (!current_token.empty()) {
ret.push_back(current_token);
}
return ret;
}
-multimap<string, string> extract_headers(const vector<string> &lines, const string &log_context)
+HTTPHeaderMultimap extract_headers(const vector<string> &lines, const string &log_context)
{
- multimap<string, string> parameters;
+ HTTPHeaderMultimap parameters;
for (size_t i = 1; i < lines.size(); ++i) {
size_t split = lines[i].find(":");
if (split == string::npos) {