From d9001b43acf9a7b5bec41fc16dfabcd4c76daf6d Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Mon, 28 Nov 2016 14:05:30 +0000 Subject: [PATCH] epee: add functions to convert from URL format (ie, %XX values) --- contrib/epee/include/net/http_client.h | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/contrib/epee/include/net/http_client.h b/contrib/epee/include/net/http_client.h index 3e814373..33615338 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) {