Skip to content

Commit d7c29ae

Browse files
committedOct 17, 2013
Update timeout of network request, if data is transferred
Up to now, any network connection was killed after a max amount of /qgis/networkAndProxy/networkTimeout milliseconds. This led to problems for large or otherwise slow downloads. This patch circumvents timeouts for as long as data is being transferred.
1 parent ddd4dae commit d7c29ae

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed
 

‎src/core/qgsnetworkaccessmanager.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ QNetworkReply *QgsNetworkAccessManager::createRequest( QNetworkAccessManager::Op
133133
{
134134
emit requestAboutToBeCreated( op, req, outgoingData );
135135
QNetworkReply *reply = QNetworkAccessManager::createRequest( op, req, outgoingData );
136+
connect( reply, SIGNAL( downloadProgress( qint64, qint64 ) ), this, SLOT( connectionProgress() ) );
137+
connect( reply, SIGNAL( uploadProgress( qint64, qint64 ) ), this, SLOT( connectionProgress() ) );
138+
connect( reply, SIGNAL( destroyed( QObject* ) ), this, SLOT( connectionDestroyed( QObject* ) ) );
136139
emit requestCreated( reply );
137140

138141
// abort request, when network timeout happens
@@ -142,9 +145,27 @@ QNetworkReply *QgsNetworkAccessManager::createRequest( QNetworkAccessManager::Op
142145
timer->setSingleShot( true );
143146
timer->start( s.value( "/qgis/networkAndProxy/networkTimeout", "20000" ).toInt() );
144147

148+
mActiveRequests.insert( reply, timer );
145149
return reply;
146150
}
147151

152+
void QgsNetworkAccessManager::connectionProgress()
153+
{
154+
QNetworkReply *reply = qobject_cast<QNetworkReply *>( sender() );
155+
Q_ASSERT( reply );
156+
157+
QTimer* timer = mActiveRequests.find( reply ).value();
158+
Q_ASSERT( timer );
159+
160+
QSettings s;
161+
timer->start( s.value( "/qgis/networkAndProxy/networkTimeout", "20000" ).toInt() );
162+
}
163+
164+
void QgsNetworkAccessManager::connectionDestroyed( QObject* reply )
165+
{
166+
mActiveRequests.remove( qobject_cast<QNetworkReply*>( reply ) );
167+
}
168+
148169
void QgsNetworkAccessManager::abortRequest()
149170
{
150171
QTimer *timer = qobject_cast<QTimer *>( sender() );

‎src/core/qgsnetworkaccessmanager.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include <QNetworkProxy>
2525
#include <QNetworkRequest>
2626

27+
class QTimer;
28+
2729
/*
2830
* \class QgsNetworkAccessManager
2931
* \brief network access manager for QGIS
@@ -84,6 +86,8 @@ class CORE_EXPORT QgsNetworkAccessManager : public QNetworkAccessManager
8486
void requestCreated( QNetworkReply * );
8587

8688
private slots:
89+
void connectionProgress();
90+
void connectionDestroyed( QObject* );
8791
void abortRequest();
8892

8993
protected:
@@ -97,6 +101,8 @@ class CORE_EXPORT QgsNetworkAccessManager : public QNetworkAccessManager
97101
QNetworkProxy mFallbackProxy;
98102
QStringList mExcludedURLs;
99103

104+
QMap<QNetworkReply*, QTimer*> mActiveRequests;
105+
100106
static QgsNetworkAccessManager *smNAM;
101107
};
102108

0 commit comments

Comments
 (0)
Please sign in to comment.