Skip to content

Commit 018d2a2

Browse files
committedApr 21, 2017
Server: pass full url string and data to handleRequest()
Fix tests by removing passing url pieces from environment
1 parent 11bb234 commit 018d2a2

File tree

7 files changed

+106
-124
lines changed

7 files changed

+106
-124
lines changed
 

‎python/server/qgsserver.sip

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,11 @@ class QgsServer
190190
* but can be also passed in args and in this case overrides the environment
191191
* variable.
192192
*
193-
* @param queryString QString containing the query string
193+
* @param requestMethod QString that indicates the method. Only "GET" or "POST" are supported.
194+
* @param data array of bytes containing post data
194195
* @return the response headers and body QPair of QByteArray
195196
*/
196-
QPair<QByteArray, QByteArray> handleRequest( const QString& queryString );
197+
QPair<QByteArray, QByteArray> handleRequest( const QString &urlstr, const QString &requestMethod = QString(), const char *data = nullptr );
197198

198199
/** Returns a pointer to the server interface */
199200
QgsServerInterface* serverInterface();

‎src/server/qgsserver.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ void QgsServer::handleRequest( QgsServerRequest &request, QgsServerResponse &res
426426
}
427427
}
428428

429-
QPair<QByteArray, QByteArray> QgsServer::handleRequest( const QString &queryString )
429+
QPair<QByteArray, QByteArray> QgsServer::handleRequest( const QString &urlstr, const QString &requestMethod, const char *data )
430430
{
431431
/*
432432
* This is mainly for python bindings, passing QUERY_STRING
@@ -435,26 +435,24 @@ QPair<QByteArray, QByteArray> QgsServer::handleRequest( const QString &queryStri
435435
* XXX To be removed because query string is now handled in QgsServerRequest
436436
*
437437
*/
438-
if ( ! queryString.isEmpty() )
439-
putenv( QStringLiteral( "QUERY_STRING" ), queryString );
438+
QUrl url( urlstr );
440439

441440
QgsServerRequest::Method method = QgsServerRequest::GetMethod;
442441
QByteArray ba;
443442

444443
// XXX This is mainly used in tests
445-
char *requestMethod = getenv( "REQUEST_METHOD" );
446-
if ( requestMethod && strcmp( requestMethod, "POST" ) == 0 )
444+
if ( !requestMethod.isEmpty() && requestMethod.compare( QStringLiteral( "POST" ), Qt::CaseInsensitive ) == 0 )
447445
{
448446
method = QgsServerRequest::PostMethod;
449-
const char *data = getenv( "REQUEST_BODY" );
450447
if ( data )
451448
{
452449
ba.append( data );
453450
}
454451
}
455-
456-
QUrl url;
457-
url.setQuery( queryString );
452+
else if ( !requestMethod.isEmpty() && requestMethod.compare( QStringLiteral( "GET" ), Qt::CaseInsensitive ) != 0 )
453+
{
454+
throw QgsServerException( QStringLiteral( "Invalid method in handleRequest(): only GET or POST is supported" ) );
455+
}
458456

459457
QgsBufferServerRequest request( url, method, &ba );
460458
QgsBufferServerResponse response;

‎src/server/qgsserver.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,12 @@ class SERVER_EXPORT QgsServer
7878
* but can be also passed in args and in this case overrides the environment
7979
* variable.
8080
*
81-
* \param queryString QString containing the query string
81+
* \param urlstr QString containing the request url (simple quely string must be preceded by '?')
82+
* \param requestMethod QString that indicates the method. Only "GET" or "POST" are supported.
83+
* \param data array of bytes containing post data
8284
* \returns the response headers and body QPair of QByteArray
8385
*/
84-
QPair<QByteArray, QByteArray> handleRequest( const QString &queryString );
86+
QPair<QByteArray, QByteArray> handleRequest( const QString &urlstr, const QString &requestMethod = QString(), const char *data = nullptr );
8587

8688
//! Returns a pointer to the server interface
8789
QgsServerInterfaceImpl *serverInterface() { return sServerInterface; }

‎tests/src/python/qgis_wrapped_server.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,7 @@ def do_GET(self):
104104
# CGI vars:
105105
for k, v in self.headers.items():
106106
qgs_server.putenv('HTTP_%s' % k.replace(' ', '-').replace('-', '_').replace(' ', '-').upper(), v)
107-
qgs_server.putenv('SERVER_PORT', str(self.server.server_port))
108-
if https:
109-
qgs_server.putenv('HTTPS', 'ON')
110-
qgs_server.putenv('SERVER_NAME', self.server.server_name)
111-
qgs_server.putenv('REQUEST_URI', self.path)
112-
parsed_path = urllib.parse.urlparse(self.path)
113-
headers, body = qgs_server.handleRequest(parsed_path.query)
107+
headers, body = qgs_server.handleRequest(self.path)
114108
headers_dict = dict(h.split(': ', 1) for h in headers.decode().split('\n') if h)
115109
try:
116110
self.send_response(int(headers_dict['Status'].split(' ')[0]))

‎tests/src/python/test_qgsserver.py

Lines changed: 48 additions & 51 deletions
Large diffs are not rendered by default.

‎tests/src/python/test_qgsserver_accesscontrol.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,9 +1372,10 @@ def test_wfs_getfeature_project_subsetstring3(self):
13721372
str(response).find("<qgs:pk>") != -1,
13731373
"Project based layer subsetString not respected in GetFeature with restricted access\n%s" % response)
13741374

