From 55573ede933726408700c1eaf3d5213a4d47a26d Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Tue, 2 Feb 2021 16:47:11 +0100 Subject: [PATCH] Server: remove double url decoding Fixes #41116 and #39436 (test taken from that) --- src/server/qgsrequesthandler.cpp | 5 +--- .../testqgsserverquerystringparameter.cpp | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/server/qgsrequesthandler.cpp b/src/server/qgsrequesthandler.cpp index 0afc90822835..77accaf871e1 100644 --- a/src/server/qgsrequesthandler.cpp +++ b/src/server/qgsrequesthandler.cpp @@ -220,10 +220,7 @@ void QgsRequestHandler::parseInput() const QList items = query.queryItems(); for ( const pair_t &pair : items ) { - // QUrl::fromPercentEncoding doesn't replace '+' with space - const QString key = QUrl::fromPercentEncoding( QString( pair.first ).replace( '+', ' ' ).toUtf8() ); - const QString value = QUrl::fromPercentEncoding( QString( pair.second ).replace( '+', ' ' ).toUtf8() ); - mRequest.setParameter( key.toUpper(), value ); + mRequest.setParameter( pair.first, pair.second ); } setupParameters(); } diff --git a/tests/src/server/testqgsserverquerystringparameter.cpp b/tests/src/server/testqgsserverquerystringparameter.cpp index 0daa6a4cce5a..126f6e0087e7 100644 --- a/tests/src/server/testqgsserverquerystringparameter.cpp +++ b/tests/src/server/testqgsserverquerystringparameter.cpp @@ -23,6 +23,9 @@ #include "qgsserverapicontext.h" #include "qgsserverrequest.h" #include "qgsserverexception.h" +#include "qgsrequesthandler.h" +#include "qgsbufferserverrequest.h" +#include "qgsbufferserverresponse.h" /** * \ingroup UnitTests @@ -56,6 +59,9 @@ class TestQgsServerQueryStringParameter : public QObject // Test default values void testDefaultValues(); + + // Test QgsRequestHandler::parseInput (i.e. POST requests) with special chars + void testParseInput(); }; @@ -174,5 +180,24 @@ void TestQgsServerQueryStringParameter::testDefaultValues() } +void TestQgsServerQueryStringParameter::testParseInput() +{ + // Request with layers "a", "b", "c" and "äös + %&#" + QByteArray data( "SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=a%2Cb%2Cc%2C%C3%A4%C3%B6s+%2B+%25%26%23" ); + QgsBufferServerRequest request( QStringLiteral( "http://localhost/wms/test" ), QgsServerRequest::PostMethod, QgsServerRequest::Headers(), &data ); + QgsBufferServerResponse response; + + QgsRequestHandler requestHandler( request, response ); + requestHandler.parseInput(); + + QgsServerParameters params = request.serverParameters(); + QMap paramsMap = params.toMap(); + QCOMPARE( paramsMap["SERVICE"], QStringLiteral( "WMS" ) ); + QCOMPARE( paramsMap["VERSION"], QStringLiteral( "1.3.0" ) ); + QCOMPARE( paramsMap["REQUEST"], QStringLiteral( "GetMap" ) ); + QCOMPARE( paramsMap["LAYERS"], QStringLiteral( "a,b,c,äös + %&#" ) ); +} + + QGSTEST_MAIN( TestQgsServerQueryStringParameter ) #include "testqgsserverquerystringparameter.moc"