25#include <QNetworkAccessManager>
26#include <QNetworkReply>
27#include <QNetworkRequest>
29#include "moc_qgsfiledownloader.cpp"
37 , mHttpMethod( httpMethod )
40 if ( !outputFileName.isEmpty() )
41 mFile.setFileName( outputFileName );
53 mReply->deleteLater();
61 QNetworkRequest request( mUrl );
62 request.setAttribute( QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::RedirectPolicy::NoLessSafeRedirectPolicy );
64 if ( !mAuthCfg.isEmpty() )
71 disconnect( mReply, &QNetworkReply::readyRead,
this, &QgsFileDownloader::onReadyRead );
72 disconnect( mReply, &QNetworkReply::finished,
this, &QgsFileDownloader::onFinished );
73 disconnect( mReply, &QNetworkReply::downloadProgress,
this, &QgsFileDownloader::onDownloadProgress );
75 mReply->deleteLater();
78 switch ( mHttpMethod )
82 mReply = nam->get( request );
87 mReply = nam->post( request, mData );
99 if ( !mAuthCfg.isEmpty() )
104 connect( mReply, &QNetworkReply::readyRead,
this, &QgsFileDownloader::onReadyRead );
105 connect( mReply, &QNetworkReply::finished,
this, &QgsFileDownloader::onFinished );
106 connect( mReply, &QNetworkReply::downloadProgress,
this, &QgsFileDownloader::onDownloadProgress );
109 connect( nam, &QgsNetworkAccessManager::sslErrors,
this, &QgsFileDownloader::onSslErrors, Qt::UniqueConnection );
115 mDownloadCanceled =
true;
120void QgsFileDownloader::onRequestTimedOut( QNetworkReply *reply )
122 if ( reply == mReply )
123 error( tr(
"Network request %1 timed out" ).arg( mUrl.toString() ) );
127void QgsFileDownloader::onSslErrors( QNetworkReply *reply,
const QList<QSslError> &errors )
129 if ( reply == mReply )
131 QStringList errorMessages;
132 errorMessages.reserve( errors.size() + 1 );
133 errorMessages << QStringLiteral(
"SSL Errors: " );
135 for (
const QSslError &error : errors )
136 errorMessages << error.errorString();
138 error( errorMessages );
144void QgsFileDownloader::error(
const QStringList &errorMessages )
146 for (
const QString &error : errorMessages )
154void QgsFileDownloader::error(
const QString &errorMessage )
156 error( QStringList() << errorMessage );
159void QgsFileDownloader::onReadyRead()
162 if ( mFile.fileName().isEmpty() )
164 error( tr(
"No output filename specified" ) );
167 else if ( ! mFile.isOpen() && ! mFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
169 error( tr(
"Cannot open output file: %1" ).arg( mFile.fileName() ) );
174 const QByteArray data = mReply->readAll();
179void QgsFileDownloader::onFinished()
182 if ( ! mErrors.isEmpty() || mDownloadCanceled )
184 if ( mFile.isOpen() )
186 if ( mFile.exists() )
192 if ( mFile.isOpen() )
198 if ( mReply->error() )
201 error( tr(
"Download failed: %1" ).arg( mReply->errorString() ) );
213void QgsFileDownloader::onDownloadProgress( qint64 bytesReceived, qint64 bytesTotal )
215 if ( mDownloadCanceled )
HttpMethod
Different methods of HTTP requests.
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
bool updateNetworkRequest(QNetworkRequest &request, const QString &authcfg, const QString &dataprovider=QString())
Provider call to update a QNetworkRequest with an authentication config.
bool updateNetworkReply(QNetworkReply *reply, const QString &authcfg, const QString &dataprovider=QString())
Provider call to update a QNetworkReply with an authentication config (used to skip known SSL errors,...
void cancelDownload()
Call to abort the download and delete this object after the cancellation has been processed.
void downloadExited()
Emitted always when the downloader exits.
void downloadCanceled()
Emitted when the download was canceled by the user.
void downloadError(QStringList errorMessages)
Emitted when an error makes the download fail.
void startDownload()
Called to start the download.
QgsFileDownloader(const QUrl &url, const QString &outputFileName, const QString &authcfg=QString(), bool delayStart=false, Qgis::HttpMethod httpMethod=Qgis::HttpMethod::Get, const QByteArray &data=QByteArray())
QgsFileDownloader.
void downloadCompleted(const QUrl &url)
Emitted when the download has completed successfully.
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
Emitted when data are ready to be processed.
~QgsFileDownloader() override
QNetworkAccessManager with additional QGIS specific logic.
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
void requestTimedOut(QgsNetworkRequestParameters request)
Emitted when a network request has timed out.
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
#define QgsDebugError(str)
#define QgsSetRequestInitiatorClass(request, _class)