25#include <QNetworkAccessManager>
26#include <QNetworkReply>
27#include <QNetworkRequest>
30#include "moc_qgsfiledownloader.cpp"
32using namespace Qt::StringLiterals;
40 , mHttpMethod( httpMethod )
43 if ( !outputFileName.isEmpty() )
44 mFile.setFileName( outputFileName );
56 mReply->deleteLater();
64 QNetworkRequest request( mUrl );
65 request.setAttribute( QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::RedirectPolicy::NoLessSafeRedirectPolicy );
67 if ( !mAuthCfg.isEmpty() )
74 disconnect( mReply, &QNetworkReply::readyRead,
this, &QgsFileDownloader::onReadyRead );
75 disconnect( mReply, &QNetworkReply::finished,
this, &QgsFileDownloader::onFinished );
76 disconnect( mReply, &QNetworkReply::downloadProgress,
this, &QgsFileDownloader::onDownloadProgress );
78 mReply->deleteLater();
81 switch ( mHttpMethod )
85 mReply = nam->get( request );
90 mReply = nam->post( request, mData );
102 if ( !mAuthCfg.isEmpty() )
107 connect( mReply, &QNetworkReply::readyRead,
this, &QgsFileDownloader::onReadyRead );
108 connect( mReply, &QNetworkReply::finished,
this, &QgsFileDownloader::onFinished );
109 connect( mReply, &QNetworkReply::downloadProgress,
this, &QgsFileDownloader::onDownloadProgress );
112 connect( nam, &QgsNetworkAccessManager::sslErrors,
this, &QgsFileDownloader::onSslErrors, Qt::UniqueConnection );
118 mDownloadCanceled =
true;
123void QgsFileDownloader::onRequestTimedOut( QNetworkReply *reply )
125 if ( reply == mReply )
126 error( tr(
"Network request %1 timed out" ).arg( mUrl.toString() ) );
130void QgsFileDownloader::onSslErrors( QNetworkReply *reply,
const QList<QSslError> &errors )
132 if ( reply == mReply )
134 QStringList errorMessages;
135 errorMessages.reserve( errors.size() + 1 );
136 errorMessages << u
"SSL Errors: "_s;
138 for (
const QSslError &error : errors )
139 errorMessages << error.errorString();
141 error( errorMessages );
147void QgsFileDownloader::error(
const QStringList &errorMessages )
149 for (
const QString &error : errorMessages )
157void QgsFileDownloader::error(
const QString &errorMessage )
159 error( QStringList() << errorMessage );
162void QgsFileDownloader::onReadyRead()
165 if ( mFile.fileName().isEmpty() )
167 error( tr(
"No output filename specified" ) );
170 else if ( ! mFile.isOpen() && ! mFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
172 error( tr(
"Cannot open output file: %1" ).arg( mFile.fileName() ) );
177 const QByteArray data = mReply->readAll();
182void QgsFileDownloader::onFinished()
185 if ( ! mErrors.isEmpty() || mDownloadCanceled )
187 if ( mFile.isOpen() )
189 if ( mFile.exists() )
195 if ( mFile.isOpen() )
201 if ( mReply->error() )
204 error( tr(
"Download failed: %1" ).arg( mReply->errorString() ) );
216void QgsFileDownloader::onDownloadProgress( qint64 bytesReceived, qint64 bytesTotal )
218 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)