Skip to content

Commit ad7d03c

Browse files
authored
Merge pull request #7859 from rldhont/fix-server-sld-param-support
[Bugfix][Server] Add WMS SLD parameter support
2 parents 8ec5fec + 907c1a9 commit ad7d03c

File tree

9 files changed

+307
-26
lines changed

9 files changed

+307
-26
lines changed

python/server/auto_generated/qgsserverparameters.sip.in

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,28 @@ Converts the parameter into a color.
138138
:param ok: True if there's no error during the conversion, false otherwise
139139

140140
:return: A color
141+
%End
142+
143+
QUrl toUrl( bool &ok ) const;
144+
%Docstring
145+
Converts the parameter into an url.
146+
147+
:param ok: True if there's no error during the conversion, false otherwise
148+
149+
:return: An url
150+
151+
.. versionadded:: 3.4
152+
%End
153+
154+
QString loadUrl( bool &ok ) const;
155+
%Docstring
156+
Loads the data associated to the parameter converted into an url.
157+
158+
:param ok: True if there's no error during the load, false otherwise
159+
160+
:return: The content loaded
161+
162+
.. versionadded:: 3.4
141163
%End
142164

143165
static void raiseError( const QString &msg );

src/server/qgsrequesthandler.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,6 @@ void QgsRequestHandler::setupParameters()
154154
{
155155
const QgsServerRequest::Parameters parameters = mRequest.parameters();
156156

157-
// SLD
158-
QString value = parameters.value( QStringLiteral( "SLD" ) );
159-
if ( !value.isEmpty() )
160-
{
161-
QgsMessageLog::logMessage( QStringLiteral( "http and ftp methods not supported with Qt5." ) );
162-
}
163-
164-
// SLD_BODY
165-
value = parameters.value( QStringLiteral( "SLD_BODY" ) );
166-
if ( ! value.isEmpty() )
167-
{
168-
mRequest.setParameter( QStringLiteral( "SLD" ), value );
169-
}
170-
171157
//feature info format?
172158
QString infoFormat = parameters.value( QStringLiteral( "INFO_FORMAT" ) );
173159
if ( !infoFormat.isEmpty() )

src/server/qgsserverparameters.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717

1818
#include "qgsserverparameters.h"
1919
#include "qgsserverexception.h"
20+
#include "qgsnetworkcontentfetcher.h"
21+
#include "qgsmessagelog.h"
22+
#include <QObject>
23+
#include <QUrl>
24+
#include <QNetworkReply>
25+
#include <QNetworkRequest>
2026

2127
//
2228
// QgsServerParameterDefinition
@@ -200,6 +206,92 @@ QgsRectangle QgsServerParameterDefinition::toRectangle( bool &ok ) const
200206
return extent;
201207
}
202208

