28#include <QDomDocument>
33using namespace Qt::StringLiterals;
37 , mResponse( response )
43 return mRequest.parameters();
48 return mExceptionRaised;
53 mResponse.setHeader( name, value );
63 mResponse.removeHeader( name );
68 return mResponse.header( name );
73 return mResponse.headers();
78 mRequest.setHeader( name, value );
83 mRequest.removeHeader( name );
88 return mRequest.header( name );
94 return mRequest.headers();
100 return mResponse.headersSent();
105 mResponse.write(
body );
110 mResponse.truncate();
115 return mResponse.data();
120 return mRequest.data();
125 return mRequest.url().toString();
130 return mRequest.url().path();
135 mResponse.setStatusCode( code );
140 return mResponse.statusCode();
152 mExceptionRaised =
true;
153 mResponse.write( ex );
156void QgsRequestHandler::setupParameters()
161 const QString infoFormat = parameters.value( u
"INFO_FORMAT"_s );
162 if ( !infoFormat.isEmpty() )
164 mFormat = infoFormat;
168 mFormatString = parameters.value( u
"FORMAT"_s );
169 QString formatString = mFormatString;
170 if ( !formatString.isEmpty() )
173 if ( formatString.contains(
"image/png"_L1, Qt::CaseInsensitive ) || formatString.compare(
"png"_L1, Qt::CaseInsensitive ) == 0 )
175 formatString = u
"PNG"_s;
177 else if ( formatString.contains(
"image/jpeg"_L1, Qt::CaseInsensitive ) || formatString.contains(
"image/jpg"_L1, Qt::CaseInsensitive )
178 || formatString.compare(
"jpg"_L1, Qt::CaseInsensitive ) == 0 )
180 formatString = u
"JPG"_s;
182 else if ( formatString.compare(
"svg"_L1, Qt::CaseInsensitive ) == 0 )
184 formatString = u
"SVG"_s;
186 else if ( formatString.contains(
"pdf"_L1, Qt::CaseInsensitive ) )
188 formatString = u
"PDF"_s;
191 mFormat = formatString;
200 if ( mRequest.header( u
"Content-Type"_s ).contains( u
"json"_s ) )
206 QString inputString( mRequest.data() );
211 if ( !doc.setContent( inputString,
true, &errorMsg, &line, &column ) )
218 typedef QPair<QString, QString> pair_t;
219 const QUrlQuery query( inputString );
220 const QList<pair_t> items = query.queryItems();
221 for (
const pair_t &pair : items )
223 mRequest.setParameter( pair.first, pair.second );
233 const QDomElement docElem = doc.documentElement();
235 mRequest.setParameter( u
"REQUEST"_s, docElem.tagName() );
238 const QDomNamedNodeMap map = docElem.attributes();
239 for (
int i = 0; i < map.length(); ++i )
241 if ( map.item( i ).isNull() )
244 const QDomNode attrNode = map.item( i );
245 const QDomAttr attr = attrNode.toAttr();
249 const QString attrName = attr.name();
250 if ( attrName.startsWith(
"xmlns" ) || attrName.startsWith(
"xsi:" ) )
253 mRequest.setParameter( attrName.toUpper(), attr.value() );
255 mRequest.setParameter( u
"REQUEST_BODY"_s, inputString.replace(
'+',
"%2B"_L1 ) );
267 if ( !( key.isEmpty() || value.isEmpty() ) )
271 if ( key.compare(
"MAP"_L1, Qt::CaseInsensitive ) == 0 )
275 mRequest.setParameter( key, value );
282 return mRequest.parameter( key );
287 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())
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.
QMap< QString, QString > responseHeaders() const
Returns the response headers.
void setRequestHeader(const QString &name, const QString &value)
Sets an HTTP request header.
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 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.
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.