Abort FTP download, not the whole application
authorShane Kearns <ext-shane.2.kearns@nokia.com>
Tue, 14 Feb 2012 20:12:42 +0000 (20:12 +0000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 15 Feb 2012 01:35:20 +0000 (02:35 +0100)
An old coding error meant that the C runtime abort() function was
being called instead of QFtp::abort() when cancelling an FTP download
using QNetworkReply::close()

Task-number: QTBUG-22820
Change-Id: Ib97fda9769b2b55a08c042c66c4444cb6216d2b1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/network/access/qnetworkaccessftpbackend.cpp
tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp

index 98967e7..42201aa 100644 (file)
@@ -179,11 +179,7 @@ void QNetworkAccessFtpBackend::closeDownstreamChannel()
 {
     state = Disconnecting;
     if (operation() == QNetworkAccessManager::GetOperation)
-#ifndef Q_OS_WINCE
-        abort();
-#else
-        exit(3);
-#endif
+        ftp->abort();
 }
 
 void QNetworkAccessFtpBackend::downstreamReadyWrite()
index 866afbf..61f44c5 100644 (file)
@@ -392,6 +392,9 @@ private Q_SLOTS:
     void synchronousAuthenticationCache();
     void pipelining();
 
+    void closeDuringDownload_data();
+    void closeDuringDownload();
+
     // NOTE: This test must be last!
     void parentingRepliesToTheApp();
 };
@@ -6736,6 +6739,27 @@ void tst_QNetworkReply::pipeliningHelperSlot() {
     }
 }
 
+void tst_QNetworkReply::closeDuringDownload_data()
+{
+    QTest::addColumn<QUrl>("url");
+    QTest::newRow("http") << QUrl("http://" + QtNetworkSettings::serverName() + "/bigfile");
+    QTest::newRow("ftp") << QUrl("ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
+}
+
+void tst_QNetworkReply::closeDuringDownload()
+{
+    QFETCH(QUrl, url);
+    QNetworkRequest request(url);
+    QNetworkReply* reply = manager.get(request);
+    connect(reply, SIGNAL(readyRead()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+    QTestEventLoop::instance().enterLoop(10);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+    connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+    reply->close();
+    reply->deleteLater();
+    QTest::qWait(1000); //cancelling ftp takes some time, this avoids a warning caused by test's cleanup() destroying the connection cache before the abort is finished
+}
+
 // NOTE: This test must be last testcase in tst_qnetworkreply!
 void tst_QNetworkReply::parentingRepliesToTheApp()
 {