1375-
def _handle_request(self, restricted, *args):
1375+
def _handle_request(self, restricted, query_string, **kwargs):
13761376
self._accesscontrol._active = restricted
1377-
result = self._result(self._server.handleRequest(*args))
1377+
qs = "?" + query_string if query_string is not None else None
1378+
result = self._result(self._server.handleRequest(qs, **kwargs))
13781379
return result
13791380

13801381
def _result(self, data):
@@ -1388,34 +1389,22 @@ def _result(self, data):
13881389
return data[1], headers
13891390

13901391
def _get_fullaccess(self, query_string):
1391-
self._server.putenv("REQUEST_METHOD", "GET")
13921392
result = self._handle_request(False, query_string)
1393-
self._server.putenv("REQUEST_METHOD", '')
13941393
return result
13951394

13961395
def _get_restricted(self, query_string):
1397-
self._server.putenv("REQUEST_METHOD", "GET")
13981396
result = self._handle_request(True, query_string)
1399-
self._server.putenv("REQUEST_METHOD", '')
14001397
return result
14011398

14021399
def _post_fullaccess(self, data, query_string=None):
1403-
self._server.putenv("REQUEST_METHOD", "POST")
1404-
self._server.putenv("REQUEST_BODY", data)
14051400
self._server.putenv("QGIS_PROJECT_FILE", self.projectPath)
1406-
result = self._handle_request(False, query_string)
1407-
self._server.putenv("REQUEST_METHOD", '')
1408-
self._server.putenv("REQUEST_BODY", '')
1401+
result = self._handle_request(False, query_string, requestMethod='POST', data=data)
14091402
self._server.putenv("QGIS_PROJECT_FILE", '')
14101403
return result
14111404

14121405
def _post_restricted(self, data, query_string=None):
1413-
self._server.putenv("REQUEST_METHOD", "POST")
1414-
self._server.putenv("REQUEST_BODY", data)
14151406
self._server.putenv("QGIS_PROJECT_FILE", self.projectPath)
1416-
result = self._handle_request(True, query_string)
1417-
self._server.putenv("REQUEST_METHOD", '')
1418-
self._server.putenv("REQUEST_BODY", '')
1407+
result = self._handle_request(True, query_string, requestMethod='POST', data=data)
14191408
self._server.putenv("QGIS_PROJECT_FILE", '')
14201409
return result
14211410

