diff options
Diffstat (limited to 'icespider/core')
-rw-r--r-- | icespider/core/xwwwFormUrlEncoded.cpp | 29 | ||||
-rw-r--r-- | icespider/core/xwwwFormUrlEncoded.h | 10 |
2 files changed, 24 insertions, 15 deletions
diff --git a/icespider/core/xwwwFormUrlEncoded.cpp b/icespider/core/xwwwFormUrlEncoded.cpp index 2a65137..655c839 100644 --- a/icespider/core/xwwwFormUrlEncoded.cpp +++ b/icespider/core/xwwwFormUrlEncoded.cpp @@ -4,6 +4,7 @@ #include <Ice/BuiltinSequences.h> namespace ba = boost::algorithm; +using namespace std::literals; extern long hextable[]; @@ -71,15 +72,17 @@ namespace IceSpider { }; std::string - XWwwFormUrlEncoded::urlencode(const std::string & s) + XWwwFormUrlEncoded::urlencode(const std::string_view & s) { return urlencode(s.begin(), s.end()); } inline char hexchar(char c) { return c < 10 ? '0' + c : 'a' - 10 + c; } + template<typename T> + inline char hexlookup(const T & i) { return hextable[(int)*i]; } std::string - XWwwFormUrlEncoded::urlencode(std::string::const_iterator i, std::string::const_iterator e) + XWwwFormUrlEncoded::urlencode(std::string_view::const_iterator i, std::string_view::const_iterator e) { std::string t; t.reserve(std::distance(i, e)); @@ -101,23 +104,29 @@ namespace IceSpider { } std::string - XWwwFormUrlEncoded::urldecode(std::string::const_iterator i, std::string::const_iterator e) + XWwwFormUrlEncoded::urldecode(std::string_view::const_iterator i, std::string_view::const_iterator e) { std::string t; t.reserve(std::distance(i, e)); while (i != e) { - if (*i == '+') t += ' '; - else if (*i == '%') { - t += (16 * hextable[(int)*++i]) + hextable[(int)*++i]; + switch (*i) { + case '+': + t += ' '; + break; + case '%': + t += (16 * hexlookup(i + 1)) + hexlookup(i + 2); + i += 2; + break; + default: + t += *i; } - else t += *i; ++i; } return t; } void - XWwwFormUrlEncoded::iterateVars(const KVh & h, ba::split_iterator<std::string::const_iterator> pi) + XWwwFormUrlEncoded::iterateVars(const KVh & h, ba::split_iterator<std::string_view::const_iterator> pi) { for (; pi != decltype(pi)(); ++pi) { auto eq = std::find(pi->begin(), pi->end(), '='); @@ -131,7 +140,7 @@ namespace IceSpider { } void - XWwwFormUrlEncoded::iterateVars(const std::string & input, const KVh & h, const std::string & split) + XWwwFormUrlEncoded::iterateVars(const std::string_view & input, const KVh & h, const std::string_view & split) { if (!input.empty()) { iterateVars(h, ba::make_split_iterator(input, ba::first_finder(split, ba::is_equal()))); @@ -141,7 +150,7 @@ namespace IceSpider { void XWwwFormUrlEncoded::iterateVars(const KVh & h) { - iterateVars(input, h, "&"); + iterateVars(input, h, "&"sv); } void diff --git a/icespider/core/xwwwFormUrlEncoded.h b/icespider/core/xwwwFormUrlEncoded.h index 4f6cdae..68f6480 100644 --- a/icespider/core/xwwwFormUrlEncoded.h +++ b/icespider/core/xwwwFormUrlEncoded.h @@ -13,14 +13,14 @@ namespace IceSpider { XWwwFormUrlEncoded(std::istream & in); void Deserialize(Slicer::ModelPartForRootPtr mp) override; - DLL_PUBLIC static void iterateVars(const std::string & input, const KVh & h, const std::string & split); + DLL_PUBLIC static void iterateVars(const std::string_view & input, const KVh & h, const std::string_view & split); - DLL_PUBLIC static std::string urldecode(std::string::const_iterator s, std::string::const_iterator); - DLL_PUBLIC static std::string urlencode(std::string::const_iterator s, std::string::const_iterator); - DLL_PUBLIC static std::string urlencode(const std::string & s); + DLL_PUBLIC static std::string urldecode(std::string_view::const_iterator s, std::string_view::const_iterator); + DLL_PUBLIC static std::string urlencode(std::string_view::const_iterator s, std::string_view::const_iterator); + DLL_PUBLIC static std::string urlencode(const std::string_view & s); private: - static inline void iterateVars(const KVh & h, boost::algorithm::split_iterator<std::string::const_iterator> pi); + static inline void iterateVars(const KVh & h, boost::algorithm::split_iterator<std::string_view::const_iterator> pi); void iterateVars(const KVh & h); |