diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2016-11-28 14:05:30 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2016-11-28 17:54:16 +0000 |
commit | d9001b43acf9a7b5bec41fc16dfabcd4c76daf6d (patch) | |
tree | a26e6458a3e42b761b2839d5930c4d0066835f19 /contrib/epee/include | |
parent | Merge pull request #1372 (diff) | |
download | monero-d9001b43acf9a7b5bec41fc16dfabcd4c76daf6d.tar.xz |
epee: add functions to convert from URL format (ie, %XX values)
Diffstat (limited to 'contrib/epee/include')
-rw-r--r-- | contrib/epee/include/net/http_client.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/contrib/epee/include/net/http_client.h b/contrib/epee/include/net/http_client.h index 3e8143738..336153384 100644 --- a/contrib/epee/include/net/http_client.h +++ b/contrib/epee/include/net/http_client.h @@ -156,6 +156,17 @@ using namespace std; return csTmp; } + static inline int get_index(const char *s, char c) { const char *ptr = (const char*)memchr(s, c, 16); return ptr ? ptr-s : -1; } + static inline + std::string hex_to_dec_2bytes(const char *s) + { + const char *hex = get_hex_vals(); + int i0 = get_index(hex, toupper(s[0])); + int i1 = get_index(hex, toupper(s[1])); + if (i0 < 0 || i1 < 0) + return std::string("%") + std::string(1, s[0]) + std::string(1, s[1]); + return std::string(1, i0 * 16 | i1); + } static inline std::string convert(char val) { @@ -180,6 +191,25 @@ using namespace std; return result; } + static inline std::string convert_from_url_format(const std::string& uri) + { + + std::string result; + + for(size_t i = 0; i!= uri.size(); i++) + { + if(uri[i] == '%' && i + 2 < uri.size()) + { + result += hex_to_dec_2bytes(uri.c_str() + i + 1); + i += 2; + } + else + result += uri[i]; + + } + + return result; + } static inline std::string convert_to_url_format_force_all(const std::string& uri) { |