@@ -1437,6 +1426,7 @@ def _img_diff_error(self, response, headers, image, max_diff=10, max_size_diff=Q
14371426
self.assertEqual(
14381427
headers.get("Content-Type"), "image/png",
14391428
"Content type is wrong: %s" % headers.get("Content-Type"))
1429+
14401430
test, report = self._img_diff(response, image, max_diff, max_size_diff)
14411431

14421432
with open(os.path.join(tempfile.gettempdir(), image + "_result.png"), "rb") as rendered_file:

‎tests/src/python/test_qgsserver_security.py

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -306,51 +306,51 @@ def check_service_exception_report(self, d):
306306
return False
307307

308308
def handle_request_wfs_getfeature_filter(self, filter_xml):
309-
qs = "&".join(["%s=%s" % i for i in list({
310-
"MAP": urllib.parse.quote(self.project),
311-
"SERVICE": "WFS",
312-
"VERSION": "1.1.1",
313-
"REQUEST": "GetFeature",
314-
"TYPENAME": "point",
315-
"STYLES": "",
316-
"CRS": "EPSG:32613",
317-
"FILTER": filter_xml}.items())])
309+
qs = "?" + "&".join(["%s=%s" % i for i in list({
310+
"MAP": urllib.parse.quote(self.project),
311+
"SERVICE": "WFS",
312+
"VERSION": "1.1.1",
313+
"REQUEST": "GetFeature",
314+
"TYPENAME": "point",
315+
"STYLES": "",
316+
"CRS": "EPSG:32613",
317+
"FILTER": filter_xml}.items())])
318318

319319
return self.server.handleRequest(qs)
320320

321321
def handle_request_wms_getfeatureinfo(self, filter_sql):
322-
qs = "&".join(["%s=%s" % i for i in list({
323-
"MAP": urllib.parse.quote(self.project),
324-
"SERVICE": "WMS",
325-
"VERSION": "1.1.1",
326-
"REQUEST": "GetFeatureInfo",
327-
"QUERY_LAYERS": "point",
328-
"LAYERS": "point",
329-
"STYLES": "",
330-
"FORMAT": "image/png",
331-
"HEIGHT": "500",
332-
"WIDTH": "500",
333-
"BBOX": "606171,4822867,612834,4827375",
334-
"CRS": "EPSG:32613",
335-
"FILTER": filter_sql}.items())])
322+
qs = "?" + "&".join(["%s=%s" % i for i in list({
323+
"MAP": urllib.parse.quote(self.project),
324+
"SERVICE": "WMS",
325+
"VERSION": "1.1.1",
326+
"REQUEST": "GetFeatureInfo",
327+
"QUERY_LAYERS": "point",
328+
"LAYERS": "point",
329+
"STYLES": "",
330+
"FORMAT": "image/png",
331+
"HEIGHT": "500",
332+
"WIDTH": "500",
333+
"BBOX": "606171,4822867,612834,4827375",
334+
"CRS": "EPSG:32613",
335+
"FILTER": filter_sql}.items())])
336336

337337
return self._result(self.server.handleRequest(qs))
338338

339339
def handle_request_wms_getmap(self, sld):
340-
qs = "&".join(["%s=%s" % i for i in list({
341-
"MAP": urllib.parse.quote(self.project),
342-
"SERVICE": "WMS",
343-
"VERSION": "1.0.0",
344-
"REQUEST": "GetMap",
345-
"QUERY_LAYERS": "point",
346-
"LAYERS": "point",
347-
"STYLES": "",
348-
"FORMAT": "image/png",
349-
"HEIGHT": "500",
350-
"WIDTH": "500",
351-
"BBOX": "606171,4822867,612834,4827375",
352-
"CRS": "EPSG:32613",
353-
"SLD": sld}.items())])
340+
qs = "?" + "&".join(["%s=%s" % i for i in list({
341+
"MAP": urllib.parse.quote(self.project),
342+
"SERVICE": "WMS",
343+
"VERSION": "1.0.0",
344+
"REQUEST": "GetMap",
345+
"QUERY_LAYERS": "point",
346+
"LAYERS": "point",
347+
"STYLES": "",
348+
"FORMAT": "image/png",
349+
"HEIGHT": "500",
350+
"WIDTH": "500",
351+
"BBOX": "606171,4822867,612834,4827375",
352+
"CRS": "EPSG:32613",
353+
"SLD": sld}.items())])
354354

355355
return self._result(self.server.handleRequest(qs))
356356

0 commit comments

Comments
 (0)
Please sign in to comment.