X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Fhttpd.cxx;h=162bf45ec6ec92816ce0b45f78d8f774205fba58;hb=f3d4f741f097e1a9e1545389b95413d8b78f3b0f;hp=b012e0ba1ad053bd6f2246f3c7b907e09897708a;hpb=e856a8ce0a73a917da76a5744aad2648a0b00533;p=flightgear.git diff --git a/src/Network/httpd.cxx b/src/Network/httpd.cxx index b012e0ba1..162bf45ec 100644 --- a/src/Network/httpd.cxx +++ b/src/Network/httpd.cxx @@ -1,4 +1,4 @@ -// httpd.hxx -- FGFS http property manager interface / external script +// httpd.cxx -- FGFS http property manager interface / external script // and control class // // Written by Curtis Olson, started June 2001. @@ -39,6 +39,7 @@ #include #include #include +#include #include #include
@@ -47,10 +48,8 @@ #include "httpd.hxx" SG_USING_STD(string); -#if !defined(SG_HAVE_NATIVE_SGI_COMPILERS) SG_USING_STD(cout); SG_USING_STD(istrstream); -#endif bool FGHttpd::open() { @@ -62,7 +61,7 @@ bool FGHttpd::open() { server = new HttpdServer( port ); - set_hz( 5 ); // default to processing requests @ 5Hz + set_hz( 15 ); // default to processing requests @ 15Hz set_enabled( true ); return true; @@ -97,7 +96,7 @@ void HttpdChannel::foundTerminator (void) { string request; string tmp; - unsigned int pos = rest.find( " " ); + string::size_type pos = rest.find( " " ); if ( pos != string::npos ) { request = rest.substr( 0, pos ); } else { @@ -111,6 +110,7 @@ void HttpdChannel::foundTerminator (void) { string args = request.substr( pos + 1 ); request = request.substr( 0, pos ); printf("'%s' '%s'\n", request.c_str(), args.c_str()); + request = urlDecode(request); // parse args looking for "value=" bool done = false; @@ -126,19 +126,38 @@ void HttpdChannel::foundTerminator (void) { } printf(" arg = %s\n", arg.c_str() ); - unsigned int apos = arg.find("="); + string::size_type apos = arg.find("="); if ( apos != string::npos ) { string a = arg.substr( 0, apos ); string b = arg.substr( apos + 1 ); printf(" a = %s b = %s\n", a.c_str(), b.c_str() ); - if ( a == "value" ) { - fgSetString( request, b ); - } + if ( request == "/run.cgi" ) { + // execute a command + if ( a == "value" ) { + SGPropertyNode args; + if ( !globals->get_commands() + ->execute(urlDecode(b).c_str(), &args) ) + { + SG_LOG( SG_GENERAL, SG_ALERT, + "Command " << urlDecode(b) + << " failed."); + } + + } + } else { + if ( a == "value" ) { + // update a property value + fgSetString( request.c_str(), + urlDecode(b).c_str() ); + } + } } } - } + } else { + request = urlDecode(request); + } - node = globals->get_props()->getNode(request); + node = globals->get_props()->getNode(request.c_str()); string response = ""; response += ""; @@ -175,7 +194,7 @@ void HttpdChannel::foundTerminator (void) { for (int i = 0; i < node->nChildren(); i++) { SGPropertyNode *child = node->getChild(i); - string name = child->getName(); + string name = child->getDisplayName(true); string line = ""; if ( child->nChildren() > 0 ) { line += ""; line += name; line += ""; line += "/
"; } else { - string value = node->getStringValue ( name, "" ); + string value = node->getStringValue ( name.c_str(), "" ); line += ""; line += name; line += " ("; line += value; line += ")
"; @@ -210,17 +229,16 @@ void HttpdChannel::foundTerminator (void) { string value = node->getStringValue(); response += "
"; response += ""; response += request; response += " = "; - response += ""; response += ""; - response += ""; - response += "
"; + response += "
"; } response += ""; response += getTerminator(); @@ -249,3 +267,45 @@ void HttpdChannel::foundTerminator (void) { buffer.remove(); } + + +// 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; +}