From a40d6cfc36b60a9b96a0e0ef040b84046355d4f0 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 30 Aug 2011 15:14:58 +0000 Subject: [PATCH] url_encode/decode --- direct/src/plugin/wstring_encode.cxx | 103 +++++++++++++++++++++++++++ direct/src/plugin/wstring_encode.h | 6 ++ 2 files changed, 109 insertions(+) diff --git a/direct/src/plugin/wstring_encode.cxx b/direct/src/plugin/wstring_encode.cxx index eac97b18ed..ca81d74bed 100755 --- a/direct/src/plugin/wstring_encode.cxx +++ b/direct/src/plugin/wstring_encode.cxx @@ -14,6 +14,10 @@ #include "wstring_encode.h" +#include +#include +#include + #ifdef _WIN32 #include #endif // _WIN32 @@ -70,3 +74,102 @@ string_to_wstring(wstring &result, const string &source) { return success; } #endif // _WIN32 + +//////////////////////////////////////////////////////////////////// +// Function: parse_hexdigit +// Description: Parses a single hex digit. Returns true on success, +// false on failure. On success, fills result with the +// parsed value, an integer in the range 0..15. +//////////////////////////////////////////////////////////////////// +bool +parse_hexdigit(int &result, char digit) { + if (isdigit(digit)) { + result = digit - '0'; + return true; + } else if (isxdigit(digit)) { + result = tolower(digit) - 'a' + 10; + return true; + } + return false; +} + +//////////////////////////////////////////////////////////////////// +// Function: url_quote +// Description: Applies URL quoting to source and stores the result +// in result. +//////////////////////////////////////////////////////////////////// +void +url_quote(string &result, const string &source) { + ostringstream strm; + strm << hex << setfill('0'); + for (size_t p = 0; p < source.length(); ++p) { + if (source[p] < 0x20 || source[p] >= 0x7f) { + strm << "%" << setw(2) << (unsigned int)source[p]; + } else { + switch (source[p]) { + case ' ': + case '<': + case '>': + case '#': + case '%': + case '{': + case '}': + case '|': + case '\\': + case '^': + case '~': + case '[': + case ']': + case '`': + case ';': + case '?': + case ':': + case '@': + case '=': + case '&': + case '$': + strm << "%" << setw(2) << (unsigned int)source[p]; + break; + + default: + strm << (char)source[p]; + } + } + } + result = strm.str(); +} + +//////////////////////////////////////////////////////////////////// +// Function: url_unquote +// Description: Removes URL quoting from source and stores the result +// in result. +//////////////////////////////////////////////////////////////////// +void +url_unquote(string &result, const string &source) { + result = string(); + size_t p = 0; + while (p < source.length()) { + if (source[p] == '%') { + ++p; + int ch = 0; + if (p < source.length()) { + int digit; + if (parse_hexdigit(digit, source[p])) { + ch += (digit << 4); + } + ++p; + } + if (p < source.length()) { + int digit; + if (parse_hexdigit(digit, source[p])) { + ch += digit; + } + ++p; + } + result += (char)ch; + } else { + result += source[p]; + ++p; + } + } +} diff --git a/direct/src/plugin/wstring_encode.h b/direct/src/plugin/wstring_encode.h index 5d9fca9fc3..e9123d754f 100755 --- a/direct/src/plugin/wstring_encode.h +++ b/direct/src/plugin/wstring_encode.h @@ -37,6 +37,12 @@ inline ostream &operator << (ostream &out, const wstring &str) { #endif // _WIN32 +// Some handy functions for applying and removing URL escape codes, +// which are used to pass parameters safely to p3dCert on the command +// line. +void url_quote(string &result, const string &source); +void url_unquote(string &result, const string &source); + #endif