X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fcommon%2Furl_escape.cc;fp=src%2Fceph%2Fsrc%2Fcommon%2Furl_escape.cc;h=6580d28c6ea5db674f11356fb2d21be380be9324;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/common/url_escape.cc b/src/ceph/src/common/url_escape.cc new file mode 100644 index 0000000..6580d28 --- /dev/null +++ b/src/ceph/src/common/url_escape.cc @@ -0,0 +1,64 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "url_escape.h" + +#include +#include + +std::string url_escape(const std::string& s) +{ + std::string out; + for (auto c : s) { + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~' || + c == '/') { + out.push_back(c); + } else { + char t[4]; + snprintf(t, sizeof(t), "%%%02x", (int)(unsigned char)c); + out.append(t); + } + } + return out; +} + +std::string url_unescape(const std::string& s) +{ + std::string out; + const char *end = s.c_str() + s.size(); + for (const char *c = s.c_str(); c < end; ++c) { + switch (*c) { + case '%': + { + unsigned char v = 0; + for (unsigned i=0; i<2; ++i) { + ++c; + if (c >= end) { + std::ostringstream ss; + ss << "invalid escaped string at pos " << (c - s.c_str()) << " of '" + << s << "'"; + throw std::runtime_error(ss.str()); + } + v <<= 4; + if (*c >= '0' && *c <= '9') { + v += *c - '0'; + } else if (*c >= 'a' && *c <= 'f') { + v += *c - 'a' + 10; + } else if (*c >= 'A' && *c <= 'F') { + v += *c - 'A' + 10; + } else { + std::ostringstream ss; + ss << "invalid escaped string at pos " << (c - s.c_str()) << " of '" + << s << "'"; + throw std::runtime_error(ss.str()); + } + } + out.push_back(v); + } + break; + default: + out.push_back(*c); + } + } + return out; +}