@@ -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