summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Petersson <Martin.Petersson@nokia.com>2012-03-27 17:14:24 +0200
committerQt by Nokia <qt-info@nokia.com>2012-04-01 14:13:45 +0200
commit3dbf98c715ed6941ca41eb85981a6afccab489a6 (patch)
treeb2447892ba634c9606dbc8769895e0b14faef31e
parente6f7852bb40b06bb7df469542a2c4c1e2850c43b (diff)
QNetworkAccessFtpBackend: remove entry from QNetworkAccessCache
When FTP login fails we fail to remove the entry from the cache. This is because the cache key is created from the url with the userInfo. So this needs to be set again to match the key used when inserted. Task-number: QTBUG-11824 Change-Id: Ib3fd2d737581653ae59c56d0810d42e2d8dc2176 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
-rw-r--r--src/network/access/qnetworkaccessftpbackend.cpp5
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp32
2 files changed, 37 insertions, 0 deletions
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index 42201aa9a3..4aa491db0c 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -223,6 +223,7 @@ void QNetworkAccessFtpBackend::ftpDone()
if (ftp->state() == QFtp::Connected) {
// the login did not succeed
QUrl newUrl = url();
+ QString userInfo = newUrl.userInfo();
newUrl.setUserInfo(QString());
setUrl(newUrl);
@@ -236,6 +237,10 @@ void QNetworkAccessFtpBackend::ftpDone()
return;
}
+ // Re insert the user info so that we can remove the cache entry.
+ newUrl.setUserInfo(userInfo);
+ setUrl(newUrl);
+
error(QNetworkReply::AuthenticationRequiredError,
tr("Logging in to %1 failed: authentication required")
.arg(url().host()));
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 438cf866aa..e93b226b04 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -401,6 +401,9 @@ private Q_SLOTS:
void closeDuringDownload_data();
void closeDuringDownload();
+ void ftpAuthentication_data();
+ void ftpAuthentication();
+
// NOTE: This test must be last!
void parentingRepliesToTheApp();
private:
@@ -6776,6 +6779,35 @@ void tst_QNetworkReply::closeDuringDownload()
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
}
+
+void tst_QNetworkReply::ftpAuthentication_data()
+{
+ QTest::addColumn<QString>("referenceName");
+ QTest::addColumn<QString>("url");
+ QTest::addColumn<int>("error");
+
+ QTest::newRow("invalidPassword") << (testDataDir + "/rfc3252.txt") << "ftp://ftptest:invalid@" + QtNetworkSettings::serverName() + "/home/qt-test-server/ftp/qtest/rfc3252.txt" << int(QNetworkReply::AuthenticationRequiredError);
+ QTest::newRow("validPassword") << (testDataDir + "/rfc3252.txt") << "ftp://ftptest:password@" + QtNetworkSettings::serverName() + "/home/qt-test-server/ftp/qtest/rfc3252.txt" << int(QNetworkReply::NoError);
+}
+
+void tst_QNetworkReply::ftpAuthentication()
+{
+ QFETCH(QString, referenceName);
+ QFETCH(QString, url);
+ QFETCH(int, error);
+
+ QFile reference(referenceName);
+ QVERIFY(reference.open(QIODevice::ReadOnly));
+
+ QNetworkRequest request(url);
+ QNetworkReplyPtr reply;
+ runSimpleRequest(QNetworkAccessManager::GetOperation, request, reply);
+
+ QCOMPARE(reply->url(), request.url());
+ QCOMPARE(reply->error(), QNetworkReply::NetworkError(error));
+}
+
+
// NOTE: This test must be last testcase in tst_qnetworkreply!
void tst_QNetworkReply::parentingRepliesToTheApp()
{