Cleanup of parse_query_string and fixed a potential segmentation fault
This commit is contained in:
parent
ba4eec7ebe
commit
d553ca7a89
1 changed files with 12 additions and 4 deletions
16
utility.hpp
16
utility.hpp
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef SIMPLE_WEB_SERVER_UTILITY_HPP
|
#ifndef SIMPLE_WEB_SERVER_UTILITY_HPP
|
||||||
#define SIMPLE_WEB_SERVER_UTILITY_HPP
|
#define SIMPLE_WEB_SERVER_UTILITY_HPP
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
|
|
@ -79,11 +80,11 @@ inline CaseInsensitiveMultimap parse_query_string(const std::string &query_strin
|
||||||
size_t parameter_pos = 0;
|
size_t parameter_pos = 0;
|
||||||
size_t parameter_end_pos = -1;
|
size_t parameter_end_pos = -1;
|
||||||
size_t value_pos = -1;
|
size_t value_pos = -1;
|
||||||
for(size_t c = 0; c < query_string.size() + 1; ++c) {
|
for(size_t c = 0; c < query_string.size(); ++c) {
|
||||||
if(query_string[c] == '&' || c == query_string.size()) {
|
if(query_string[c] == '&') {
|
||||||
auto parameter = query_string.substr(parameter_pos, (parameter_end_pos == static_cast<size_t>(-1) ? c : parameter_end_pos) - parameter_pos);
|
auto parameter = query_string.substr(parameter_pos, (parameter_end_pos == std::string::npos ? c : parameter_end_pos) - parameter_pos);
|
||||||
if(!parameter.empty()) {
|
if(!parameter.empty()) {
|
||||||
auto value = value_pos == static_cast<size_t>(-1) ? std::string() : query_string.substr(value_pos, c - value_pos);
|
auto value = value_pos == std::string::npos ? std::string() : query_string.substr(value_pos, c - value_pos);
|
||||||
result.emplace(std::move(parameter), Percent::decode(value));
|
result.emplace(std::move(parameter), Percent::decode(value));
|
||||||
}
|
}
|
||||||
parameter_pos = c + 1;
|
parameter_pos = c + 1;
|
||||||
|
|
@ -95,6 +96,13 @@ inline CaseInsensitiveMultimap parse_query_string(const std::string &query_strin
|
||||||
value_pos = c + 1;
|
value_pos = c + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(parameter_pos < query_string.size()) {
|
||||||
|
auto parameter = query_string.substr(parameter_pos, parameter_end_pos - parameter_pos);
|
||||||
|
if(!parameter.empty()) {
|
||||||
|
auto value = value_pos >= query_string.size() ? std::string() : query_string.substr(value_pos);
|
||||||
|
result.emplace(std::move(parameter), Percent::decode(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue