The attached patch adds the missing indices to ambiguous nodes, so that nodes with indices != 0 can actually be selected.
httpd.cxx | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- httpd.hxx | 5 +++++ 2 files changed, 57 insertions(+), 5 deletions(-) The patched httpd was tested with Mozilla & Konqueror. And here is the [RFC] part: Wouldn't it be desirable to put the keys/values in a <table>? This would make the ouput much cleaner while keeping the overhead small. Please advise, and I make another patch. m. :-)
Index: httpd.cxx =================================================================== RCS file: /var/cvs/FlightGear-0.7/FlightGear/src/Network/httpd.cxx,v retrieving revision 1.5 diff -u -3 -p -r1.5 httpd.cxx --- httpd.cxx 22 Jan 2002 14:39:52 -0000 1.5 +++ httpd.cxx 1 Feb 2002 19:26:24 -0000 @@ -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 += "<B><A HREF=\""; @@ -183,7 +189,7 @@ void HttpdChannel::foundTerminator (void if ( request.substr(request.length() - 1, 1) != (string)"/" ) { line += "/"; } - line += name; + line += urlEncode(name); line += "\">"; line += name; line += "</A></B>"; @@ -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 += ")</A><BR>"; @@ -210,13 +216,13 @@ void HttpdChannel::foundTerminator (void string value = node->getStringValue(); response += "<form method=\"GET\" action=\""; - response += request; + response += urlEncode(request); response += "\">"; response += "<B>"; response += request; response += "</B> = "; - response += "<input type=text name=value size=\"5\" value=\""; - response += value; + response += "<input type=text name=value size=\"10\" value=\""; + response += urlEncode(value); response += "\" maxlength=2047>"; response += "<input type=submit value=\"update\" name=\"submit\">"; response += "<FORM>"; @@ -249,3 +255,44 @@ 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 < 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", (int)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] == '%' && 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; +} + Index: httpd.hxx =================================================================== RCS file: /var/cvs/FlightGear-0.7/FlightGear/src/Network/httpd.hxx,v retrieving revision 1.2 diff -u -3 -p -r1.2 httpd.hxx --- httpd.hxx 16 Jan 2002 22:02:53 -0000 1.2 +++ httpd.hxx 1 Feb 2002 19:26:25 -0000 @@ -55,6 +55,11 @@ public: // Handle the actual http request virtual void foundTerminator (void); + +private: + + string urlEncode(string); + string urlDecode(string); } ;