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 );
67 return mResponse.header( name );
72 return mResponse.headers();
77 mRequest.setHeader( name, value );
82 mRequest.removeHeader( name );
87 return mRequest.header( name );
93 return mRequest.headers();
99 return mResponse.headersSent();
104 mResponse.write(
body );
109 mResponse.truncate();
114 return mResponse.data();
119 return mRequest.data();
124 return mRequest.url().toString();
129 return mRequest.url().path();
134 mResponse.setStatusCode( code );
139 return mResponse.statusCode();
151 mExceptionRaised =
true;
152 mResponse.write( ex );
155void QgsRequestHandler::setupParameters()
160 const QString infoFormat = parameters.value( u
"INFO_FORMAT"_s );
161 if ( !infoFormat.isEmpty() )
163 mFormat = infoFormat;
167 mFormatString = parameters.value( u
"FORMAT"_s );
168 QString formatString = mFormatString;
169 if ( !formatString.isEmpty() )
172 if ( formatString.contains(
"image/png"_L1, Qt::CaseInsensitive ) || formatString.compare(
"png"_L1, Qt::CaseInsensitive ) == 0 )
174 formatString = u
"PNG"_s;
176 else if ( formatString.contains(
"image/jpeg"_L1, Qt::CaseInsensitive ) || formatString.contains(
"image/jpg"_L1, Qt::CaseInsensitive ) || formatString.compare(
"jpg"_L1, Qt::CaseInsensitive ) == 0 )
178 formatString = u
"JPG"_s;
180 else if ( formatString.compare(
"svg"_L1, Qt::CaseInsensitive ) == 0 )
182 formatString = u
"SVG"_s;
184 else if ( formatString.contains(
"pdf"_L1, Qt::CaseInsensitive ) )
186 formatString = u
"PDF"_s;
189 mFormat = formatString;
198 if ( mRequest.header( u
"Content-Type"_s ).contains( u
"json"_s ) )
204 QString inputString( mRequest.data() );
209 if ( !doc.setContent( inputString,
true, &errorMsg, &line, &column ) )
213 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 );
217 typedef QPair<QString, QString> pair_t;
218 const QUrlQuery query( inputString );
219 const QList<pair_t> items = query.queryItems();
220 for (
const pair_t &pair : items )
222 mRequest.setParameter( pair.first, pair.second );
232 const QDomElement docElem = doc.documentElement();
234 mRequest.setParameter( u
"REQUEST"_s, docElem.tagName() );
237 const QDomNamedNodeMap map = docElem.attributes();
238 for (
int i = 0; i < map.length(); ++i )
240 if ( map.item( i ).isNull() )
243 const QDomNode attrNode = map.item( i );
244 const QDomAttr attr = attrNode.toAttr();
248 const QString attrName = attr.name();
249 if ( attrName.startsWith(
"xmlns" ) || attrName.startsWith(
"xsi:" ) )
252 mRequest.setParameter( attrName.toUpper(), attr.value() );
254 mRequest.setParameter( u
"REQUEST_BODY"_s, inputString.replace(
'+',
"%2B"_L1 ) );
266 if ( !( key.isEmpty() || value.isEmpty() ) )
270 if ( key.compare(
"MAP"_L1, Qt::CaseInsensitive ) == 0 )
274 mRequest.setParameter( key, value );
281 return mRequest.parameter( key );
286 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.
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.