diff --git a/src/Network/httpd.cxx b/src/Network/httpd.cxx index b012e0ba1..7a567a61a 100644 --- a/src/Network/httpd.cxx +++ b/src/Network/httpd.cxx @@ -100,6 +100,7 @@ void HttpdChannel::foundTerminator (void) { unsigned int pos = rest.find( " " ); if ( pos != string::npos ) { request = rest.substr( 0, pos ); + request = urlDecode(request); } else { request = "/"; } @@ -176,6 +177,11 @@ void HttpdChannel::foundTerminator (void) { for (int i = 0; i < node->nChildren(); i++) { SGPropertyNode *child = node->getChild(i); string name = child->getName(); + if ( node->getChild(name, 1) ) { + char buf[16]; + sprintf(buf, "[%d]", child->getIndex()); + name += buf; + } string line = ""; if ( child->nChildren() > 0 ) { line += ""; line += name; line += ""; @@ -197,7 +203,7 @@ void HttpdChannel::foundTerminator (void) { if ( request.substr(request.length() - 1, 1) != (string)"/" ) { line += "/"; } - line += name; + line += urlEncode(name); line += "\">("; line += value; line += ")
"; @@ -210,12 +216,12 @@ void HttpdChannel::foundTerminator (void) { string value = node->getStringValue(); response += "
"; response += ""; response += request; response += " = "; - response += ""; response += ""; @@ -249,3 +255,45 @@ void HttpdChannel::foundTerminator (void) { buffer.remove(); } + + +// encode everything but "a-zA-Z0-9_.-/" +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; +} diff --git a/src/Network/httpd.hxx b/src/Network/httpd.hxx index 27aeb9b9d..1acb1dfff 100644 --- a/src/Network/httpd.hxx +++ b/src/Network/httpd.hxx @@ -45,6 +45,9 @@ class HttpdChannel : public netChat netBuffer buffer ; + string urlEncode(string); + string urlDecode(string); + public: HttpdChannel() : buffer(512) { setTerminator("\r\n"); }