diff options
Diffstat (limited to 'src/util/string.cpp')
-rw-r--r-- | src/util/string.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/util/string.cpp b/src/util/string.cpp index 39a14598b..925d0ea35 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -21,8 +21,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "pointer.h" #include "numeric.h" +#include <sstream> +#include <iomanip> + #include "../sha1.h" #include "../base64.h" +#include "../hex.h" #include "../porting.h" std::wstring narrow_to_wide(const std::string& mbs) @@ -68,11 +72,40 @@ std::string translatePassword(std::string playername, std::wstring password) return pwd; } -size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata) { - std::ostringstream *stream = (std::ostringstream*)userdata; - size_t count = size * nmemb; - stream->write(ptr, count); - return count; +std::string urlencode(std::string str) +{ + // Encodes non-unreserved URI characters by a percent sign + // followed by two hex digits. See RFC 3986, section 2.3. + static const char url_hex_chars[] = "0123456789ABCDEF"; + std::ostringstream oss(std::ios::binary); + for (u32 i = 0; i < str.size(); i++) { + unsigned char c = str[i]; + if (isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') + oss << c; + else + oss << "%" + << url_hex_chars[(c & 0xf0) >> 4] + << url_hex_chars[c & 0x0f]; + } + return oss.str(); +} + +std::string urldecode(std::string str) +{ + // Inverse of urlencode + std::ostringstream oss(std::ios::binary); + for (u32 i = 0; i < str.size(); i++) { + unsigned char highvalue, lowvalue; + if (str[i] == '%' && + hex_digit_decode(str[i+1], highvalue) && + hex_digit_decode(str[i+2], lowvalue)) { + oss << (char) ((highvalue << 4) | lowvalue); + i += 2; + } + else + oss << str[i]; + } + return oss.str(); } u32 readFlagString(std::string str, FlagDesc *flagdesc) { |