Skip to content

Commit 30bf12c

Browse files
committedApr 5, 2019
[Bugfix][Server] QGIS Server removes empty string in style parameter even if it describes default style
In OGC WMS standard, the empty string represents the default style. QGIS Server when it parses the parameters, QGIS Server when it parses parameters it removes empty parts. When all requested styles are default ones it's equal to an empty parameter STYLE, as defined in the standard. When only one layer is requested, there is no issue with custom or default style. When multiple layers are requested and some with custom styles, because QGIS Server does not retain empty strings, it loses the layer / style match. To fix it, keeps empty parts for not empty styles parameters.
1 parent 070ca7a commit 30bf12c

File tree

10 files changed

+89
-9
lines changed

10 files changed

+89
-9
lines changed
 

‎python/server/auto_generated/qgsserverparameters.sip.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ Returns true if the parameter is valid, false otherwise.
4848
Converts the parameter into a string.
4949
%End
5050

51-
QStringList toStringList( char delimiter = ',' ) const;
51+
QStringList toStringList( char delimiter = ',', bool skipEmptyParts = true ) const;
5252
%Docstring
53-
Converts the parameter into a list of strings.
53+
Converts the parameter into a list of strings
5454

5555
:param delimiter: The character used for delimiting
56+
:param skipEmptyParts: To use QString.SkipEmptyParts for splitting
5657

5758
:return: A list of strings
5859
%End

‎src/server/qgsserverparameters.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,21 @@ QString QgsServerParameterDefinition::toString() const
6666
return mValue.toString();
6767
}
6868

69-
QStringList QgsServerParameterDefinition::toStringList( const char delimiter ) const
69+
QStringList QgsServerParameterDefinition::toStringList( const char delimiter, const bool skipEmptyParts ) const
7070
{
71-
return toString().split( delimiter, QString::SkipEmptyParts );
71+
if ( skipEmptyParts )
72+
{
73+
return toString().split( delimiter, QString::SkipEmptyParts );
74+
}
75+
else
76+
{
77+
QStringList list;
78+
if ( !toString().isEmpty() )
79+
{
80+
list = toString().split( delimiter, QString::KeepEmptyParts );
81+
}
82+
return list;
83+
}
7284
}
7385

7486
QList<QgsGeometry> QgsServerParameterDefinition::toGeomList( bool &ok, const char delimiter ) const

‎src/server/qgsserverparameters.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,12 @@ class SERVER_EXPORT QgsServerParameterDefinition
6565
QString toString() const;
6666

6767
/**
68-
* Converts the parameter into a list of strings.
68+
* Converts the parameter into a list of strings
6969
* \param delimiter The character used for delimiting
70+
* \param skipEmptyParts To use QString::SkipEmptyParts for splitting
7071
* \returns A list of strings
7172
*/
72-
QStringList toStringList( char delimiter = ',' ) const;
73+
QStringList toStringList( char delimiter = ',', bool skipEmptyParts = true ) const;
7374

7475
/**
7576
* Converts the parameter into a list of integers.

‎src/server/services/wms/qgswmsparameters.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ namespace QgsWms
4545
QgsServerParameterDefinition::raiseError( msg );
4646
}
4747

48+
QStringList QgsWmsParameter::toStyleList( const char delimiter ) const
49+
{
50+
return QgsServerParameterDefinition::toStringList( delimiter, false );
51+
}
52+
4853
QList<QgsGeometry> QgsWmsParameter::toGeomList( const char delimiter ) const
4954
{
5055
bool ok = true;
@@ -1287,8 +1292,8 @@ namespace QgsWms
12871292

12881293
QStringList QgsWmsParameters::allStyles() const
12891294
{
1290-
QStringList style = mWmsParameters[ QgsWmsParameter::STYLE ].toStringList();
1291-
const QStringList styles = mWmsParameters[ QgsWmsParameter::STYLES ].toStringList();
1295+
QStringList style = mWmsParameters[ QgsWmsParameter::STYLE ].toStyleList();
1296+
const QStringList styles = mWmsParameters[ QgsWmsParameter::STYLES ].toStyleList();
12921297
return style << styles;
12931298
}
12941299

@@ -1550,7 +1555,7 @@ namespace QgsWms
15501555
wmsParam = idParameter( QgsWmsParameter::STYLES, mapId );
15511556
if ( wmsParam.isValid() )
15521557
{
1553-
styles = wmsParam.toStringList();
1558+
styles = wmsParam.toStyleList();
15541559
}
15551560

15561561
QList<QgsWmsParametersLayer> lParams;

‎src/server/services/wms/qgswmsparameters.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,15 @@ namespace QgsWms
192192
*/
193193
bool isValid() const override;
194194

