From a4dd2e64448de2a5468a5ed4ebc2102ee064cc58 Mon Sep 17 00:00:00 2001 From: ProTrack Date: Sun, 5 Feb 2017 16:01:00 +0200 Subject: [PATCH 1/3] Added query string parsing and member to request --- server_http.hpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/server_http.hpp b/server_http.hpp index 4045708..1013bb2 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -107,6 +107,7 @@ namespace SimpleWeb { Content content; std::unordered_multimap header; + std::unordered_multimap query_string; REGEX_NS::smatch path_match; @@ -320,6 +321,24 @@ namespace SimpleWeb { request->method=line.substr(0, method_end); request->path=line.substr(method_end+1, path_end-method_end-1); + //search and populte query_string + size_t qs_start; + if ((qs_start = request->path.find('?')) != std::string::npos) + { + string qs = request->path.substr(qs_start, request->path.size() - qs_start - 1); + REGEX_NS::regex pattern("([\\w+%]+)=?([^&]*)"); + int submatches[] = { 1, 2 }; + auto qs_begin = REGEX_NS::sregex_token_iterator(qs.begin(), qs.end(), pattern, submatches); + auto qs_end = REGEX_NS::sregex_token_iterator(); + + for (auto i = qs_begin; i != qs_end; i++) + { + string key = i->str(); + string value = (++i)->str(); + request->query_string.emplace(std::make_pair(key, value)); + } + } + size_t protocol_end; if((protocol_end=line.find('/', path_end+1))!=std::string::npos) { if(line.compare(path_end+1, protocol_end-path_end-1, "HTTP")!=0) From d554c13db542a357ec97d68a655cb9b71ea8bbcf Mon Sep 17 00:00:00 2001 From: ProTrack Date: Sun, 5 Feb 2017 16:19:42 +0200 Subject: [PATCH 2/3] Travis CI build failed --- server_http.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server_http.hpp b/server_http.hpp index 1013bb2..f27fa33 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -325,7 +325,7 @@ namespace SimpleWeb { size_t qs_start; if ((qs_start = request->path.find('?')) != std::string::npos) { - string qs = request->path.substr(qs_start, request->path.size() - qs_start - 1); + std::string qs = request->path.substr(qs_start, request->path.size() - qs_start - 1); REGEX_NS::regex pattern("([\\w+%]+)=?([^&]*)"); int submatches[] = { 1, 2 }; auto qs_begin = REGEX_NS::sregex_token_iterator(qs.begin(), qs.end(), pattern, submatches); @@ -333,8 +333,8 @@ namespace SimpleWeb { for (auto i = qs_begin; i != qs_end; i++) { - string key = i->str(); - string value = (++i)->str(); + std::string key = i->str(); + std::string value = (++i)->str(); request->query_string.emplace(std::make_pair(key, value)); } } From e585a7a5bc9084fd587a2dbdad652dadc14adc39 Mon Sep 17 00:00:00 2001 From: ProTrack Date: Mon, 27 Feb 2017 10:13:33 +0200 Subject: [PATCH 3/3] If query string is present then cut it from the reqeust path so find resource won't fail --- server_http.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server_http.hpp b/server_http.hpp index f27fa33..2ec427a 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -331,12 +331,13 @@ namespace SimpleWeb { auto qs_begin = REGEX_NS::sregex_token_iterator(qs.begin(), qs.end(), pattern, submatches); auto qs_end = REGEX_NS::sregex_token_iterator(); - for (auto i = qs_begin; i != qs_end; i++) + for (auto it = qs_begin; it != qs_end; it++) { - std::string key = i->str(); - std::string value = (++i)->str(); + std::string key = it->str(); + std::string value = (++it)->str(); request->query_string.emplace(std::make_pair(key, value)); } + request->path = request->path.substr(0, qs_start); } size_t protocol_end;