25#include <QNetworkReply> 
   30  if ( mReply && mReply->isRunning() )
 
   40  QNetworkRequest req( url );
 
   48  QNetworkRequest request( r );
 
   51  if ( !mAuthCfg.isEmpty() )
 
   56  mContentLoaded = 
false;
 
   63    mReply->deleteLater();
 
   68  if ( !mAuthCfg.isEmpty() )
 
   72  mReply->setParent( 
nullptr ); 
 
   73  connect( mReply, &QNetworkReply::finished, 
this, [ = ] { contentLoaded(); } );
 
   76  auto onError = [ = ]( QNetworkReply::NetworkError code )
 
   83#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) 
   84  connect( mReply, qOverload<QNetworkReply::NetworkError>( &QNetworkReply::error ), 
this, onError );
 
   86  connect( mReply, &QNetworkReply::errorOccurred, 
this, onError );
 
   92  if ( !mContentLoaded )
 
  107  if ( !mContentLoaded || !mReply )
 
  112  QByteArray array = mReply->readAll();
 
  115  QTextCodec *codec = codecForHtml( array );
 
  116  return codec->toUnicode( array );
 
  127    mReply->deleteLater();
 
  137QTextCodec *QgsNetworkContentFetcher::codecForHtml( QByteArray &array )
 const 
  144  QTextCodec *codec = QTextCodec::codecForUtfText( array, 
nullptr );
 
  151  const QByteArray header = array.left( 1024 ).toLower();
 
  152  int pos = header.indexOf( 
"meta charset=" );
 
  155    pos += int( strlen( 
"meta charset=" ) ) + 1;
 
  156    const int pos2 = header.indexOf( 
'\"', pos );
 
  157    const QByteArray cs = header.mid( pos, pos2 - pos );
 
  158    codec = QTextCodec::codecForName( cs );
 
  166  codec = QTextCodec::codecForHtml( array, codec );
 
  173  return QTextCodec::codecForName( 
"UTF-8" );
 
  176void QgsNetworkContentFetcher::contentLoaded( 
bool ok )
 
  186  if ( mReply->error() != QNetworkReply::NoError )
 
  188    QgsMessageLog::logMessage( tr( 
"HTTP fetch %1 failed with error %2" ).arg( mReply->url().toString(), mReply->errorString() ) );
 
  189    mContentLoaded = 
true;
 
  194  const QVariant redirect = mReply->attribute( QNetworkRequest::RedirectionTargetAttribute );
 
  198    const QVariant status = mReply->attribute( QNetworkRequest::HttpStatusCodeAttribute );
 
  201      QgsMessageLog::logMessage( tr( 
"HTTP fetch %1 failed with error %2" ).arg( mReply->url().toString(), status.toString() ) );
 
  203    mContentLoaded = 
true;
 
  209  mReply->deleteLater();
 
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,...
 
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
 
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
 
QString contentDispositionFilename() const
Returns the associated filename from the reply's content disposition header, if present.
 
void finished()
Emitted when content has loaded.
 
bool wasCanceled() const
Returns true if the fetching was canceled.
 
~QgsNetworkContentFetcher() override
 
void errorOccurred(QNetworkReply::NetworkError code, const QString &errorMsg)
Emitted when an error with code error occurred while processing the request errorMsg is a textual des...
 
void cancel()
Cancels any ongoing request.
 
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
Emitted when data is received.
 
QNetworkReply * reply()
Returns a reference to the network reply.
 
QString contentAsString() const
Returns the fetched content as a string.
 
void fetchContent(const QUrl &url, const QString &authcfg=QString())
Fetches content from a remote URL and handles redirects.
 
static QString extractFilenameFromContentDispositionHeader(QNetworkReply *reply)
Extracts the filename component of the content disposition header from a network reply.
 
static bool isNull(const QVariant &variant)
Returns true if the specified variant should be considered a NULL value.
 
#define QgsSetRequestInitiatorClass(request, _class)