Added Percent::encode

This commit is contained in:
eidheim 2017-06-25 14:32:38 +02:00
commit 1d9e900f44
2 changed files with 24 additions and 0 deletions

View file

@ -119,6 +119,11 @@ int main() {
assert(hash("tesT")==hash("test"));
assert(hash("test")!=hash("tset"));
auto percent_decoded="testing æøå !#$&'()*+,/:;=?@[]";
auto percent_encoded="testing+æøå+%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D";
assert(Percent::encode(percent_decoded)==percent_encoded);
assert(Percent::decode(Percent::encode(percent_decoded))==percent_decoded);
ServerTest serverTest;
serverTest.io_service=std::make_shared<asio::io_service>();

View file

@ -50,8 +50,27 @@ typedef std::unordered_multimap<std::string, std::string, CaseInsensitiveHash, C
/// Percent encoding and decoding
class Percent {
public:
static std::string encode(const std::string &value) {
static auto hex_chars = "0123456789ABCDEF";
std::string result;
result.reserve(value.size()); // minimum size of result
for(auto &chr : value) {
if(chr == ' ')
result += '+';
else if(chr == '!' || chr == '#' || chr == '$' || (chr >= '&' && chr <= ',') || (chr >= '/' && chr <= ';') || chr == '=' || chr=='?' || chr == '@' || chr == '[' || chr == ']')
result += std::string("%") + hex_chars[chr >> 4] + hex_chars[chr & 15];
else
result += chr;
}
return result;
}
static std::string decode(const std::string &value) {
std::string result;
result.reserve((value.size() + 2) / 3); // minimum size of result
for(size_t i = 0; i < value.size(); ++i) {
auto &chr = value[i];