195+
/**
196+
* Converts the parameter into a list of strings and keeps empty parts
197+
* Default style value is an empty string
198+
* \param delimiter The character used for delimiting
199+
* \returns A list of strings
200+
* \since QGIS 3.8
201+
*/
202+
QStringList toStyleList( const char delimiter = ',' ) const;
203+
195204
/**
196205
* Converts the parameter into a list of geometries.
197206
* \param delimiter The character delimiting string geometries

‎tests/src/python/test_qgsserver_wms_getmap.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,58 @@ def test_wms_getmap_style(self):
723723
r, h = self._result(self._execute_request(qs))
724724
self._img_diff_error(r, h, "WMS_GetMap_StyleCustom")
725725

726+
# mixed custom and default style with STYLES parameter
727+
qs = "?" + "&".join(["%s=%s" % i for i in list({
728+
"MAP": urllib.parse.quote(self.projectPath),
729+
"SERVICE": "WMS",
730+
"VERSION": "1.1.1",
731+
"REQUEST": "GetMap",
732+
"LAYERS": "Country_Labels,Hello",
733+
"STYLES": "custom,",
734+
"FORMAT": "image/png",
735+
"BBOX": "-16817707,-4710778,5696513,14587125",
736+
"HEIGHT": "500",
737+
"WIDTH": "500",
738+
"CRS": "EPSG:3857"
739+
}.items())])
740+
741+
r, h = self._result(self._execute_request(qs))
742+
self._img_diff_error(r, h, "WMS_GetMap_StyleMixed")
743+
744+
qs = "?" + "&".join(["%s=%s" % i for i in list({
745+
"MAP": urllib.parse.quote(self.projectPath),
746+
"SERVICE": "WMS",
747+
"VERSION": "1.1.1",
748+
"REQUEST": "GetMap",
749+
"LAYERS": "Hello,Country_Labels",
750+
"STYLES": "default,custom",
751+
"FORMAT": "image/png",
752+
"BBOX": "-16817707,-4710778,5696513,14587125",
753+
"HEIGHT": "500",
754+
"WIDTH": "500",
755+
"CRS": "EPSG:3857"
756+
}.items())])
757+
758+
r, h = self._result(self._execute_request(qs))
759+
self._img_diff_error(r, h, "WMS_GetMap_StyleMixed_LayerOrder")
760+
761+
qs = "?" + "&".join(["%s=%s" % i for i in list({
762+
"MAP": urllib.parse.quote(self.projectPath),
763+
"SERVICE": "WMS",
764+
"VERSION": "1.1.1",
765+
"REQUEST": "GetMap",
766+
"LAYERS": "Hello,Country_Labels",
767+
"STYLES": ",custom",
768+
"FORMAT": "image/png",
769+
"BBOX": "-16817707,-4710778,5696513,14587125",
770+
"HEIGHT": "500",
771+
"WIDTH": "500",
772+
"CRS": "EPSG:3857"
773+
}.items())])
774+
775+
r, h = self._result(self._execute_request(qs))
776+
self._img_diff_error(r, h, "WMS_GetMap_StyleMixed_LayerOrder")
777+
726778
def test_wms_getmap_filter(self):
727779
qs = "?" + "&".join(["%s=%s" % i for i in list({
728780
"MAP": urllib.parse.quote(self.projectPath),
61.3 KB

Error rendering embedded code

Invalid image source.

28.3 KB

Error rendering embedded code

Invalid image source.

51.5 KB

Error rendering embedded code

Invalid image source.

Error rendering embedded code

Invalid image source.

0 commit comments

Comments
 (0)
Please sign in to comment.