Skip to content

Commit 05885fa

Browse files
committed
Fix crash on QgsServer exit
QgsApplication must be gracefully exited under Qt5 or a segfault occurs due to the auth manager not releasing database connections Also fix crash in QgsServerAccessControl test by explicitly deleting the server instance to trigger this shutdown
1 parent d49b656 commit 05885fa

File tree

2 files changed

+34
-25
lines changed

2 files changed

+34
-25
lines changed

src/server/qgsserver.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ QgsServer::QgsServer()
9191

9292
QgsServer::~QgsServer()
9393
{
94+
if ( sQgsApplication )
95+
sQgsApplication->exitQgis();
9496
}
9597

9698

tests/src/python/test_qgsserver_accesscontrol.py

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,21 @@ def cacheKey(self):
158158
return "r" if self._active else "f"
159159

160160

161-
server = QgsServer()
162-
server.handleRequest()
163-
server_iface = server.serverInterface()
164-
accesscontrol = RestrictedAccessControl(server_iface)
165-
server_iface.registerAccessControl(accesscontrol, 100)
161+
class TestQgsServerAccessControl(unittest.TestCase):
166162

163+
@classmethod
164+
def setUpClass(cls):
165+
"""Run before all tests"""
166+
cls._server = QgsServer()
167+
cls._server.handleRequest()
168+
cls._server_iface = cls._server.serverInterface()
169+
cls._accesscontrol = RestrictedAccessControl(cls._server_iface)
170+
cls._server_iface.registerAccessControl(cls._accesscontrol, 100)
167171

168-
class TestQgsServerAccessControl(unittest.TestCase):
172+
@classmethod
173+
def tearDownClass(cls):
174+
"""Run after all tests"""
175+
del cls._server
169176

170177
def setUp(self):
171178
self.testdata_path = unitTestDataPath("qgis_server_accesscontrol")
@@ -1368,13 +1375,13 @@ def test_wfs_getfeature_project_subsetstring3(self):
13681375
"Project based layer subsetString not respected in GetFeature with restricted access\n%s" % response)
13691376

13701377
def _handle_request(self, restricted, *args):
1371-
accesscontrol._active = restricted
1372-
result = self._result(server.handleRequest(*args))
1378+
self._accesscontrol._active = restricted
1379+
result = self._result(self._server.handleRequest(*args))
13731380
return result
13741381

13751382
def _result(self, data):
13761383
headers = {}
1377-
for line in data[0].split("\n"):
1384+
for line in data[0].decode('UTF-8').split("\n"):
13781385
if line != "":
13791386
header = line.split(":")
13801387
self.assertEqual(len(header), 2, line)
@@ -1383,35 +1390,35 @@ def _result(self, data):
13831390
return data[1], headers
13841391

13851392
def _get_fullaccess(self, query_string):
1386-
server.putenv("REQUEST_METHOD", "GET")
1393+
self._server.putenv("REQUEST_METHOD", "GET")
13871394
result = self._handle_request(False, query_string)
1388-
server.putenv("REQUEST_METHOD", '')
1395+
self._server.putenv("REQUEST_METHOD", '')
13891396
return result
13901397

13911398
def _get_restricted(self, query_string):
1392-
server.putenv("REQUEST_METHOD", "GET")
1399+
self._server.putenv("REQUEST_METHOD", "GET")
13931400
result = self._handle_request(True, query_string)
1394-
server.putenv("REQUEST_METHOD", '')
1401+
self._server.putenv("REQUEST_METHOD", '')
13951402
return result
13961403

13971404
def _post_fullaccess(self, data, query_string=None):
1398-
server.putenv("REQUEST_METHOD", "POST")
1399-
server.putenv("REQUEST_BODY", data)
1400-
server.putenv("QGIS_PROJECT_FILE", self.projectPath)
1405+
self._server.putenv("REQUEST_METHOD", "POST")
1406+
self._server.putenv("REQUEST_BODY", data)
1407+
self._server.putenv("QGIS_PROJECT_FILE", self.projectPath)
14011408
result = self._handle_request(False, query_string)
1402-
server.putenv("REQUEST_METHOD", '')
1403-
server.putenv("REQUEST_BODY", '')
1404-
server.putenv("QGIS_PROJECT_FILE", '')
1409+
self._server.putenv("REQUEST_METHOD", '')
1410+
self._server.putenv("REQUEST_BODY", '')
1411+
self._server.putenv("QGIS_PROJECT_FILE", '')
14051412
return result
14061413

14071414
def _post_restricted(self, data, query_string=None):
1408-
server.putenv("REQUEST_METHOD", "POST")
1409-
server.putenv("REQUEST_BODY", data)
1410-
server.putenv("QGIS_PROJECT_FILE", self.projectPath)
1415+
self._server.putenv("REQUEST_METHOD", "POST")
1416+
self._server.putenv("REQUEST_BODY", data)
1417+
self._server.putenv("QGIS_PROJECT_FILE", self.projectPath)
14111418
result = self._handle_request(True, query_string)
1412-
server.putenv("REQUEST_METHOD", '')
1413-
server.putenv("REQUEST_BODY", '')
1414-
server.putenv("QGIS_PROJECT_FILE", '')
1419+
self._server.putenv("REQUEST_METHOD", '')
1420+
self._server.putenv("REQUEST_BODY", '')
1421+
self._server.putenv("QGIS_PROJECT_FILE", '')
14151422
return result
14161423

14171424
def _img_diff(self, image, control_image, max_diff, max_size_diff=QSize()):

0 commit comments

Comments
 (0)