209+
QString QgsServerParameterDefinition::loadUrl( bool &ok ) const
210+
{
211+
ok = true;
212+
213+
// Get URL
214+
QUrl url = toUrl( ok );
215+
if ( !ok )
216+
{
217+
return QString();
218+
}
219+
220+
// fetching content
221+
QgsNetworkContentFetcher fetcher;
222+
QEventLoop loop;
223+
QObject::connect( &fetcher, &QgsNetworkContentFetcher::finished, &loop, &QEventLoop::quit );
224+
225+
QgsMessageLog::logMessage(
226+
QObject::tr( "Request started [url: %1]" ).arg( url.toString() ),
227+
QStringLiteral( "Server" ) );
228+
QNetworkRequest request( url );
229+
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
230+
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
231+
fetcher.fetchContent( request );
232+
233+
//wait until content fetched
234+
loop.exec( QEventLoop::ExcludeUserInputEvents );
235+
236+
QNetworkReply *reply = fetcher.reply();
237+
if ( !reply )
238+
{
239+
ok = false;
240+
QgsMessageLog::logMessage(
241+
QObject::tr( "Request failed [error: no reply - url: %1]" ).arg( url.toString() ),
242+
QStringLiteral( "Server" ) );
243+
return QString();
244+
}
245+
246+
QVariant status = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute );
247+
if ( !status.isNull() && status.toInt() >= 400 )
248+
{
249+
ok = false;
250+
if ( reply->error() != QNetworkReply::NoError )
251+
{
252+
QgsMessageLog::logMessage(
253+
QObject::tr( "Request failed [error: %1 - url: %2]" ).arg( reply->errorString(), reply->url().toString() ),
254+
QStringLiteral( "Server" ) );
255+
}
256+
QVariant phrase = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute );
257+
QgsMessageLog::logMessage(
258+
QObject::tr( "Request error [status: %1 - reason phrase: %2] for %3" ).arg( status.toInt() ).arg( phrase.toString(), reply->url().toString() ),
259+
QStringLiteral( "Server" ) );
260+
return QString();
261+
}
262+
263+
if ( reply->error() != QNetworkReply::NoError )
264+
{
265+
ok = false;
266+
QgsMessageLog::logMessage(
267+
QObject::tr( "Request failed [error: %1 - url: %2]" ).arg( reply->errorString(), reply->url().toString() ),
268+
QStringLiteral( "Server" ) );
269+
return QString();
270+
}
271+
272+
QgsMessageLog::logMessage(
273+
QObject::tr( "Request finished [url: %1]" ).arg( url.toString() ),
274+
QStringLiteral( "Server" ) );
275+
276+
QString content = fetcher.contentAsString();
277+
ok = ( !content.isEmpty() );
278+
return content;
279+
}
280+
281+
QUrl QgsServerParameterDefinition::toUrl( bool &ok ) const
282+
{
283+
ok = true;
284+
QUrl val;
285+
286+
if ( !mValue.toString().isEmpty() )
287+
{
288+
val = mValue.toUrl();
289+
}
290+
291+
ok = ( !val.isEmpty() && val.isValid() );
292+
return val;
293+
}
294+
203295
int QgsServerParameterDefinition::toInt( bool &ok ) const
204296
{
205297
ok = true;

src/server/qgsserverparameters.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,22 @@ class SERVER_EXPORT QgsServerParameterDefinition
137137
*/
138138
QColor toColor( bool &ok ) const;
139139

140+
/**
141+
* Converts the parameter into an url.
142+
* \param ok True if there's no error during the conversion, false otherwise
143+
* \returns An url
144+
* \since QGIS 3.4
145+
*/
146+
QUrl toUrl( bool &ok ) const;
147+
148+
/**
149+
* Loads the data associated to the parameter converted into an url.
150+
* \param ok True if there's no error during the load, false otherwise
151+
* \returns The content loaded
152+
* \since QGIS 3.4
153+
*/
154+
QString loadUrl( bool &ok ) const;
155+
140156
/**
141157
* Raises an exception in case of an invalid parameters.
142158
* \param msg The message describing the exception

src/server/services/wms/qgswmsparameters.cpp

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgsdatasourceuri.h"
2020
#include "qgsmessagelog.h"
2121
#include <iostream>
22+
#include <QUrl>
2223

2324
namespace QgsWms
2425
{
@@ -85,6 +86,36 @@ namespace QgsWms
8586
return val;
8687
}
8788

89+
QString QgsWmsParameter::loadUrl() const
90+
{
91+
// Check URL -- it will be used in error messages
92+
const QUrl url = toUrl();
93+
94+
bool ok = false;
95+
const QString content = QgsServerParameterDefinition::loadUrl( ok );
96+
97+
if ( !ok )
98+
{
99+
const QString msg = QString( "%1 request error for %2" ).arg( name( mName ), url.toString() );
100+
QgsServerParameterDefinition::raiseError( msg );
101+
}
102+
103+
return content;
104+
}
105+
106+
QUrl QgsWmsParameter::toUrl() const
107+
{
108+
bool ok = false;
109+
const QUrl url = QgsServerParameterDefinition::toUrl( ok );
110+
111+
if ( !ok )
112+
{
113+
raiseError();
114+
}
115+
116+
return url;
117+
}
118+
88119
QColor QgsWmsParameter::toColor() const
89120
{
90121
bool ok = false;
@@ -336,6 +367,9 @@ namespace QgsWms
336367
const QgsWmsParameter pSld( QgsWmsParameter::SLD );
337368
save( pSld );
338369

370+
const QgsWmsParameter pSldBody( QgsWmsParameter::SLD_BODY );
371+
save( pSldBody );
372+
339373
const QgsWmsParameter pLayer( QgsWmsParameter::LAYER );
340374
save( pLayer );
341375

@@ -470,6 +504,16 @@ namespace QgsWms
470504
: QgsWmsParameters()
471505
{
472506
load( parameters.urlQuery() );
507+
508+
const QString sld = mWmsParameters[ QgsWmsParameter::SLD ].toString();
509+
if ( !sld.isEmpty() )
510+
{
511+
const QString sldBody = mWmsParameters[ QgsWmsParameter::SLD ].loadUrl();
512+
if ( !sldBody.isEmpty() )
513+
{
514+
loadParameter( QgsWmsParameter::name( QgsWmsParameter::SLD_BODY ), sldBody );
515+
}
516+
}
473517
}
474518

475519
bool QgsWmsParameters::loadParameter( const QString &key, const QString &value )
@@ -1159,9 +1203,9 @@ namespace QgsWms
11591203
return mWmsParameters[ QgsWmsParameter::WMS_PRECISION ].toInt();
11601204
}
11611205

1162-
QString QgsWmsParameters::sld() const
1206+
QString QgsWmsParameters::sldBody() const
11631207
{
1164-
return mWmsParameters[ QgsWmsParameter::SLD ].toString();
1208+
return mWmsParameters[ QgsWmsParameter::SLD_BODY ].toString();
11651209
}
11661210

11671211
QStringList QgsWmsParameters::filters() const

src/server/services/wms/qgswmsparameters.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ namespace QgsWms
132132
SYMBOLWIDTH,
133133
OPACITIES,
134134
SLD,
135+
SLD_BODY,
135136
FI_POLYGON_TOLERANCE,
136137
FI_LINE_TOLERANCE,
137138
FI_POINT_TOLERANCE,
@@ -251,6 +252,22 @@ namespace QgsWms
251252
*/
252253
QColor toColor() const;
253254

255+
/**
256+
* Converts the parameter into an url.
257+
* \returns An url
258+
* \throws QgsBadRequestException Invalid parameter exception
259+
* \since QGIS 3.4
260+
*/
261+
QUrl toUrl() const;
262+
263+
/**
264+
* Loads the data associated to the parameter converted into an url.
265+
* \returns The content loaded
266+
* \throws QgsBadRequestException Invalid parameter exception
267+
* \since QGIS 3.4
268+
*/
269+
QString loadUrl() const;
270+
254271
/**
255272
* Raises an error in case of an invalid conversion.
256273
* \throws QgsBadRequestException Invalid parameter exception
@@ -377,10 +394,10 @@ namespace QgsWms
377394
QgsRectangle bboxAsRectangle() const;
378395

379396
/**
380-
* Returns SLD if defined or an empty string.
381-
* \returns sld
397+
* Returns SLD_body if defined or an empty string.
398+
* \returns sld body
382399
*/
383-
QString sld() const;
400+
QString sldBody() const;
384401

385402
/**
386403
* Returns the list of feature selection found in SELECTION parameter.

src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ namespace QgsWms
170170
QList<QgsMapLayer *> layers;
171171
QList<QgsWmsParametersLayer> params = mWmsParameters.layersParameters();
172172

173-
QString sld = mWmsParameters.sld();
173+
QString sld = mWmsParameters.sldBody();
174174
if ( !sld.isEmpty() )
175175
layers = sldStylizedLayers( sld );
176176
else
@@ -312,7 +312,7 @@ namespace QgsWms
312312
restorer.reset( new QgsLayerRestorer( mNicknameLayers.values() ) );
313313

314314
// init stylized layers according to LAYERS/STYLES or SLD
315-
QString sld = mWmsParameters.sld();
315+
QString sld = mWmsParameters.sldBody();
316316
if ( !sld.isEmpty() )
317317
{
318318
layers = sldStylizedLayers( sld );
@@ -661,7 +661,7 @@ namespace QgsWms
661661
restorer.reset( new QgsLayerRestorer( mNicknameLayers.values() ) );
662662

663663
// init stylized layers according to LAYERS/STYLES or SLD
664-
QString sld = mWmsParameters.sld();
664+
QString sld = mWmsParameters.sldBody();
665665
if ( !sld.isEmpty() )
666666
{
667667
layers = sldStylizedLayers( sld );
@@ -749,7 +749,7 @@ namespace QgsWms
749749
restorer.reset( new QgsLayerRestorer( mNicknameLayers.values() ) );
750750

751751
// init stylized layers according to LAYERS/STYLES or SLD
752-
QString sld = mWmsParameters.sld();
752+
QString sld = mWmsParameters.sldBody();
753753
if ( !sld.isEmpty() )
754754
{
755755
layers = sldStylizedLayers( sld );
@@ -903,7 +903,7 @@ namespace QgsWms
903903
restorer.reset( new QgsLayerRestorer( mNicknameLayers.values() ) );
904904

905905
// init stylized layers according to LAYERS/STYLES or SLD
906-
QString sld = mWmsParameters.sld();
906+
QString sld = mWmsParameters.sldBody();
907907
if ( !sld.isEmpty() )
908908
layers = sldStylizedLayers( sld );
909909
else

0 commit comments

Comments
 (0)