28#include <QDomDocument>
33using namespace Qt::StringLiterals;
37 , mResponse( response )
42 return mRequest.parameters();
47 return mExceptionRaised;
52 mResponse.setHeader( name, value );
62 mResponse.removeHeader( name );
68 return mResponse.header( name );
75 return mResponse.headers();
81 return mResponse.fullHeader( name );
86 return mResponse.fullHeaders();
91 mRequest.setHeader( name, value );
96 mRequest.removeHeader( name );
101 return mRequest.header( name );
107 return mRequest.headers();
113 return mResponse.headersSent();
118 mResponse.write(
body );
123 mResponse.truncate();
128 return mResponse.data();
133 return mRequest.data();
138 return mRequest.url().toString();
143 return mRequest.url().path();
148 mResponse.setStatusCode( code );
153 return mResponse.statusCode();
165 mExceptionRaised =
true;
166 mResponse.write( ex );
169void QgsRequestHandler::setupParameters()
174 const QString infoFormat = parameters.value( u
"INFO_FORMAT"_s );
175 if ( !infoFormat.isEmpty() )
177 mFormat = infoFormat;
181 mFormatString = parameters.value( u
"FORMAT"_s );
182 QString formatString = mFormatString;
183 if ( !formatString.isEmpty() )
186 if ( formatString.contains(
"image/png"_L1, Qt::CaseInsensitive ) || formatString.compare(
"png"_L1, Qt::CaseInsensitive ) == 0 )
188 formatString = u
"PNG"_s;
190 else if ( formatString.contains(
"image/jpeg"_L1, Qt::CaseInsensitive ) || formatString.contains(
"image/jpg"_L1, Qt::CaseInsensitive ) || formatString.compare(
"jpg"_L1, Qt::CaseInsensitive ) == 0 )
192 formatString = u
"JPG"_s;
194 else if ( formatString.compare(
"svg"_L1, Qt::CaseInsensitive ) == 0 )
196 formatString = u
"SVG"_s;
198 else if ( formatString.contains(
"pdf"_L1, Qt::CaseInsensitive ) )
200 formatString = u
"PDF"_s;
203 mFormat = formatString;
212 if ( mRequest.header( u
"Content-Type"_s ).contains( u
"json"_s ) )
218 QString inputString( mRequest.data() );
223 if ( !doc.setContent( inputString,
true, &errorMsg, &line, &column ) )
227 logMessage( u
"Error parsing post data as XML: at line %1, column %2: %3. Assuming urlencoded query string sent in the post body."_s.arg( line ).arg( column ).arg( errorMsg ), u
"Server"_s,
Qgis::MessageLevel::Warning );
231 typedef QPair<QString, QString> pair_t;
232 const QUrlQuery query( inputString );
233 const QList<pair_t> items = query.queryItems();
234 for (
const pair_t &pair : items )
236 mRequest.setParameter( pair.first, pair.second );
246 const QDomElement docElem = doc.documentElement();
248 mRequest.setParameter( u
"REQUEST"_s, docElem.tagName() );
251 const QDomNamedNodeMap map = docElem.attributes();
252 for (
int i = 0; i < map.length(); ++i )
254 if ( map.item( i ).isNull() )
257 const QDomNode attrNode = map.item( i );
258 const QDomAttr attr = attrNode.toAttr();
262 const QString attrName = attr.name();
263 if ( attrName.startsWith(
"xmlns" ) || attrName.startsWith(
"xsi:" ) )
266 mRequest.setParameter( attrName.toUpper(), attr.value() );
268 mRequest.setParameter( u
"REQUEST_BODY"_s, inputString.replace(
'+',
"%2B"_L1 ) );
280 if ( !( key.isEmpty() || value.isEmpty() ) )
284 if ( key.compare(
"MAP"_L1, Qt::CaseInsensitive ) == 0 )
288 mRequest.setParameter( key, value );
295 return mRequest.parameter( key );
300 mRequest.removeParameter( key );
@ Warning
Warning message.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
void removeParameter(const QString &key)
Remove a request parameter.
void removeRequestHeader(const QString &name)
Remove an HTTP request header.
QString responseHeader(const QString &name) const
Retrieve response header value.
void clearBody()
Clear response buffer.
QString requestHeader(const QString &name) const
Retrieve request header value.
QMap< QString, QString > parameterMap() const
Returns the parsed parameters as a key-value pair.
QString path() const
Returns the path component of the request URL.
QByteArray data() const
Returns the request POST data (can be null).
bool exceptionRaised() const
Pointer to last raised exception.
bool headersSent() const
Returns true if the HTTP headers were already sent to the client.
void parseInput()
Parses the input and creates a request neutral Parameter/Value map.
void setServiceException(const QgsServerException &ex)
Allow plugins to return a QgsMapServiceException.
void removeResponseHeader(const QString &name)
Remove an HTTP response header.
void sendResponse()
Send out HTTP headers and flush output buffer.
Q_DECL_DEPRECATED QMap< QString, QString > responseHeaders() const
Returns the response headers: note that if multiple values are set for the same header,...
void setRequestHeader(const QString &name, const QString &value)
Sets an HTTP request header.
QMap< QString, QList< QString > > fullResponseHeaders() const
Returns the response headers as a map of header name to list of values (to support multiple values fo...
void appendBody(const QByteArray &body)
Sets the info format string such as "text/xml".
QString parameter(const QString &key) const
Returns a request parameter.
QMap< QString, QString > requestHeaders() const
Returns the Request headers.
QString url() const
Returns the request url.
void setStatusCode(int code)
Sets response http status code.
QgsRequestHandler(QgsServerRequest &request, QgsServerResponse &response)
Constructor.
QByteArray body() const
Returns the response body data.
void clear()
Clears the response body and headers.
void setResponseHeader(const QString &name, const QString &value)
Sets an HTTP response header.
int statusCode() const
Returns the response http status code.
void setParameter(const QString &key, const QString &value)
Sets a request parameter.
QList< QString > fullResponseHeader(const QString &name) const
Returns the list of response headers for a given header name.
Exception base class for server exceptions.
Defines requests passed to QgsService classes.
QgsServerRequest::Parameters parameters() const
Returns a map of query parameters with keys converted to uppercase.
QMap< QString, QString > Parameters
Defines the response interface passed to QgsService.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH