Skip to content

Commit 9c340d7

Browse files
committed
[FEATURE] cache WMS capabililies
1 parent bf79ecc commit 9c340d7

File tree

7 files changed

+82
-19
lines changed

7 files changed

+82
-19
lines changed

src/app/qgsoptions.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,9 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl ) :
262262
mNetworkTimeoutSpinBox->setValue( settings.value( "/qgis/networkAndProxy/networkTimeout", "60000" ).toInt() );
263263
leUserAgent->setText( settings.value( "/qgis/networkAndProxy/userAgent", "Mozilla/5.0" ).toString() );
264264

265+
// WMS capabilities expiry time
266+
mDefaultCapabilitiesExpirySpinBox->setValue( settings.value( "/qgis/defaultCapabilitiesExpiry", "24" ).toInt() );
267+
265268
// WMS/WMS-C tile expiry time
266269
mDefaultTileExpirySpinBox->setValue( settings.value( "/qgis/defaultTileExpiry", "24" ).toInt() );
267270

@@ -1041,6 +1044,9 @@ void QgsOptions::saveOptions()
10411044
settings.setValue( "/qgis/networkAndProxy/networkTimeout", mNetworkTimeoutSpinBox->value() );
10421045
settings.setValue( "/qgis/networkAndProxy/userAgent", leUserAgent->text() );
10431046

1047+
// WMS capabiltiies expiry time
1048+
settings.setValue( "/qgis/defaultCapabilitiesExpiry", mDefaultCapabilitiesExpirySpinBox->value() );
1049+
10441050
// WMS/WMS-C tile expiry time
10451051
settings.setValue( "/qgis/defaultTileExpiry", mDefaultTileExpirySpinBox->value() );
10461052

src/providers/wms/qgswmscapabilities.cpp

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include <QFile>
66
#include <QDir>
7+
#include <QNetworkCacheMetaData>
8+
#include <QSettings>
79

810
#include "qgscoordinatetransform.h"
911
#include "qgsdatasourceuri.h"
@@ -709,11 +711,14 @@ void QgsWmsCapabilities::parseLayer( QDomElement const & e, QgsWmsLayerProperty&
709711
//QgsDebugMsg( "entering." );
710712

711713
// TODO: Delete this stanza completely, depending on success of "Inherit things into the sublayer" below.
712-
// // enforce WMS non-inheritance rules
713-
// layerProperty.name = QString::null;
714-
// layerProperty.title = QString::null;
715-
// layerProperty.abstract = QString::null;
716-
// layerProperty.keywordList.clear();
714+
#if 0
715+
// enforce WMS non-inheritance rules
716+
layerProperty.name = QString::null;
717+
layerProperty.title = QString::null;
718+
layerProperty.abstract = QString::null;
719+
layerProperty.keywordList.clear();
720+
#endif
721+
717722
layerProperty.orderId = ++mLayerCount;
718723
layerProperty.queryable = e.attribute( "queryable" ).toUInt();
719724
layerProperty.cascaded = e.attribute( "cascaded" ).toUInt();
@@ -1860,20 +1865,22 @@ int QgsWmsCapabilities::identifyCapabilities() const
18601865

18611866
// -----------------
18621867

1863-
QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload( QObject *parent )
1868+
QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload( bool forceRefresh, QObject *parent )
18641869
: QObject( parent )
18651870
, mCapabilitiesReply( 0 )
18661871
, mIsAborted( false )
1872+
, mForceRefresh( forceRefresh )
18671873
{
18681874
connectManager();
18691875
}
18701876

1871-
QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload( const QString& baseUrl, const QgsWmsAuthorization& auth, QObject *parent )
1877+
QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload( const QString& baseUrl, const QgsWmsAuthorization& auth, bool forceRefresh, QObject *parent )
18721878
: QObject( parent )
18731879
, mBaseUrl( baseUrl )
18741880
, mAuth( auth )
18751881
, mCapabilitiesReply( 0 )
18761882
, mIsAborted( false )
1883+
, mForceRefresh( forceRefresh )
18771884
{
18781885
connectManager();
18791886
}
@@ -1902,7 +1909,7 @@ bool QgsWmsCapabilitiesDownload::downloadCapabilities( const QString& baseUrl, c
19021909

19031910
bool QgsWmsCapabilitiesDownload::downloadCapabilities()
19041911
{
1905-
QgsDebugMsg( "entering." );
1912+
QgsDebugMsg( QString( "entering: forceRefresh=%1" ).arg( mForceRefresh ) );
19061913
abort(); // cancel previous
19071914
mIsAborted = false;
19081915

@@ -1923,7 +1930,7 @@ bool QgsWmsCapabilitiesDownload::downloadCapabilities()
19231930
QgsMessageLog::logMessage( mError, tr( "WMS" ) );
19241931
return false;
19251932
}
1926-
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork );
1933+
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, mForceRefresh ? QNetworkRequest::PreferNetwork : QNetworkRequest::PreferCache );
19271934
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
19281935

