void QgsPostRequestHandler::parseInput() { QgsDebugMsg( "QgsPostRequestHandler::parseInput" ); QString inputString = readPostBody(); QgsDebugMsg( inputString ); //Map parameter in QUERY_STRING? const char* qs = getenv( "QUERY_STRING" ); QMap<QString, QString> getParameters; QString queryString; QString mapParameter; if ( qs ) { queryString = QString( qs ); requestStringToParameterMap( queryString, getParameters ); mapParameter = getParameters.value( "MAP" ); } QDomDocument doc; QString errorMsg; if ( !doc.setContent( inputString, true, &errorMsg ) ) { requestStringToParameterMap( inputString, mParameterMap ); } else { QString queryString; const char* qs = getenv( "QUERY_STRING" ); if ( qs ) { queryString = QString( qs ); QgsDebugMsg( "query string is: " + queryString ); } else { QgsDebugMsg( "error, no query string found but a QDomDocument" ); return; //no query string? something must be wrong... } requestStringToParameterMap( queryString, mParameterMap ); QDomElement docElem = doc.documentElement(); if ( docElem.hasAttribute( "version" ) ) mParameterMap.insert( "VERSION", docElem.attribute( "version" ) ); if ( docElem.hasAttribute( "service" ) ) mParameterMap.insert( "SERVICE", docElem.attribute( "service" ) ); mParameterMap.insert( "REQUEST", docElem.tagName() ); mParameterMap.insert( "REQUEST_BODY", inputString ); } if ( !mapParameter.isEmpty() && !mParameterMap.contains( "MAP" ) ) { mParameterMap.insert( "MAP", mapParameter ); } }
QMap<QString, QString> QgsPostRequestHandler::parseInput() { QgsDebugMsg( "QgsPostRequestHandler::parseInput" ); QMap<QString, QString> parameters; QString inputString = readPostBody(); QgsDebugMsg( inputString ); QDomDocument doc; QString errorMsg; if ( !doc.setContent( inputString, true, &errorMsg ) ) { requestStringToParameterMap( inputString, parameters ); } else { QString queryString; const char* qs = getenv( "QUERY_STRING" ); if ( qs ) { queryString = QString( qs ); QgsDebugMsg( "query string is: " + queryString ); } else { QgsDebugMsg( "error, no query string found but a QDomDocument" ); return parameters; //no query string? something must be wrong... } requestStringToParameterMap( queryString, parameters ); QDomElement docElem = doc.documentElement(); parameters.insert( "VERSION", docElem.attribute( "version" ) ); parameters.insert( "SERVICE", docElem.attribute( "service" ) ); parameters.insert( "REQUEST", docElem.tagName() ); parameters.insert( "REQUEST_BODY", inputString ); } return parameters; }
int loadParams(cgiRequestObj *request, char* (*getenv2)(const char*, void* thread_context), char *raw_post_data, ms_uint32 raw_post_data_length, void* thread_context) { register int x,m=0; char *s, *queryString = NULL, *httpCookie = NULL; int debuglevel; int maxParams = MS_DEFAULT_CGI_PARAMS; if (getenv2==NULL) getenv2 = &msGetEnv; if(getenv2("REQUEST_METHOD", thread_context)==NULL) { msIO_printf("This script can only be used to decode form results and \n"); msIO_printf("should be initiated as a CGI process via a httpd server.\n"); return -1; } debuglevel = (int)msGetGlobalDebugLevel(); if(strcmp(getenv2("REQUEST_METHOD", thread_context),"POST") == 0) { /* we've got a post from a form */ char *post_data; int data_len; request->type = MS_POST_REQUEST; s = getenv2("CONTENT_TYPE", thread_context); if (s != NULL) request->contenttype = msStrdup(s); /* we've to set default Content-Type which is * application/octet-stream according to * W3 RFC 2626 section 7.2.1 */ else request->contenttype = msStrdup("application/octet-stream"); if (raw_post_data) { post_data = msStrdup(raw_post_data); data_len = raw_post_data_length; } else { if(MS_SUCCESS != readPostBody( request, &post_data )) return -1; data_len = strlen(post_data); } /* if the content_type is application/x-www-form-urlencoded, we have to parse it like the QUERY_STRING variable */ if(strncmp(request->contenttype, "application/x-www-form-urlencoded", strlen("application/x-www-form-urlencoded")) == 0) { while( data_len > 0 && isspace(post_data[data_len-1]) ) post_data[--data_len] = '\0'; while( post_data[0] ) { if(m >= maxParams) { maxParams *= 2; request->ParamNames = (char **) msSmallRealloc(request->ParamNames,sizeof(char *) * maxParams); request->ParamValues = (char **) msSmallRealloc(request->ParamValues,sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(post_data,'&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m],'='); m++; } free( post_data ); } else request->postrequest = post_data; /* check the QUERY_STRING even in the post request since it can contain information. Eg a wfs request with */ s = getenv2("QUERY_STRING", thread_context); if(s) { if (debuglevel >= MS_DEBUGLEVEL_DEBUG) msDebug("loadParams() QUERY_STRING: %s\n", s); queryString = msStrdup(s); for(x=0; queryString[0] != '\0'; x++) { if(m >= maxParams) { maxParams *= 2; request->ParamNames = (char **) msSmallRealloc(request->ParamNames,sizeof(char *) * maxParams); request->ParamValues = (char **) msSmallRealloc(request->ParamValues,sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(queryString,'&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m],'='); m++; } } } else { if(strcmp(getenv2("REQUEST_METHOD", thread_context),"GET") == 0) { /* we've got a get request */ request->type = MS_GET_REQUEST; s = getenv2("QUERY_STRING", thread_context); if(s == NULL) { msIO_setHeader("Content-Type","text/html"); msIO_sendHeaders(); msIO_printf("No query information to decode. QUERY_STRING not set.\n"); return -1; } if (debuglevel >= MS_DEBUGLEVEL_DEBUG) msDebug("loadParams() QUERY_STRING: %s\n", s); if(strlen(s)==0) { msIO_setHeader("Content-Type","text/html"); msIO_sendHeaders(); msIO_printf("No query information to decode. QUERY_STRING is set, but empty.\n"); return -1; } /* don't modify the string returned by getenv2 */ queryString = msStrdup(s); for(x=0; queryString[0] != '\0'; x++) { if(m >= maxParams) { maxParams *= 2; request->ParamNames = (char **) msSmallRealloc(request->ParamNames,sizeof(char *) * maxParams); request->ParamValues = (char **) msSmallRealloc(request->ParamValues,sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(queryString,'&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m],'='); m++; } } else { msIO_setHeader("Content-Type","text/html"); msIO_sendHeaders(); msIO_printf("This script should be referenced with a METHOD of GET or METHOD of POST.\n"); return -1; } } /* check for any available cookies */ s = getenv2("HTTP_COOKIE", thread_context); if(s != NULL) { httpCookie = msStrdup(s); request->httpcookiedata = msStrdup(s); for(x=0; httpCookie[0] != '\0'; x++) { if(m >= maxParams) { maxParams *= 2; request->ParamNames = (char **) msSmallRealloc(request->ParamNames,sizeof(char *) * maxParams); request->ParamValues = (char **) msSmallRealloc(request->ParamValues,sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(httpCookie,';'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword_skip(request->ParamValues[m],'=',' '); m++; } } if (queryString) free(queryString); if (httpCookie) free(httpCookie); return(m); }
void QgsSOAPRequestHandler::parseInput() { QString inputString = readPostBody(); //QgsDebugMsg("input string is: " + inputString) //inputString to QDomDocument QDomDocument inputXML; QString errorMsg; if ( !inputXML.setContent( inputString, true, &errorMsg ) ) { QgsDebugMsg( "soap request parse error" ); QgsDebugMsg( "error message: " + errorMsg ); QgsDebugMsg( "the xml string was:" ); QgsDebugMsg( inputString ); throw QgsMapServiceException( "InvalidXML", "XML error: " + errorMsg ); } // if xml reading was successfull, save the inputXML in a file QFile soapFile; QTextStream soapStream; //go through soap envelope->soap body, search for either GetCapabilities or GetMap QDomNodeList envelopeNodeList = inputXML.elementsByTagNameNS( "http://schemas.xmlsoap.org/soap/envelope/", "Envelope" ); if ( envelopeNodeList.size() < 1 ) { QgsDebugMsg( "Envelope element not found" ); throw QgsMapServiceException( "SOAPError", "Element <Envelope> not found" ); } QDomNodeList bodyNodeList = envelopeNodeList.item( 0 ).toElement().elementsByTagNameNS( "http://schemas.xmlsoap.org/soap/envelope/", "Body" ); if ( bodyNodeList.size() < 1 ) { QgsDebugMsg( "body node not found" ); throw QgsMapServiceException( "SOAPError", "Element <Body> not found" ); } QDomElement bodyElement = bodyNodeList.item( 0 ).toElement(); QDomElement firstChildElement = bodyElement.firstChild().toElement(); QString serviceString = firstChildElement.attribute( "service" ); if ( serviceString == "MS" ) { QgsDebugMsg( "service = MS " ); mParameterMap.insert( "SERVICE", "MS" ); mService = "MS"; } else if ( serviceString == "WMS" ) { mParameterMap.insert( "SERVICE", "WMS" ); mService = "WMS"; } else if ( serviceString == "MDS" ) { mParameterMap.insert( "SERVICE", "MDS" ); mService = "MDS"; } else if ( serviceString == "MAS" ) { mParameterMap.insert( "SERVICE", "MAS" ); mService = "MAS"; } else { mParameterMap.insert( "SERVICE", "DISCOVERY" ); mService = "DISCOVERY"; } //GetCapabilities request //if(firstChildElement.localName().compare("getCapabilities", Qt::CaseInsensitive) == 0) if ( firstChildElement.localName() == "GetCapabilities" || firstChildElement.localName() == "getCapabilities" ) { mParameterMap.insert( "REQUEST", "GetCapabilities" ); } //GetMap request //else if(firstChildElement.tagName().compare("getMap",Qt::CaseInsensitive) == 0) else if ( firstChildElement.localName() == "GetMap" || firstChildElement.localName() == "getMap" ) { mParameterMap.insert( "REQUEST", "GetMap" ); parseGetMapElement( mParameterMap, firstChildElement ); } //GetDiagram request //else if(firstChildElement.tagName().compare("getDiagram", Qt::CaseInsensitive) == 0) else if ( firstChildElement.localName() == "GetDiagram" ) { mParameterMap.insert( "REQUEST", "GetDiagram" ); parseGetMapElement( mParameterMap, firstChildElement ); //reuse the method for GetMap } //GetFeatureInfo request else if ( firstChildElement.localName() == "GetFeatureInfo" ) { mParameterMap.insert( "REQUEST", "GetFeatureInfo" ); parseGetFeatureInfoElement( mParameterMap, firstChildElement ); } //set mFormat QString formatString = mParameterMap.value( "FORMAT" ); if ( !formatString.isEmpty() ) { //remove the image/ in front of the format if ( formatString == "image/jpeg" || formatString == "JPG" || formatString == "jpg" ) { formatString = "JPG"; } else if ( formatString == "image/png" || formatString == "PNG" || formatString == "png" ) { formatString = "PNG"; } else if ( formatString == "image/gif" || formatString == "GIF" || formatString == "gif" ) { formatString = "GIF"; } else { throw QgsMapServiceException( "InvalidFormat", "Invalid format " + formatString + ", only jpg and png are supported" ); } mFormat = formatString; } }
void QgsPostRequestHandler::parseInput() { QgsMessageLog::logMessage( QStringLiteral( "QgsPostRequestHandler::parseInput" ) ); QString inputString = readPostBody(); QgsMessageLog::logMessage( inputString ); //Map parameter in QUERY_STRING? const char* qs = getenv( "QUERY_STRING" ); QMap<QString, QString> getParameters; QString queryString; QString mapParameter; if ( qs ) { queryString = QString( qs ); requestStringToParameterMap( queryString, getParameters ); mapParameter = getParameters.value( QStringLiteral( "MAP" ) ); } QDomDocument doc; QString errorMsg; int line; int column; if ( !doc.setContent( inputString, true, &errorMsg, &line, &column ) ) { char* requestMethod = getenv( "REQUEST_METHOD" ); if ( requestMethod && strcmp( requestMethod, "POST" ) == 0 ) { QgsMessageLog::logMessage( QStringLiteral( "Error at line %1, column %2: %3." ).arg( line ).arg( column ).arg( errorMsg ) ); } requestStringToParameterMap( inputString, mParameterMap ); } else { QString queryString; const char* qs = getenv( "QUERY_STRING" ); if ( qs ) { queryString = QString( qs ); QgsMessageLog::logMessage( "query string is: " + queryString ); } else { QgsMessageLog::logMessage( QStringLiteral( "error, no query string found but a QDomDocument" ) ); return; //no query string? something must be wrong... } requestStringToParameterMap( queryString, mParameterMap ); QDomElement docElem = doc.documentElement(); if ( docElem.hasAttribute( QStringLiteral( "version" ) ) ) mParameterMap.insert( QStringLiteral( "VERSION" ), docElem.attribute( QStringLiteral( "version" ) ) ); if ( docElem.hasAttribute( QStringLiteral( "service" ) ) ) mParameterMap.insert( QStringLiteral( "SERVICE" ), docElem.attribute( QStringLiteral( "service" ) ) ); mParameterMap.insert( QStringLiteral( "REQUEST" ), docElem.tagName() ); mParameterMap.insert( QStringLiteral( "REQUEST_BODY" ), inputString ); } if ( !mapParameter.isEmpty() && !mParameterMap.contains( QStringLiteral( "MAP" ) ) ) { mParameterMap.insert( QStringLiteral( "MAP" ), mapParameter ); } }