+
+
+// encode everything but "a-zA-Z0-9_.-/" (see RFC2396)
+string HttpdChannel::urlEncode(string s) {
+ string r = "";
+
+ for ( int i = 0; i < (int)s.length(); i++ ) {
+ if ( isalnum(s[i]) || s[i] == '_' || s[i] == '.'
+ || s[i] == '-' || s[i] == '/' ) {
+ r += s[i];
+ } else {
+ char buf[16];
+ sprintf(buf, "%%%02X", (unsigned char)s[i]);
+ r += buf;
+ }
+ }
+ return r;
+}
+
+
+string HttpdChannel::urlDecode(string s) {
+ string r = "";
+ int max = s.length();
+ int a, b;
+
+ for ( int i = 0; i < max; i++ ) {
+ if ( s[i] == '+' ) {
+ r += ' ';
+ } else if ( s[i] == '%' && i + 2 < max
+ && isxdigit(s[i + 1])
+ && isxdigit(s[i + 2]) ) {
+ i++;
+ a = isdigit(s[i]) ? s[i] - '0' : toupper(s[i]) - 'A' + 10;
+ i++;
+ b = isdigit(s[i]) ? s[i] - '0' : toupper(s[i]) - 'A' + 10;
+ r += (char)(a * 16 + b);
+ } else {
+ r += s[i];
+ }
+ }
+ return r;
+}