19291936
connect( QgsNetworkAccessManager::instance(), SIGNAL( requestSent( QNetworkReply *, QObject * ) ),
@@ -2014,13 +2021,13 @@ void QgsWmsCapabilitiesDownload::capabilitiesReplyFinished()
20142021
emit downloadFinished();
20152022
return;
20162023
}
2017-
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork );
2024+
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, mForceRefresh ? QNetworkRequest::PreferNetwork : QNetworkRequest::PreferCache );
20182025
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
20192026

20202027
mCapabilitiesReply->deleteLater();
20212028
mCapabilitiesReply = 0;
20222029

2023-
QgsDebugMsg( QString( "redirected getcapabilities: %1" ).arg( redirect.toString() ) );
2030+
QgsDebugMsg( QString( "redirected getcapabilities: %1 forceRefresh=%2" ).arg( redirect.toString() ).arg( mForceRefresh ) );
20242031
//mCapabilitiesReply = QgsNetworkAccessManager::instance()->get( request );
20252032
connect( QgsNetworkAccessManager::instance(),
20262033
SIGNAL( requestSent( QNetworkReply *, QObject * ) ),
@@ -2031,6 +2038,37 @@ void QgsWmsCapabilitiesDownload::capabilitiesReplyFinished()
20312038
}
20322039
else
20332040
{
2041+
const QgsNetworkAccessManager *nam = QgsNetworkAccessManager::instance();
2042+
2043+
if ( nam->cache() )
2044+
{
2045+
QNetworkCacheMetaData cmd = nam->cache()->metaData( mCapabilitiesReply->request().url() );
2046+
2047+
QNetworkCacheMetaData::RawHeaderList hl;
2048+
Q_FOREACH ( const QNetworkCacheMetaData::RawHeader &h, cmd.rawHeaders() )
2049+
{
2050+
if ( h.first != "Cache-Control" )
2051+
hl.append( h );
2052+
}
2053+
cmd.setRawHeaders( hl );
2054+
2055+
QgsDebugMsg( QString( "expirationDate:%1" ).arg( cmd.expirationDate().toString() ) );
2056+
if ( cmd.expirationDate().isNull() )
2057+
{
2058+
QSettings s;
2059+
cmd.setExpirationDate( QDateTime::currentDateTime().addSecs( s.value( "/qgis/defaultCapabilitiesExpiry", "24" ).toInt() * 60 * 60 ) );
2060+
}
2061+
2062+
nam->cache()->updateMetaData( cmd );
2063+
}
2064+
else
2065+
{
2066+
QgsDebugMsg( "No cache for capabilites!" );
2067+
}
2068+
2069+
bool fromCache = mCapabilitiesReply->attribute( QNetworkRequest::SourceIsFromCacheAttribute ).toBool();
2070+
QgsDebugMsg( QString( "Capabilities reply was cached: %1" ).arg( fromCache ) );
2071+
20342072
mHttpCapabilitiesResponse = mCapabilitiesReply->readAll();
20352073

20362074
if ( mHttpCapabilitiesResponse.isEmpty() )

src/providers/wms/qgswmscapabilities.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,9 +696,9 @@ class QgsWmsCapabilitiesDownload : public QObject
696696
Q_OBJECT
697697

698698
public:
699-
explicit QgsWmsCapabilitiesDownload( QObject* parent = 0 );
699+
explicit QgsWmsCapabilitiesDownload( bool forceRefresh, QObject* parent = 0 );
700700

701-
QgsWmsCapabilitiesDownload( const QString& baseUrl, const QgsWmsAuthorization& auth, QObject* parent = 0 );
701+
QgsWmsCapabilitiesDownload( const QString& baseUrl, const QgsWmsAuthorization& auth, bool forceRefresh, QObject* parent = 0 );
702702

703703
virtual ~QgsWmsCapabilitiesDownload();
704704

@@ -751,6 +751,7 @@ class QgsWmsCapabilitiesDownload : public QObject
751751
QByteArray mHttpCapabilitiesResponse;
752752

753753
bool mIsAborted;
754+
bool mForceRefresh;
754755

755756
private:
756757
void connectManager();

src/providers/wms/qgswmsdataitems.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, Q
3030
, mCapabilitiesDownload( 0 )
3131
{
3232
mIconName = "mIconConnect.png";
33-
mCapabilitiesDownload = new QgsWmsCapabilitiesDownload();
33+
mCapabilitiesDownload = new QgsWmsCapabilitiesDownload( false );
3434
}
3535

3636
QgsWMSConnectionItem::~QgsWMSConnectionItem()

src/providers/wms/qgswmsprovider.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -874,13 +874,13 @@ void QgsWmsProvider::readBlock( int bandNo, QgsRectangle const & viewExtent, in
874874
}
875875

876876

877-
bool QgsWmsProvider::retrieveServerCapabilities( bool /*forceRefresh*/ )
877+
bool QgsWmsProvider::retrieveServerCapabilities( bool forceRefresh )
878878
{
879-
QgsDebugMsg( "entering." );
879+
QgsDebugMsg( QString( "entering: forceRefresh=%1" ).arg( forceRefresh ) );
880880

881881
if ( !mCaps.isValid() )
882882
{
883-
QgsWmsCapabilitiesDownload downloadCaps( mSettings.baseUrl(), mSettings.authorization() );
883+
QgsWmsCapabilitiesDownload downloadCaps( mSettings.baseUrl(), mSettings.authorization(), forceRefresh );
884884
if ( !downloadCaps.downloadCapabilities() )
885885
{
886886
mErrorFormat = "text/plain";
@@ -3693,7 +3693,7 @@ QgsWmsLegendDownloadHandler::startUrl( const QUrl& url )
36933693

36943694
QNetworkRequest request( url );
36953695
mSettings.authorization().setAuthorization( request );
3696-
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork );
3696+
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
36973697
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
36983698

36993699
mReply = mNetworkAccessManager.get( request );

src/providers/wms/qgswmssourceselect.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ void QgsWMSSourceSelect::on_btnConnect_clicked()
446446
return;
447447
}
448448

449-
QgsWmsCapabilitiesDownload capDownload( wmsSettings.baseUrl(), wmsSettings.authorization() );
449+
QgsWmsCapabilitiesDownload capDownload( wmsSettings.baseUrl(), wmsSettings.authorization(), true );
450450
connect( &capDownload, SIGNAL( statusChanged( QString ) ), this, SLOT( showStatusMessage( QString ) ) );
451451

452452
QApplication::setOverrideCursor( Qt::WaitCursor );

src/ui/qgsoptionsbase.ui

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4440,6 +4440,24 @@
44404440
</item>
44414441
</layout>
44424442
</item>
4443+
<item>
4444+
<layout class="QHBoxLayout" name="horizontalLayout_40">
4445+
<item>
4446+
<widget class="QLabel" name="label_45">
4447+
<property name="text">
4448+
<string>Default expiration period for WMS capabilities (hours)</string>
4449+
</property>
4450+
</widget>
4451+
</item>
4452+
<item>
4453+
<widget class="QSpinBox" name="mDefaultCapabilitiesExpirySpinBox">
4454+
<property name="maximum">
4455+
<number>100000000</number>
4456+
</property>
4457+
</widget>
4458+
</item>
4459+
</layout>
4460+
</item>
44434461
<item>
44444462
<layout class="QHBoxLayout" name="horizontalLayout_17">
44454463
<item>

0 commit comments

Comments
 (0)