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&amp;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



_______________________________________________
QGIS-Developer mailing list
QGIS-Developer@lists.osgeo.org
List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer

Reply via email to