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);
} ;