[QGIS-Developer] Cannot load WMS capabilities from WMS provider in QGIS3 from python

David Marteau dmarteau at 3liz.com
Mon Jan 15 03:48:53 PST 2018


Hi,

We hit a very nasty problem when trying to load projects with wms layer defined from python: loading capabilities fail with timeout error, thus preventing creating any project or layer from python.

The problem has been verified in Debian, Ubuntu and fresh OSX build from master branch.

We have somehow been able to reduce the problem to the loading of the wmsprovider. The following python code provide a minimal example for reproducing the problem:

===================8<==============================
import os
import logging

from qgis.core import QgsApplication, QgsMessageLog
from qgis.core import QgsProject, QgsProviderRegistry

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# No Display
os.environ['QT_QPA_PLATFORM'] = 'offscreen'

qgis_application = QgsApplication([], False )
qgis_application.setPrefixPath('/usr/local', True)
qgis_application.initQgis()

# Log any messages
def writelogmessage(message, tag, level):
    arg = '{}: {}'.format( tag, message )
    if level == QgsMessageLog.WARNING:
        logger.warning(arg)
    elif level == QgsMessageLog.CRITICAL:
        logger.error(arg)
    else:
        logger.info(arg)

messageLog = QgsApplication.messageLog()
messageLog.messageReceived.connect( writelogmessage )


wmsuri = ("contextualWMSLegend=0&crs=EPSG:4326&dpiMode=7&featureCount=10&format=image/jpeg"
          "&layers=s2cloudless&styles&tileMatrixSet=s2cloudless-wmsc-14"
          "&url=http://tiles.maps.eox.at/wms?" )

# Request Timeout
provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri )

qgis_application.exitQgis()
del qgis_application
====================8<=============================

This fail with the following qgis errors

WMS: Download of capabilities failed: Operation canceled
Network: Network request https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=GetCapabilities <https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=GetCapabilities> timed out

Note that the following piece of code work perfectly and proceed the request without problems:

==============================================================
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtNetwork import QNetworkRequest

url = QUrl("https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=GetCapabilities")

request = QNetworkRequest()
request.setUrl(url)
manager = QgsNetworkAccessManager.instance()
replyObject = manager.get(request)

loop = QEventLoop()
def onfinish(  ):
    print("Qt Return Code:",replyObject.attribute(QNetworkRequest.HttpStatusCodeAttribute))
    answer = replyObject.readAll();
    print(answer[:200],"\n")
    loop.quit()

replyObject.finished.connect( onfinish )
loop.exec()
==============================================================

So this is not fundamentally a problem with the network manager.

At this point we are stuck because the provider do not do something fundamentally different from the last piece of code, 

In qgis code the request execution stall at: https://github.com/qgis/QGIS/blob/master/src/providers/wms/qgswmscapabilities.cpp#L1964
 
The problem does not occur if we run the project from the Desktop application: we think that there is a problem with the QEventLoop execution but we have no clue atm to check this assumption.

So if anybody have any idea on the subject…...

Regards
David



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20180115/e5525542/attachment-0001.html>


More information about the QGIS-Developer mailing list