Skip to content

Commit 588bb65

Browse files
committed
Use string_view in CookieParser::before_handle parsing
1 parent 584560f commit 588bb65

1 file changed

Lines changed: 43 additions & 20 deletions

File tree

include/crow/middlewares/cookie_parser.h

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,7 @@ namespace crow
231231

232232
void before_handle(request& req, response& res, context& ctx)
233233
{
234-
// TODO(dranikpg): remove copies, use string_view with c++17
235-
int count = req.headers.count("Cookie");
234+
const int count = req.headers.count("Cookie");
236235
if (!count)
237236
return;
238237
if (count > 1)
@@ -241,34 +240,58 @@ namespace crow
241240
res.end();
242241
return;
243242
}
244-
std::string cookies = req.get_header_value("Cookie");
243+
244+
const std::string_view cookies_sv = req.get_header_value("Cookie");
245+
246+
auto trim_sv = [](const std::string_view sv) -> std::string_view {
247+
const size_t first = sv.find_first_not_of(" \t\n\r\f\v"); // same as isspace
248+
if (std::string_view::npos == first) {
249+
return sv.substr(0, 0);
250+
}
251+
const size_t last = sv.find_last_not_of(" \t\n\r\f\v");
252+
return sv.substr(first, (last - first + 1));
253+
};
254+
245255
size_t pos = 0;
246-
while (pos < cookies.size())
256+
while (pos < cookies_sv.size())
247257
{
248-
size_t pos_equal = cookies.find('=', pos);
249-
if (pos_equal == cookies.npos)
258+
const size_t pos_equal = cookies_sv.find('=', pos);
259+
if (pos_equal == std::string_view::npos) {
250260
break;
251-
std::string name = cookies.substr(pos, pos_equal - pos);
252-
name = utility::trim(name);
261+
}
262+
263+
std::string_view name_sv = cookies_sv.substr(pos, pos_equal - pos);
264+
name_sv = trim_sv(name_sv);
265+
253266
pos = pos_equal + 1;
254-
if (pos == cookies.size())
267+
if (pos == cookies_sv.size()) {
255268
break;
269+
}
256270

257-
size_t pos_semicolon = cookies.find(';', pos);
258-
std::string value = cookies.substr(pos, pos_semicolon - pos);
271+
const size_t pos_semicolon = cookies_sv.find(';', pos);
272+
std::string_view value_sv;
259273

260-
value = utility::trim(value);
261-
if (value[0] == '"' && value[value.size() - 1] == '"')
262-
{
263-
value = value.substr(1, value.size() - 2);
274+
if (pos_semicolon == std::string_view::npos) {
275+
value_sv = cookies_sv.substr(pos);
276+
pos = cookies_sv.size();
277+
} else {
278+
value_sv = cookies_sv.substr(pos, pos_semicolon - pos);
279+
pos = pos_semicolon + 1;
264280
}
265281

266-
ctx.jar.emplace(std::move(name), std::move(value));
282+
value_sv = trim_sv(value_sv);
267283

268-
pos = pos_semicolon;
269-
if (pos == cookies.npos)
270-
break;
271-
pos++;
284+
if (!value_sv.empty() && value_sv.front() == '"' && value_sv.back() == '"')
285+
{
286+
if (value_sv.size() >= 2) {
287+
value_sv.remove_prefix(1);
288+
value_sv.remove_suffix(1);
289+
} else {
290+
value_sv = value_sv.substr(0,0);
291+
}
292+
}
293+
294+
ctx.jar.emplace(std::string(name_sv), std::string(value_sv));
272295
}
273296
}
274297

0 commit comments

Comments
 (0)