X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Fhttpd.cxx;h=162bf45ec6ec92816ce0b45f78d8f774205fba58;hb=f3d4f741f097e1a9e1545389b95413d8b78f3b0f;hp=4a839252580d33d10a7076a5719a248020bcc536;hpb=035b9dabb18eb4fea4f975be85ca0004dc5e336e;p=flightgear.git diff --git a/src/Network/httpd.cxx b/src/Network/httpd.cxx index 4a8392525..162bf45ec 100644 --- a/src/Network/httpd.cxx +++ b/src/Network/httpd.cxx @@ -1,10 +1,13 @@ -// 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. // // Copyright (C) 2001 Curtis L. Olson - curt@flightgear.org // +// Jpeg Image Support added August 2001 +// by Norman Vine - nhv@cape.com +// // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of the @@ -28,26 +31,25 @@ #include -#include -#include -#include -#include - #include // atoi() atof() #include STL_STRING #include STL_STRSTREAM +#include +#include +#include +#include +#include + #include
#include
#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() { @@ -58,8 +60,8 @@ 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; @@ -82,6 +84,9 @@ bool FGHttpd::close() { // Handle http GET requests void HttpdChannel::foundTerminator (void) { + + closeWhenDone (); + const string s = buffer.getData(); if ( s.find( "GET " ) == 0 ) { @@ -91,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 { @@ -105,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; @@ -120,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 += ""; @@ -141,7 +166,7 @@ void HttpdChannel::foundTerminator (void) { response += ""; response += getTerminator(); - response += "HUD - "; + response += "<TITLE>FlightGear - "; response += request; response += ""; response += getTerminator(); @@ -169,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 += ")
"; @@ -204,17 +229,16 @@ void HttpdChannel::foundTerminator (void) { string value = node->getStringValue(); response += "
"; response += ""; response += request; response += " = "; - response += ""; response += ""; - response += ""; - response += "
"; + response += "
"; } response += ""; response += getTerminator(); @@ -243,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; +}