Skip to content

Commit

Permalink
server: include xml processing instruction in feature info and server…
Browse files Browse the repository at this point in the history
… exceptions responses
  • Loading branch information
jef-n authored and github-actions[bot] committed Nov 17, 2022
1 parent 3b3967b commit fd10b6c
Show file tree
Hide file tree
Showing 45 changed files with 62 additions and 18 deletions.
7 changes: 6 additions & 1 deletion src/server/qgsserverexception.cpp
Expand Up @@ -30,6 +30,9 @@ QgsServerException::QgsServerException( const QString &message, int responseCode
QByteArray QgsServerException::formatResponse( QString &responseFormat ) const
{
QDomDocument doc;
const QDomNode header = doc.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"UTF-8\"" ) );
doc.appendChild( header );

QDomElement root = doc.createElement( QStringLiteral( "ServerException" ) );
doc.appendChild( root );
root.appendChild( doc.createTextNode( what() ) );
Expand All @@ -48,12 +51,14 @@ QgsOgcServiceException:: QgsOgcServiceException( const QString &code, const QStr
, mLocator( locator )
, mVersion( version )
{

}

QByteArray QgsOgcServiceException::formatResponse( QString &responseFormat ) const
{
QDomDocument doc;
const QDomNode header = doc.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"UTF-8\"" ) );
doc.appendChild( header );

QDomElement root = doc.createElement( QStringLiteral( "ServiceExceptionReport" ) );
root.setAttribute( QStringLiteral( "version" ), mVersion );
root.setAttribute( QStringLiteral( "xmlns" ), QStringLiteral( "http://www.opengis.net/ogc" ) );
Expand Down
2 changes: 2 additions & 0 deletions src/server/services/wms/qgswmsrenderer.cpp
Expand Up @@ -1412,6 +1412,8 @@ namespace QgsWms
}

QDomDocument result;
const QDomNode header = result.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"UTF-8\"" ) );
result.appendChild( header );

