diff options
author | Matt Broadstone <mbroadstone@devonit.com> | 2014-08-15 09:26:04 -0400 |
---|---|---|
committer | Matt Broadstone <mbroadst@gmail.com> | 2014-08-15 19:48:36 +0200 |
commit | 45cbbe56bc13216b83215ea148590eccf81f420a (patch) | |
tree | edbdba51f78d6bae3fbf7be6b36c0500e327743f /src/network | |
parent | f630eb1120e64d7bda8b2e69e24f65f0de592b5d (diff) |
refactor disconnectFromFtp to remove cached entries when necessary
In cases where a cached ftp connection fails to connect, or a file
transfer has failed, we should removed the cached connection. Since qnam
has an idea of a single internal QFtp per full operation, when file
transfers failed previously the cached connection would be reused for
subsequent connections and thus fail.
[ChangeLog][QtNetwork][QNetworkAccessManager] QNetworkAccessManager now
properly handles FTP transfer failures by removing failed cached ftp
connections.
Task-number: QTBUG-40797
Change-Id: Ie090a39ceddd7e58a0d8baf7d01f2a08c70162e5
Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/access/qnetworkaccessftpbackend.cpp | 20 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessftpbackend_p.h | 7 |
2 files changed, 15 insertions, 12 deletions
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp index 246eb41657..e8695f9b56 100644 --- a/src/network/access/qnetworkaccessftpbackend.cpp +++ b/src/network/access/qnetworkaccessftpbackend.cpp @@ -211,7 +211,7 @@ void QNetworkAccessFtpBackend::ftpConnectionReady(QNetworkAccessCache::Cacheable // no, defer the actual operation until after we've logged in } -void QNetworkAccessFtpBackend::disconnectFromFtp() +void QNetworkAccessFtpBackend::disconnectFromFtp(CacheCleanupMode mode) { state = Disconnecting; @@ -219,7 +219,12 @@ void QNetworkAccessFtpBackend::disconnectFromFtp() disconnect(ftp, 0, this, 0); QByteArray key = makeCacheKey(url()); - QNetworkAccessManagerPrivate::getObjectCache(this)->releaseEntry(key); + if (mode == RemoveCachedConnection) { + QNetworkAccessManagerPrivate::getObjectCache(this)->removeEntry(key); + ftp->dispose(); + } else { + QNetworkAccessManagerPrivate::getObjectCache(this)->releaseEntry(key); + } ftp = 0; } @@ -274,14 +279,7 @@ void QNetworkAccessFtpBackend::ftpDone() } // we're not connected, so remove the cache entry: - QByteArray key = makeCacheKey(url()); - QNetworkAccessManagerPrivate::getObjectCache(this)->removeEntry(key); - - disconnect(ftp, 0, this, 0); - ftp->dispose(); - ftp = 0; - - state = Disconnecting; + disconnectFromFtp(RemoveCachedConnection); finished(); return; } @@ -301,7 +299,7 @@ void QNetworkAccessFtpBackend::ftpDone() else error(QNetworkReply::ContentAccessDenied, msg); - disconnectFromFtp(); + disconnectFromFtp(RemoveCachedConnection); finished(); } diff --git a/src/network/access/qnetworkaccessftpbackend_p.h b/src/network/access/qnetworkaccessftpbackend_p.h index c006d450b8..534efad676 100644 --- a/src/network/access/qnetworkaccessftpbackend_p.h +++ b/src/network/access/qnetworkaccessftpbackend_p.h @@ -90,7 +90,12 @@ public: virtual void downstreamReadyWrite(); - void disconnectFromFtp(); + enum CacheCleanupMode { + ReleaseCachedConnection, + RemoveCachedConnection + }; + + void disconnectFromFtp(CacheCleanupMode mode = ReleaseCachedConnection); public slots: void ftpConnectionReady(QNetworkAccessCache::CacheableObject *object); |