28 #include "qgssettings.h"
37 #include <QNetworkReply>
38 #include <QThreadStorage>
39 #include <QAuthenticator>
40 #include <QStandardPaths>
43 #include <QSslConfiguration>
52 class QgsNetworkProxyFactory :
public QNetworkProxyFactory
55 QgsNetworkProxyFactory() =
default;
57 QList<QNetworkProxy> queryProxy(
const QNetworkProxyQuery &query = QNetworkProxyQuery() )
override
63 for ( QNetworkProxyFactory *f : constProxyFactories )
65 QList<QNetworkProxy> systemproxies = f->systemProxyForQuery( query );
66 if ( !systemproxies.isEmpty() )
69 QList<QNetworkProxy> proxies = f->queryProxy( query );
70 if ( !proxies.isEmpty() )
75 if ( query.queryType() != QNetworkProxyQuery::UrlRequest )
78 QString url = query.url().toString();
81 for (
const QString &noProxy : constNoProxyList )
83 if ( !noProxy.trimmed().isEmpty() && url.startsWith( noProxy ) )
85 QgsDebugMsgLevel( QStringLiteral(
"don't using any proxy for %1 [exclude %2]" ).arg( url, noProxy ), 4 );
86 return QList<QNetworkProxy>() << QNetworkProxy( QNetworkProxy::NoProxy );
91 for (
const QString &exclude : constExcludeList )
93 if ( !exclude.trimmed().isEmpty() && url.startsWith( exclude ) )
95 QgsDebugMsgLevel( QStringLiteral(
"using default proxy for %1 [exclude %2]" ).arg( url, exclude ), 4 );
96 return QList<QNetworkProxy>() << QNetworkProxy( QNetworkProxy::DefaultProxy );
102 QgsDebugMsgLevel( QStringLiteral(
"requesting system proxy for query %1" ).arg( url ), 4 );
103 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery( query );
104 if ( !proxies.isEmpty() )
107 .arg( proxies.first().hostName() ).arg( proxies.first().port() ), 4 );
112 QgsDebugMsgLevel( QStringLiteral(
"using fallback proxy for %1" ).arg( url ), 4 );
123 static QThreadStorage<QgsNetworkAccessManager> sInstances;
126 if ( nam->thread() == qApp->thread() )
129 if ( !nam->mInitialized )
139 : QNetworkAccessManager( parent )
141 setProxyFactory(
new QgsNetworkProxyFactory() );
146 Q_ASSERT( sMainNAM ==
this );
147 mSslErrorHandler = std::move( handler );
152 Q_ASSERT( sMainNAM ==
this );
153 mAuthHandler = std::move( handler );
158 mProxyFactories.insert( 0, factory );
163 mProxyFactories.removeAll( factory );
168 return mProxyFactories;
173 return mExcludedURLs;
183 return mFallbackProxy;
188 QgsDebugMsgLevel( QStringLiteral(
"proxy settings: (type:%1 host: %2:%3, user:%4, password:%5" )
189 .arg( proxy.type() == QNetworkProxy::DefaultProxy ? QStringLiteral(
"DefaultProxy" ) :
190 proxy.type() == QNetworkProxy::Socks5Proxy ? QStringLiteral(
"Socks5Proxy" ) :
191 proxy.type() == QNetworkProxy::NoProxy ? QStringLiteral(
"NoProxy" ) :
192 proxy.type() == QNetworkProxy::HttpProxy ? QStringLiteral(
"HttpProxy" ) :
193 proxy.type() == QNetworkProxy::HttpCachingProxy ? QStringLiteral(
"HttpCachingProxy" ) :
194 proxy.type() == QNetworkProxy::FtpCachingProxy ? QStringLiteral(
"FtpCachingProxy" ) :
195 QStringLiteral(
"Undefined" ),
199 proxy.password().isEmpty() ? QStringLiteral(
"not set" ) : QStringLiteral(
"set" ) ), 4 );
201 mFallbackProxy = proxy;
202 mExcludedURLs = excludes;
204 mExcludedURLs.erase( std::remove_if( mExcludedURLs.begin(), mExcludedURLs.end(),
205 [](
const QString & url )
207 return url.trimmed().isEmpty();
208 } ), mExcludedURLs.end() );
210 mNoProxyURLs = noProxyURLs;
211 mNoProxyURLs.erase( std::remove_if( mNoProxyURLs.begin(), mNoProxyURLs.end(),
212 [](
const QString & url )
214 return url.trimmed().isEmpty();
215 } ), mNoProxyURLs.end() );
222 QNetworkRequest *pReq(
const_cast< QNetworkRequest *
>( &req ) );
224 QString userAgent = s.value( QStringLiteral(
"/qgis/networkAndProxy/userAgent" ),
"Mozilla/5.0" ).toString();
225 if ( !userAgent.isEmpty() )
228 pReq->setRawHeader(
"User-Agent", userAgent.toLatin1() );
231 bool ishttps = pReq->url().scheme().compare( QLatin1String(
"https" ), Qt::CaseInsensitive ) == 0;
234 QgsDebugMsgLevel( QStringLiteral(
"Adding trusted CA certs to request" ), 3 );
235 QSslConfiguration sslconfig( pReq->sslConfiguration() );
239 QString hostport( QStringLiteral(
"%1:%2" )
240 .arg( pReq->url().host().trimmed() )
241 .arg( pReq->url().port() != -1 ? pReq->url().port() : 443 ) );
243 if ( !servconfig.
isNull() )
245 QgsDebugMsg( QStringLiteral(
"Adding SSL custom config to request for %1" ).arg( hostport ) );
251 pReq->setSslConfiguration( sslconfig );
255 if ( sMainNAM->mCacheDisabled )
258 pReq->setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork );
259 pReq->setAttribute( QNetworkRequest::CacheSaveControlAttribute,
false );
262 static QAtomicInt sRequestId = 0;
263 const int requestId = ++sRequestId;
265 if ( QBuffer *buffer = qobject_cast<QBuffer *>( outgoingData ) )
267 content = buffer->buffer();
274 QNetworkReply *reply = QNetworkAccessManager::createRequest( op, req, outgoingData );
275 reply->setProperty(
"requestId", requestId );
281 connect( reply, &QNetworkReply::downloadProgress,
this, &QgsNetworkAccessManager::onReplyDownloadProgress );
283 connect( reply, &QNetworkReply::sslErrors,
this, &QgsNetworkAccessManager::onReplySslErrors );
291 QTimer *timer =
new QTimer( reply );
292 timer->setObjectName( QStringLiteral(
"timeoutTimer" ) );
293 connect( timer, &QTimer::timeout,
this, &QgsNetworkAccessManager::abortRequest );
294 timer->setSingleShot(
true );
297 connect( reply, &QNetworkReply::downloadProgress, timer, [timer] { timer->start(); } );
298 connect( reply, &QNetworkReply::uploadProgress, timer, [timer] { timer->start(); } );
299 connect( reply, &QNetworkReply::finished, timer, &QTimer::stop );
301 QgsDebugMsgLevel( QStringLiteral(
"Created [reply:%1]" ).arg(
reinterpret_cast< qint64
>( reply ), 0, 16 ), 3 );
307 void QgsNetworkAccessManager::unlockAfterSslErrorHandled()
309 Q_ASSERT( QThread::currentThread() == QApplication::instance()->thread() );
310 mSslErrorWaitCondition.wakeOne();
314 void QgsNetworkAccessManager::abortRequest()
316 QTimer *timer = qobject_cast<QTimer *>( sender() );
319 QNetworkReply *reply = qobject_cast<QNetworkReply *>( timer->parent() );
323 QgsDebugMsgLevel( QStringLiteral(
"Abort [reply:%1] %2" ).arg(
reinterpret_cast< qint64
>( reply ), 0, 16 ).arg( reply->url().toString() ), 3 );
330 void QgsNetworkAccessManager::onReplyFinished( QNetworkReply *reply )
335 void QgsNetworkAccessManager::onReplyDownloadProgress( qint64 bytesReceived, qint64 bytesTotal )
337 if ( QNetworkReply *reply = qobject_cast< QNetworkReply *>( sender() ) )
344 void QgsNetworkAccessManager::onReplySslErrors(
const QList<QSslError> &errors )
346 QNetworkReply *reply = qobject_cast< QNetworkReply *>( sender() );
348 Q_ASSERT( reply->manager() ==
this );
350 QgsDebugMsg( QStringLiteral(
"Stopping network reply timeout whilst SSL error is handled" ) );
351 pauseTimeout( reply );
357 emit sslErrorsOccurred( reply, errors );
358 if (
this != sMainNAM )
362 mSslErrorHandlerMutex.lock();
363 mSslErrorWaitCondition.wait( &mSslErrorHandlerMutex );
364 mSslErrorHandlerMutex.unlock();
365 afterSslErrorHandled( reply );
369 void QgsNetworkAccessManager::afterSslErrorHandled( QNetworkReply *reply )
371 if ( reply->manager() ==
this )
373 restartTimeout( reply );
374 emit sslErrorsHandled( reply );
376 else if (
this == sMainNAM )
379 qobject_cast< QgsNetworkAccessManager *>( reply->manager() )->unlockAfterSslErrorHandled();
383 void QgsNetworkAccessManager::unlockAfterAuthRequestHandled()
385 Q_ASSERT( QThread::currentThread() == QApplication::instance()->thread() );
386 mAuthRequestWaitCondition.wakeOne();
389 void QgsNetworkAccessManager::afterAuthRequestHandled( QNetworkReply *reply )
391 if ( reply->manager() ==
this )
393 restartTimeout( reply );
394 emit authRequestHandled( reply );
396 else if (
this == sMainNAM )
399 qobject_cast< QgsNetworkAccessManager *>( reply->manager() )->unlockAfterAuthRequestHandled();
403 void QgsNetworkAccessManager::pauseTimeout( QNetworkReply *reply )
405 Q_ASSERT( reply->manager() ==
this );
407 QTimer *timer = reply->findChild<QTimer *>( QStringLiteral(
"timeoutTimer" ) );
408 if ( timer && timer->isActive() )
414 void QgsNetworkAccessManager::restartTimeout( QNetworkReply *reply )
416 Q_ASSERT( reply->manager() ==
this );
418 QTimer *timer = reply->findChild<QTimer *>( QStringLiteral(
"timeoutTimer" ) );
421 Q_ASSERT( !timer->isActive() );
422 QgsDebugMsg( QStringLiteral(
"Restarting network reply timeout" ) );
423 timer->setSingleShot(
true );
428 int QgsNetworkAccessManager::getRequestId( QNetworkReply *reply )
430 return reply->property(
"requestId" ).toInt();
433 void QgsNetworkAccessManager::handleSslErrors( QNetworkReply *reply,
const QList<QSslError> &errors )
435 mSslErrorHandler->handleSslErrors( reply, errors );
436 afterSslErrorHandled( reply );
441 void QgsNetworkAccessManager::onAuthRequired( QNetworkReply *reply, QAuthenticator *auth )
444 Q_ASSERT( reply->manager() ==
this );
446 QgsDebugMsg( QStringLiteral(
"Stopping network reply timeout whilst auth request is handled" ) );
447 pauseTimeout( reply );
453 emit authRequestOccurred( reply, auth );
455 if (
this != sMainNAM )
459 mAuthRequestHandlerMutex.lock();
460 mAuthRequestWaitCondition.wait( &mAuthRequestHandlerMutex );
461 mAuthRequestHandlerMutex.unlock();
462 afterAuthRequestHandled( reply );
468 if (
this != sMainNAM )
474 mAuthHandler->handleAuthRequestOpenBrowser( url );
479 if (
this != sMainNAM )
485 mAuthHandler->handleAuthRequestCloseBrowser();
490 if (
this != sMainNAM )
497 void QgsNetworkAccessManager::handleAuthRequest( QNetworkReply *reply, QAuthenticator *auth )
499 mAuthHandler->handleAuthRequest( reply, auth );
503 afterAuthRequestHandled( reply );
510 case QNetworkRequest::AlwaysNetwork:
511 return QStringLiteral(
"AlwaysNetwork" );
512 case QNetworkRequest::PreferNetwork:
513 return QStringLiteral(
"PreferNetwork" );
514 case QNetworkRequest::PreferCache:
515 return QStringLiteral(
"PreferCache" );
516 case QNetworkRequest::AlwaysCache:
517 return QStringLiteral(
"AlwaysCache" );
519 return QStringLiteral(
"PreferNetwork" );
524 if ( name == QLatin1String(
"AlwaysNetwork" ) )
526 return QNetworkRequest::AlwaysNetwork;
528 else if ( name == QLatin1String(
"PreferNetwork" ) )
530 return QNetworkRequest::PreferNetwork;
532 else if ( name == QLatin1String(
"PreferCache" ) )
534 return QNetworkRequest::PreferCache;
536 else if ( name == QLatin1String(
"AlwaysCache" ) )
538 return QNetworkRequest::AlwaysCache;
540 return QNetworkRequest::PreferNetwork;
546 mUseSystemProxy =
false;
548 Q_ASSERT( sMainNAM );
550 if ( sMainNAM !=
this )
552 connect(
this, &QNetworkAccessManager::proxyAuthenticationRequired,
553 sMainNAM, &QNetworkAccessManager::proxyAuthenticationRequired,
571 connect(
this, &QNetworkAccessManager::sslErrors,
572 sMainNAM, &QNetworkAccessManager::sslErrors,
585 setAuthHandler( std::make_unique< QgsNetworkAuthenticationHandler>() );
588 connect(
this, &QgsNetworkAccessManager::sslErrorsOccurred, sMainNAM, &QgsNetworkAccessManager::handleSslErrors );
590 connect(
this, &QNetworkAccessManager::authenticationRequired,
this, &QgsNetworkAccessManager::onAuthRequired );
591 connect(
this, &QgsNetworkAccessManager::authRequestOccurred, sMainNAM, &QgsNetworkAccessManager::handleAuthRequest );
593 connect(
this, &QNetworkAccessManager::finished,
this, &QgsNetworkAccessManager::onReplyFinished );
596 QgsSettings settings;
598 QStringList excludes;
599 QStringList noProxyURLs;
601 bool proxyEnabled = settings.value( QStringLiteral(
"proxy/proxyEnabled" ),
false ).toBool();
606 excludes = settings.value( QStringLiteral(
"proxy/proxyExcludedUrls" ), QStringList() ).toStringList();
608 noProxyURLs = settings.value( QStringLiteral(
"proxy/noProxyUrls" ), QStringList() ).toStringList();
611 QString proxyHost = settings.value( QStringLiteral(
"proxy/proxyHost" ),
"" ).toString();
612 int proxyPort = settings.value( QStringLiteral(
"proxy/proxyPort" ),
"" ).toString().toInt();
614 QString proxyUser = settings.value( QStringLiteral(
"proxy/proxyUser" ),
"" ).toString();
615 QString proxyPassword = settings.value( QStringLiteral(
"proxy/proxyPassword" ),
"" ).toString();
617 QString proxyTypeString = settings.value( QStringLiteral(
"proxy/proxyType" ),
"" ).toString();
619 if ( proxyTypeString == QLatin1String(
"DefaultProxy" ) )
621 mUseSystemProxy =
true;
622 QNetworkProxyFactory::setUseSystemConfiguration(
true );
623 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery();
624 if ( !proxies.isEmpty() )
626 proxy = proxies.first();
632 QNetworkProxy::ProxyType proxyType = QNetworkProxy::DefaultProxy;
633 if ( proxyTypeString == QLatin1String(
"Socks5Proxy" ) )
635 proxyType = QNetworkProxy::Socks5Proxy;
637 else if ( proxyTypeString == QLatin1String(
"HttpProxy" ) )
639 proxyType = QNetworkProxy::HttpProxy;
641 else if ( proxyTypeString == QLatin1String(
"HttpCachingProxy" ) )
643 proxyType = QNetworkProxy::HttpCachingProxy;
645 else if ( proxyTypeString == QLatin1String(
"FtpCachingProxy" ) )
647 proxyType = QNetworkProxy::FtpCachingProxy;
649 QgsDebugMsg( QStringLiteral(
"setting proxy %1 %2:%3 %4/%5" )
651 .arg( proxyHost ).arg( proxyPort )
652 .arg( proxyUser, proxyPassword )
654 proxy = QNetworkProxy( proxyType, proxyHost, proxyPort, proxyUser, proxyPassword );
657 QString authcfg = settings.value( QStringLiteral(
"proxy/authcfg" ),
"" ).toString();
658 if ( !authcfg.isEmpty( ) )
660 QgsDebugMsg( QStringLiteral(
"setting proxy from stored authentication configuration %1" ).arg( authcfg ) );
673 QString cacheDirectory = settings.value( QStringLiteral(
"cache/directory" ) ).toString();
674 if ( cacheDirectory.isEmpty() )
675 cacheDirectory = QStandardPaths::writableLocation( QStandardPaths::CacheLocation );
676 qint64 cacheSize = settings.value( QStringLiteral(
"cache/size" ), 50 * 1024 * 1024 ).toLongLong();
682 if ( cache() != newcache )
683 setCache( newcache );
700 br.
get( request, forceRefresh, feedback );
708 br.
post( request, data, forceRefresh, feedback );
718 : mOperation( operation )
719 , mRequest( request )
720 , mOriginatingThreadId( QStringLiteral(
"0x%2" ).arg( reinterpret_cast<quintptr>( QThread::currentThread() ), 2 * QT_POINTER_SIZE, 16, QLatin1Char(
'0' ) ) )
721 , mRequestId( requestId )
722 , mContent( content )
723 , mInitiatorClass( request.attribute( static_cast< QNetworkRequest::Attribute >(
QgsNetworkRequestParameters::AttributeInitiatorClass ) ).toString() )
724 , mInitiatorRequestId( request.attribute( static_cast< QNetworkRequest::Attribute >(
QgsNetworkRequestParameters::AttributeInitiatorRequestId ) ) )
736 QgsDebugMsg( QStringLiteral(
"SSL errors occurred accessing URL:\n%1" ).arg( reply->request().url().toString() ) );
746 QgsDebugMsg( QStringLiteral(
"Network reply required authentication, but no handler was in place to provide this authentication request while accessing the URL:\n%1" ).arg( reply->request().url().toString() ) );
752 QgsDebugMsg( QStringLiteral(
"Network authentication required external browser to open URL %1, but no handler was in place" ).arg( url.toString() ) );
757 QgsDebugMsg( QStringLiteral(
"Network authentication required external browser closed, but no handler was in place" ) );
static int versionInt()
Version number used for comparing versions using the "Check QGIS Version" function.
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
static QList< QSslCertificate > casMerge(const QList< QSslCertificate > &bundle1, const QList< QSslCertificate > &bundle2)
casMerge merges two certificate bundles in a single one removing duplicates, the certificates from th...
Configuration container for SSL server connection exceptions or overrides.
QSsl::SslProtocol sslProtocol() const
SSL server protocol to use in connections.
int sslPeerVerifyDepth() const
Number or SSL client's peer to verify in connections.
bool isNull() const
Whether configuration is null (missing components)
QSslSocket::PeerVerifyMode sslPeerVerifyMode() const
SSL client's peer verify mode to use in connections.
bool updateNetworkProxy(QNetworkProxy &proxy, const QString &authcfg, const QString &dataprovider=QString())
Provider call to update a QNetworkProxy with an authentication config.
const QgsAuthConfigSslServer sslCertCustomConfigByHost(const QString &hostport)
sslCertCustomConfigByHost get an SSL certificate custom config by hostport (host:port)
A thread safe class for performing blocking (sync) network requests, with full support for QGIS proxy...
ErrorCode get(QNetworkRequest &request, bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Performs a "get" operation on the specified request.
void setAuthCfg(const QString &authCfg)
Sets the authentication config id which should be used during the request.
ErrorCode post(QNetworkRequest &request, const QByteArray &data, bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Performs a "post" operation on the specified request, using the given data.
QgsNetworkReplyContent reply() const
Returns the content of the network reply, after a get() or post() request has been made.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
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).
network access manager for QGIS
QStringList noProxyList() const
Returns the no proxy list.
void finished(QgsNetworkReplyContent reply)
Emitted whenever a pending network reply is finished.
static QgsNetworkReplyContent blockingGet(QNetworkRequest &request, const QString &authCfg=QString(), bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Posts a GET request to obtain the contents of the target request and returns a new QgsNetworkReplyCon...
void insertProxyFactory(QNetworkProxyFactory *factory)
Inserts a factory into the proxy factories list.
void setSslErrorHandler(std::unique_ptr< QgsSslErrorHandler > handler)
Sets the application SSL error handler, which is used to respond to SSL errors encountered during net...
void abortAuthBrowser()
Abort any outstanding external browser login request.
void setCacheDisabled(bool disabled)
Sets whether all network caching should be disabled.
const QList< QNetworkProxyFactory * > proxyFactories() const
Returns a list of proxy factories used by the manager.
void downloadProgress(int requestId, qint64 bytesReceived, qint64 bytesTotal)
Emitted when a network reply receives a progress report.
void requestAuthOpenBrowser(const QUrl &url) const
Forwards an external browser login url opening request to the authentication handler.
void requestAuthCloseBrowser() const
Forwards an external browser login closure request to the authentication handler.
void requestEncounteredSslErrors(int requestId, const QList< QSslError > &errors)
Emitted when a network request encounters SSL errors.
static QString cacheLoadControlName(QNetworkRequest::CacheLoadControl control)
Returns the name for QNetworkRequest::CacheLoadControl.
static const QgsSettingsEntryInteger settingsNetworkTimeout
Settings entry network timeout.
void requestAuthDetailsAdded(int requestId, const QString &realm, const QString &user, const QString &password)
Emitted when network authentication details have been added to a request.
static QNetworkRequest::CacheLoadControl cacheLoadControlFromName(const QString &name)
Returns QNetworkRequest::CacheLoadControl from a name.
bool cacheDisabled() const
Returns true if all network caching is disabled.
QgsNetworkAccessManager(QObject *parent=nullptr)
void requestRequiresAuth(int requestId, const QString &realm)
Emitted when a network request prompts an authentication request.
void setAuthHandler(std::unique_ptr< QgsNetworkAuthenticationHandler > handler)
Sets the application network authentication handler, which is used to respond to network authenticati...
static void setTimeout(int time)
Sets the maximum timeout time for network requests, in milliseconds.
static QgsNetworkReplyContent blockingPost(QNetworkRequest &request, const QByteArray &data, const QString &authCfg=QString(), bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Posts a POST request to obtain the contents of the target request, using the given data,...
const QNetworkProxy & fallbackProxy() const
Returns the fallback proxy used by the manager.
static int timeout()
Returns the network timeout length, in milliseconds.
void setupDefaultProxyAndCache(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Setup the QgsNetworkAccessManager (NAM) according to the user's settings.
void setFallbackProxyAndExcludes(const QNetworkProxy &proxy, const QStringList &excludes, const QStringList &noProxyURLs)
Sets the fallback proxy and URLs which shouldn't use it.
Q_DECL_DEPRECATED void requestCreated(QNetworkReply *)
Q_DECL_DEPRECATED void requestAboutToBeCreated(QNetworkAccessManager::Operation, const QNetworkRequest &, QIODevice *)
QStringList excludeList() const
Returns the proxy exclude list.
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
void removeProxyFactory(QNetworkProxyFactory *factory)
Removes a factory from the proxy factories list.
void authBrowserAborted()
Emitted when external browser logins are to be aborted.
void requestTimedOut(QgsNetworkRequestParameters request)
Emitted when a network request has timed out.
bool useSystemProxy() const
Returns whether the system proxy should be used.
QNetworkReply * createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData=nullptr) override
virtual void handleAuthRequest(QNetworkReply *reply, QAuthenticator *auth)
Called whenever network authentication requests are encountered during a network reply.
virtual void handleAuthRequestCloseBrowser()
Called to terminate a network authentication through external browser.
virtual void handleAuthRequestOpenBrowser(const QUrl &url)
Called to initiate a network authentication through external browser url.
Wrapper implementation of QNetworkDiskCache with all methods guarded by a mutex soly for internal use...
void setCacheDirectory(const QString &cacheDir)
qint64 maximumCacheSize() const
void setMaximumCacheSize(qint64 size)
QString cacheDirectory() const
Encapsulates a network reply within a container which is inexpensive to copy and safe to pass between...
Encapsulates parameters and properties of a network request.
QgsNetworkRequestParameters()=default
Default constructor.
virtual void handleSslErrors(QNetworkReply *reply, const QList< QSslError > &errors)
Called whenever SSL errors are encountered during a network reply.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
#define QgsDebugMsgLevel(str, level)