summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/access/qnetworkreply_p.h1
-rw-r--r--src/network/access/qnetworkreplyhttpimpl.cpp15
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp14
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp5
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