FTP: Workaround for servers without HELP command support

Ignores errors produced by the HELP command. It will continue
executing the commands sent to QFtp when a server does not have a
HELP command implemented. Commands SIZE, MDTM, and PWD are not going
to be used if the HELP command failed.

[ChangeLog][QtNetwork][QNetworkAccessManager] Don't fail when FTP does
not implement the HELP command.

Task-number: QTBUG-69477
Change-Id: I0ebd51b134535730c6bef83de1abf1a427b8d2ce
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Jesus Fernandez 2019-03-19 11:41:53 +01:00 committed by Jesus Fernandez
parent 9a6a847311
commit 8e82e536cd
3 changed files with 20 additions and 1 deletions

View File

@ -2122,6 +2122,17 @@ void QFtp::abort()
d_func()->pi.abort(); d_func()->pi.abort();
} }
/*!
\internal
Clears the last error.
\sa currentCommand()
*/
void QFtp::clearError()
{
d_func()->error = NoError;
}
/*! /*!
\internal \internal
Returns the identifier of the FTP command that is being executed Returns the identifier of the FTP command that is being executed

View File

@ -157,6 +157,9 @@ Q_SIGNALS:
void commandFinished(int, bool); void commandFinished(int, bool);
void done(bool); void done(bool);
protected:
void clearError();
private: private:
Q_DISABLE_COPY_MOVE(QFtp) Q_DISABLE_COPY_MOVE(QFtp)
Q_DECLARE_PRIVATE(QFtp) Q_DECLARE_PRIVATE(QFtp)

View File

@ -99,6 +99,8 @@ public:
connect(this, SIGNAL(done(bool)), this, SLOT(deleteLater())); connect(this, SIGNAL(done(bool)), this, SLOT(deleteLater()));
close(); close();
} }
using QFtp::clearError;
}; };
QNetworkAccessFtpBackend::QNetworkAccessFtpBackend() QNetworkAccessFtpBackend::QNetworkAccessFtpBackend()
@ -282,7 +284,10 @@ void QNetworkAccessFtpBackend::ftpDone()
} }
// check for errors: // check for errors:
if (ftp->error() != QFtp::NoError) { if (state == CheckingFeatures && ftp->error() == QFtp::UnknownError) {
qWarning("QNetworkAccessFtpBackend: HELP command failed, ignoring it");
ftp->clearError();
} else if (ftp->error() != QFtp::NoError) {
QString msg; QString msg;
if (operation() == QNetworkAccessManager::GetOperation) if (operation() == QNetworkAccessManager::GetOperation)
msg = tr("Error while downloading %1: %2"); msg = tr("Error while downloading %1: %2");