From d102404b5e6796727c0ae0c983cf016ab33ff27a Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Tue, 3 Oct 2017 15:20:43 +0200 Subject: [PATCH 1/2] [bugfix] Do not cache invalid WM(T)S responses The problem here was that in case of http->https redirect from a misconfigured server (that advertizes http and then redirects all request to https) all http redirect requests were cached, making all subsequent requests to the same url hit the 301 Moved Permanently reponse page intead of the redirected content. Fixes #16427 WMTS rendering problems in 2.18 and Master --- src/providers/wms/qgstilecache.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/providers/wms/qgstilecache.cpp b/src/providers/wms/qgstilecache.cpp index 823d08d83c6b..70c35a157c40 100644 --- a/src/providers/wms/qgstilecache.cpp +++ b/src/providers/wms/qgstilecache.cpp @@ -48,9 +48,12 @@ bool QgsTileCache::tile( const QUrl &url, QImage &image ) image = QImage::fromData( imageData ); // cache it as well (mutex is already locked) - sTileCache.insert( url, new QImage( image ) ); - - return true; + // Check for null because it could be a redirect (see: https://issues.qgis.org/issues/16427 ) + if ( ! image.isNull( ) ) + { + sTileCache.insert( url, new QImage( image ) ); + return true; + } } } return false; From afecc2101299dcf55eff7a9c0167da8b4fe3a096 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Tue, 3 Oct 2017 16:34:50 +0200 Subject: [PATCH 2/2] [:)] Make a developer happy --- src/providers/wms/qgstilecache.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/providers/wms/qgstilecache.cpp b/src/providers/wms/qgstilecache.cpp index 70c35a157c40..8a5973e74e52 100644 --- a/src/providers/wms/qgstilecache.cpp +++ b/src/providers/wms/qgstilecache.cpp @@ -33,10 +33,11 @@ void QgsTileCache::insertTile( const QUrl &url, const QImage &image ) bool QgsTileCache::tile( const QUrl &url, QImage &image ) { QMutexLocker locker( &sTileCacheMutex ); + bool success = false; if ( QImage *i = sTileCache.object( url ) ) { image = *i; - return true; + success = true; } else if ( QgsNetworkAccessManager::instance()->cache()->metaData( url ).isValid() ) { @@ -52,9 +53,9 @@ bool QgsTileCache::tile( const QUrl &url, QImage &image ) if ( ! image.isNull( ) ) { sTileCache.insert( url, new QImage( image ) ); - return true; + success = true; } } } - return false; + return success; }