diff options
-rw-r--r-- | src/network/access/qnetworkreply_p.h | 1 | ||||
-rw-r--r-- | src/network/access/qnetworkreplyhttpimpl.cpp | 15 | ||||
-rw-r--r-- | src/network/access/qnetworkreplyimpl.cpp | 14 | ||||
-rw-r--r-- | tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp | 5 |
4 files changed, 31 insertions, 4 deletions
diff --git a/src/network/access/qnetworkreply_p.h b/src/network/access/qnetworkreply_p.h index 04598fc712..453902392c 100644 --- a/src/network/access/qnetworkreply_p.h +++ b/src/network/access/qnetworkreply_p.h @@ -71,6 +71,7 @@ public: QPointer<QNetworkAccessManager> manager; qint64 readBufferMaxSize; QElapsedTimer downloadProgressSignalChoke; + QElapsedTimer uploadProgressSignalChoke; const static int progressSignalInterval; QNetworkAccessManager::Operation operation; QNetworkReply::NetworkError errorCode; diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index cf92f55cdf..e1ec9a9a95 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -888,9 +888,9 @@ void QNetworkReplyHttpImplPrivate::postRequest() delegate->moveToThread(thread); // This call automatically moves the uploadDevice too for the asynchronous case. - // Start timer for progress notifications + // Prepare timers for progress notifications downloadProgressSignalChoke.start(); - + uploadProgressSignalChoke.invalidate(); // Send an signal to the delegate so it starts working in the other thread if (synchronous) { @@ -1802,6 +1802,17 @@ void QNetworkReplyHttpImplPrivate::emitReplyUploadProgress(qint64 bytesSent, qin Q_Q(QNetworkReplyHttpImpl); if (isFinished) return; + + //choke signal emissions, except the first and last signals which are unconditional + if (uploadProgressSignalChoke.isValid()) { + if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) { + return; + } + uploadProgressSignalChoke.restart(); + } else { + uploadProgressSignalChoke.start(); + } + emit q->uploadProgress(bytesSent, bytesTotal); } diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 9f8a6cfb5c..d0393475de 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -144,8 +144,9 @@ void QNetworkReplyImplPrivate::_q_startOperation() } #endif - // Start timer for progress notifications + // Prepare timer for progress notifications downloadProgressSignalChoke.start(); + uploadProgressSignalChoke.invalidate(); if (backend && backend->isSynchronous()) { state = Finished; @@ -550,6 +551,17 @@ void QNetworkReplyImplPrivate::emitUploadProgress(qint64 bytesSent, qint64 bytes { Q_Q(QNetworkReplyImpl); bytesUploaded = bytesSent; + + //choke signal emissions, except the first and last signals which are unconditional + if (uploadProgressSignalChoke.isValid()) { + if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) { + return; + } + uploadProgressSignalChoke.restart(); + } else { + uploadProgressSignalChoke.start(); + } + pauseNotificationHandling(); emit q->uploadProgress(bytesSent, bytesTotal); resumeNotificationHandling(); diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index bc2a95d102..2226f99432 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -4528,7 +4528,8 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp() void tst_QNetworkReply::ioPostToHttpUploadProgress() { - QFile sourceFile(testDataDir + "/bigfile"); + //test file must be larger than OS socket buffers (~830kB on MacOS 10.6) + QFile sourceFile(testDataDir + "/image1.jpg"); QVERIFY(sourceFile.open(QIODevice::ReadOnly)); // emulate a minimal http server @@ -4553,6 +4554,7 @@ void tst_QNetworkReply::ioPostToHttpUploadProgress() incomingSocket->setReadBufferSize(1*1024); QTestEventLoop::instance().enterLoop(5); // some progress should have been made + QVERIFY(!spy.isEmpty()); QList<QVariant> args = spy.last(); QVERIFY(!args.isEmpty()); QVERIFY(args.at(0).toLongLong() > 0); @@ -4563,6 +4565,7 @@ void tst_QNetworkReply::ioPostToHttpUploadProgress() incomingSocket->setReadBufferSize(0); QTestEventLoop::instance().enterLoop(10); // progress should be finished + QVERIFY(!spy.isEmpty()); QList<QVariant> args3 = spy.last(); QVERIFY(!args3.isEmpty()); // More progress than before |