Added query string parsing and member to request

This commit is contained in:
ProTrack 2017-02-05 16:01:00 +02:00
commit a4dd2e6444

View file

@ -107,6 +107,7 @@ namespace SimpleWeb {
Content content; Content content;
std::unordered_multimap<std::string, std::string, case_insensitive_hash, case_insensitive_equals> header; std::unordered_multimap<std::string, std::string, case_insensitive_hash, case_insensitive_equals> header;
std::unordered_multimap<std::string, std::string, case_insensitive_hash, case_insensitive_equals> query_string;
REGEX_NS::smatch path_match; REGEX_NS::smatch path_match;
@ -320,6 +321,24 @@ namespace SimpleWeb {
request->method=line.substr(0, method_end); request->method=line.substr(0, method_end);
request->path=line.substr(method_end+1, path_end-method_end-1); 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; size_t protocol_end;
if((protocol_end=line.find('/', path_end+1))!=std::string::npos) { if((protocol_end=line.find('/', path_end+1))!=std::string::npos) {
if(line.compare(path_end+1, protocol_end-path_end-1, "HTTP")!=0) if(line.compare(path_end+1, protocol_end-path_end-1, "HTTP")!=0)