QDomElement getFeatureInfoElement;
QgsWmsParameters::Format infoFormat = mWmsParameters.infoFormat();
Expand Down
18 changes: 9 additions & 9 deletions tests/src/python/test_qgsserver.py
Expand Up @@ -417,8 +417,8 @@ def test_requestHandler(self):
request = QgsBufferServerRequest('http://somesite.com/somepath', QgsServerRequest.GetMethod, headers)
response = QgsBufferServerResponse()
self.server.handleRequest(request, response)
self.assertEqual(bytes(response.body()), b'<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
self.assertEqual(response.headers(), {'Content-Length': '156', 'Content-Type': 'text/xml; charset=utf-8'})
self.assertEqual(bytes(response.body()), b'<?xml version="1.0" encoding="UTF-8"?>\n<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
self.assertEqual(response.headers(), {'Content-Length': '195', 'Content-Type': 'text/xml; charset=utf-8'})
self.assertEqual(response.statusCode(), 500)

def test_requestHandlerProject(self):
Expand All @@ -427,8 +427,8 @@ def test_requestHandlerProject(self):
request = QgsBufferServerRequest('http://somesite.com/somepath', QgsServerRequest.GetMethod, headers)
response = QgsBufferServerResponse()
self.server.handleRequest(request, response, None)
self.assertEqual(bytes(response.body()), b'<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
self.assertEqual(response.headers(), {'Content-Length': '156', 'Content-Type': 'text/xml; charset=utf-8'})
self.assertEqual(bytes(response.body()), b'<?xml version="1.0" encoding="UTF-8"?>\n<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
self.assertEqual(response.headers(), {'Content-Length': '195', 'Content-Type': 'text/xml; charset=utf-8'})
self.assertEqual(response.statusCode(), 500)

def test_api(self):
Expand All @@ -437,23 +437,23 @@ def test_api(self):
# Test as a whole
header, body = self._execute_request("")
response = self.strip_version_xmlns(header + body)
expected = self.strip_version_xmlns(b'Content-Length: 156\nContent-Type: text/xml; charset=utf-8\n\n<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
expected = self.strip_version_xmlns(b'Content-Length: 195\nContent-Type: text/xml; charset=utf-8\n\n<?xml version="1.0" encoding="UTF-8"?>\n<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
self.assertEqual(response, expected)
expected = b'Content-Length: 156\nContent-Type: text/xml; charset=utf-8\n\n'
expected = b'Content-Length: 195\nContent-Type: text/xml; charset=utf-8\n\n'
self.assertEqual(header, expected)

# Test response when project is specified but without service
project = self.testdata_path + "test_project_wfs.qgs"
qs = '?MAP=%s' % (urllib.parse.quote(project))
header, body = self._execute_request(qs)
response = self.strip_version_xmlns(header + body)
expected = self.strip_version_xmlns(b'Content-Length: 326\nContent-Type: text/xml; charset=utf-8\n\n<ServiceExceptionReport >\n <ServiceException code="Service configuration error">Service unknown or unsupported. Current supported services (case-sensitive): WMS WFS WCS WMTS SampleService, or use a WFS3 (OGC API Features) endpoint</ServiceException>\n</ServiceExceptionReport>\n')
expected = self.strip_version_xmlns(b'Content-Length: 365\nContent-Type: text/xml; charset=utf-8\n\n<?xml version="1.0" encoding="UTF-8"?>\n<ServiceExceptionReport >\n <ServiceException code="Service configuration error">Service unknown or unsupported. Current supported services (case-sensitive): WMS WFS WCS WMTS SampleService, or use a WFS3 (OGC API Features) endpoint</ServiceException>\n</ServiceExceptionReport>\n')
self.assertEqual(response, expected)
expected = b'Content-Length: 326\nContent-Type: text/xml; charset=utf-8\n\n'
expected = b'Content-Length: 365\nContent-Type: text/xml; charset=utf-8\n\n'
self.assertEqual(header, expected)

# Test body
expected = self.strip_version_xmlns(b'<ServiceExceptionReport >\n <ServiceException code="Service configuration error">Service unknown or unsupported. Current supported services (case-sensitive): WMS WFS WCS WMTS SampleService, or use a WFS3 (OGC API Features) endpoint</ServiceException>\n</ServiceExceptionReport>\n')
expected = self.strip_version_xmlns(b'<?xml version="1.0" encoding="UTF-8"?>\n<ServiceExceptionReport >\n <ServiceException code="Service configuration error">Service unknown or unsupported. Current supported services (case-sensitive): WMS WFS WCS WMTS SampleService, or use a WFS3 (OGC API Features) endpoint</ServiceException>\n</ServiceExceptionReport>\n')
self.assertEqual(self.strip_version_xmlns(body), expected)

# WCS tests
Expand Down
2 changes: 1 addition & 1 deletion tests/src/python/test_qgsserver_landingpage.py
Expand Up @@ -191,7 +191,7 @@ def _test_error(uri):
request.setHeader('Accept', 'application/json')
response = QgsBufferServerResponse()
self.server.handleRequest(request, response)
self.assertEqual(bytes(response.body()), b'<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')
self.assertEqual(bytes(response.body()), b'<?xml version="1.0" encoding="UTF-8"?>\n<ServerException>Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file</ServerException>\n')

_test_error('http://server.qgis.org/index.json')
_test_error('http://server.qgis.org/index.html')
Expand Down
2 changes: 1 addition & 1 deletion tests/src/python/test_qgsserver_wms_getfeatureinfo.py
Expand Up @@ -874,7 +874,7 @@ def test_wrong_filter_throws(self):
'FEATURE_COUNT=10&FILTER=testlayer%20%C3%A8%C3%A9' +
urllib.parse.quote(':"XXXXXXXXXNAMEXXXXXXX" = \'two\''))

self.assertEqual(response_body.decode('utf8'), '<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">\n <ServiceException code="InvalidParameterValue">Filter not valid for layer testlayer èé: check the filter syntax and the field names.</ServiceException>\n</ServiceExceptionReport>\n')
self.assertEqual(response_body.decode('utf8'), '<?xml version="1.0" encoding="UTF-8"?>\n<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">\n <ServiceException code="InvalidParameterValue">Filter not valid for layer testlayer èé: check the filter syntax and the field names.</ServiceException>\n</ServiceExceptionReport>\n')

def testGetFeatureInfoFilterAllowedExtraTokens(self):
"""Test GetFeatureInfo with forbidden and extra tokens
Expand Down
2 changes: 1 addition & 1 deletion tests/src/python/test_qgsserver_wms_getmap.py
Expand Up @@ -950,7 +950,7 @@ def test_wms_getmap_filter(self):
}.items())])

expected = self.strip_version_xmlns(
b'<ServiceExceptionReport >\n <ServiceException code="Security">The filter string "name" IN ( \'africa , \'eurasia\' ) has been rejected because of security reasons. Note: Text strings have to be enclosed in single or double quotes. A space between each word / special character is mandatory. Allowed Keywords and special characters are IS,NOT,NULL,AND,OR,IN,=,&lt;,>=,>,>=,!=,\',\',(,),DMETAPHONE,SOUNDEX. Not allowed are semicolons in the filter expression.</ServiceException>\n</ServiceExceptionReport>\n')
b'<?xml version="1.0" encoding="UTF-8"?>\n<ServiceExceptionReport >\n <ServiceException code="Security">The filter string "name" IN ( \'africa , \'eurasia\' ) has been rejected because of security reasons. Note: Text strings have to be enclosed in single or double quotes. A space between each word / special character is mandatory. Allowed Keywords and special characters are IS,NOT,NULL,AND,OR,IN,=,&lt;,>=,>,>=,!=,\',\',(,),DMETAPHONE,SOUNDEX. Not allowed are semicolons in the filter expression.</ServiceException>\n</ServiceExceptionReport>\n')
r, h = self._result(self._execute_request(qs))

self.assertEqual(self.strip_version_xmlns(r), expected)
Expand Down
2 changes: 1 addition & 1 deletion tests/src/python/test_qgsserver_wms_getmap_size_project.py
Expand Up @@ -43,7 +43,7 @@ def setUp(self):
os.environ['QGIS_SERVER_WMS_MAX_HEIGHT'] = '6000'
super(TestQgsServerWMSGetMapSizeProject, self).setUp()
self.project = os.path.join(self.testdata_path, "test_project_with_size.qgs")
self.expected_too_big = self.strip_version_xmlns(b'<ServiceExceptionReport version="1.3.0" xmlns="http://www.opengis.net/ogc">\n <ServiceException code="InvalidParameterValue">The requested map size is too large</ServiceException>\n</ServiceExceptionReport>\n')
self.expected_too_big = self.strip_version_xmlns(b'<?xml version="1.0" encoding="UTF-8"?>\n<ServiceExceptionReport version="1.3.0" xmlns="http://www.opengis.net/ogc">\n <ServiceException code="InvalidParameterValue">The requested map size is too large</ServiceException>\n</ServiceExceptionReport>\n')

def test_wms_getmap_invalid_size_project(self):
# test the 6000 limit from server is overridden by the more conservative 5000 in the project
Expand Down
2 changes: 1 addition & 1 deletion tests/src/python/test_qgsserver_wms_getmap_size_server.py
Expand Up @@ -44,7 +44,7 @@ def setUpClass(self):

def setUp(self):
self.project = os.path.join(self.testdata_path, "test_project_with_size.qgs")
self.expected_too_big = self.strip_version_xmlns(b'<ServiceExceptionReport version="1.3.0" xmlns="http://www.opengis.net/ogc">\n <ServiceException code="InvalidParameterValue">The requested map size is too large</ServiceException>\n</ServiceExceptionReport>\n')
self.expected_too_big = self.strip_version_xmlns(b'<?xml version="1.0" encoding="UTF-8"?>\n<ServiceExceptionReport version="1.3.0" xmlns="http://www.opengis.net/ogc">\n <ServiceException code="InvalidParameterValue">The requested map size is too large</ServiceException>\n</ServiceExceptionReport>\n')

def test_wms_getmap_invalid_size_server(self):
# test the 3000 limit from server is overriding the less conservative 5000 in the project
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="0" maxx="0" miny="0" CRS="EPSG:3857" minx="0"/>
<Layer name="json">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="0" maxx="0" miny="0" CRS="EPSG:3857" minx="0"/>
<Layer name="json">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 229
Content-Length: 268
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.2.0">
<ServiceException code="RequestNotWellFormed">The EXP_FILTER expression has errors:
Function is not known</ServiceException>
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 320
Content-Length: 359
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.2.0">
<ServiceException code="RequestNotWellFormed">The EXP_FILTER expression has errors:
syntax error, unexpected NAME, expecting COMMA or ')'
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 254
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="testlayer2">
<Feature id="2">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
<ServiceException code="LayerNotQueryable">The layer 'groupwithoutshortname' is not queryable.</ServiceException>
</ServiceExceptionReport>
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport version="1.3.0" xmlns="http://www.opengis.net/ogc">
<ServiceException code="InvalidFormat">The format 'InvalidFormat' from INFO_FORMAT is not supported.</ServiceException>
</ServiceExceptionReport>
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="landsat">
<Attribute value="125" name="Band 1"/>
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
<ServiceException code="LayerNotQueryable">The layer 'testlayer3' is not queryable.</ServiceException>
</ServiceExceptionReport>
@@ -1,6 +1,7 @@
*****
Content-Type: application/vnd.ogc.gml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows" xmlns:qgs="http://qgis.org/gml" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd http://qgis.org/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
<gml:featureMember>
<qgs:testlayerèé fid="testlayer èé.2">
Expand Down
1 change: 1 addition & 0 deletions tests/testdata/qgis_server/wms_getfeatureinfo-text-gml.txt
@@ -1,6 +1,7 @@
*****
Content-Type: application/vnd.ogc.gml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows" xmlns:qgs="http://qgis.org/gml" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd http://qgis.org/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
<gml:featureMember>
<qgs:testlayerèé fid="testlayer èé.2">
Expand Down
1 change: 1 addition & 0 deletions tests/testdata/qgis_server/wms_getfeatureinfo-text-xml.txt
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="testlayer èé">
<Feature id="2">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 366
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="testlayer_thousands">
<Feature id="2">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="layer0">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="layer1">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="layer2">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="layer3">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 1400
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="layer4">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="layer3">
<Feature id="1">
Expand Down
1 change: 1 addition & 0 deletions tests/testdata/qgis_server/wms_getfeatureinfo_filter.txt
@@ -1,6 +1,7 @@
Content-Length: 577
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="5606017.87425818" maxx="913214.67407005" miny="5606017.87425818" CRS="EPSG:3857" minx="913214.67407005"/>
<Layer name="testlayer èé">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 577
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="5606017.87425818" maxx="913214.67407005" miny="5606017.87425818" CRS="EPSG:3857" minx="913214.67407005"/>
<Layer name="testlayer èé">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 577
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="44.90143568" maxx="8.20354699" miny="44.90143568" CRS="EPSG:4326" minx="8.20354699"/>
<Layer name="testlayer èé">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 151
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="0" maxx="0" miny="0" CRS="EPSG:3857" minx="0"/>
<Layer name="testlayer èé"/>
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 577
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="5606017.87425818" maxx="913214.67407005" miny="5606017.87425818" CRS="EPSG:3857" minx="913214.67407005"/>
<Layer name="testlayer èé">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 943
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="5606017.87425818" maxx="913214.67407005" miny="5606011.45647302" CRS="EPSG:3857" minx="913204.91280263"/>
<Layer name="testlayer èé">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 943
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<BoundingBox maxy="5606017.87425818" maxx="913214.67407005" miny="5606011.45647302" CRS="EPSG:3857" minx="913204.91280263"/>
<Layer name="testlayer èé">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 261
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="testlayer èé">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
Content-Length: 261
Content-Length: 300
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="testlayer èé">
<Feature id="1">
Expand Down
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
<ServiceException code="LayerNotQueryable">The layer 'no_query' is not queryable.</ServiceException>
</ServiceExceptionReport>
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
<ServiceException code="LayerNotDefined">The layer 'InvalidLayer' does not exist.</ServiceException>
</ServiceExceptionReport>
@@ -1,6 +1,7 @@
*****
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<GetFeatureInfoResponse>
<Layer name="ls2d">
</GetFeatureInfoResponse>

0 comments on commit fd10b6c

Please sign in to comment.