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

Reply via email to