40#include <QNetworkReply>
41#include <QRecursiveMutex>
42#include <QThreadStorage>
43#include <QAuthenticator>
44#include <QStandardPaths>
50#include <QSslConfiguration>
58static std::vector< std::pair< QString, std::function< void( QNetworkRequest * ) > > > sCustomPreprocessors;
59static std::vector< std::pair< QString, std::function< void(
const QNetworkRequest &, QNetworkReply * ) > > > sCustomReplyPreprocessors;
62class QgsNetworkProxyFactory :
public QNetworkProxyFactory
65 QgsNetworkProxyFactory() =
default;
67 QList<QNetworkProxy> queryProxy(
const QNetworkProxyQuery &query = QNetworkProxyQuery() )
override
73 for ( QNetworkProxyFactory *f : constProxyFactories )
75 QList<QNetworkProxy> systemproxies = QNetworkProxyFactory::systemProxyForQuery( query );
76 if ( !systemproxies.isEmpty() )
79 QList<QNetworkProxy> proxies = f->queryProxy( query );
80 if ( !proxies.isEmpty() )
85 if ( query.queryType() != QNetworkProxyQuery::UrlRequest )
88 const QString url = query.url().toString();
91 for (
const QString &noProxy : constNoProxyList )
93 if ( !noProxy.trimmed().isEmpty() && url.startsWith( noProxy ) )
95 QgsDebugMsgLevel( QStringLiteral(
"don't using any proxy for %1 [exclude %2]" ).arg( url, noProxy ), 4 );
96 return QList<QNetworkProxy>() << QNetworkProxy( QNetworkProxy::NoProxy );
101 for (
const QString &exclude : constExcludeList )
103 if ( !exclude.trimmed().isEmpty() && url.startsWith( exclude ) )
105 QgsDebugMsgLevel( QStringLiteral(
"using default proxy for %1 [exclude %2]" ).arg( url, exclude ), 4 );
106 return QList<QNetworkProxy>() << QNetworkProxy( QNetworkProxy::DefaultProxy );
112 QgsDebugMsgLevel( QStringLiteral(
"requesting system proxy for query %1" ).arg( url ), 4 );
113 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery( query );
114 if ( !proxies.isEmpty() )
117 .arg( proxies.first().hostName() ).arg( proxies.first().port() ), 4 );
122 QgsDebugMsgLevel( QStringLiteral(
"using fallback proxy for %1" ).arg( url ), 4 );
129class QgsNetworkCookieJar :
public QNetworkCookieJar
135 : QNetworkCookieJar( parent )
139 bool deleteCookie(
const QNetworkCookie &cookie )
override
141 const QMutexLocker locker( &mMutex );
142 if ( QNetworkCookieJar::deleteCookie( cookie ) )
144 emit mNam->cookiesChanged( allCookies() );
149 bool insertCookie(
const QNetworkCookie &cookie )
override
151 const QMutexLocker locker( &mMutex );
152 if ( QNetworkCookieJar::insertCookie( cookie ) )
154 emit mNam->cookiesChanged( allCookies() );
159 bool setCookiesFromUrl(
const QList<QNetworkCookie> &cookieList,
const QUrl &url )
override
161 const QMutexLocker locker( &mMutex );
162 return QNetworkCookieJar::setCookiesFromUrl( cookieList, url );
164 bool updateCookie(
const QNetworkCookie &cookie )
override
166 const QMutexLocker locker( &mMutex );
167 if ( QNetworkCookieJar::updateCookie( cookie ) )
169 emit mNam->cookiesChanged( allCookies() );
176 QList<QNetworkCookie> allCookies()
const
178 const QMutexLocker locker( &mMutex );
179 return QNetworkCookieJar::allCookies();
181 void setAllCookies(
const QList<QNetworkCookie> &cookieList )
183 const QMutexLocker locker( &mMutex );
184 QNetworkCookieJar::setAllCookies( cookieList );
188 mutable QRecursiveMutex mMutex;
198 static QThreadStorage<QgsNetworkAccessManager> sInstances;
201 if ( nam->thread() == qApp->thread() )
204 if ( !nam->mInitialized )
214 : QNetworkAccessManager( parent )
215 , mSslErrorHandlerSemaphore( 1 )
216 , mAuthRequestHandlerSemaphore( 1 )
218 setProxyFactory(
new QgsNetworkProxyFactory() );
219 setCookieJar(
new QgsNetworkCookieJar(
this ) );
220 enableStrictTransportSecurityStore(
true );
221 setStrictTransportSecurityEnabled(
true );
226 Q_ASSERT( sMainNAM ==
this );
227 mSslErrorHandler = std::move( handler );
232 Q_ASSERT( sMainNAM ==
this );
233 mAuthHandler = std::move( handler );
238 mProxyFactories.insert( 0, factory );
243 mProxyFactories.removeAll( factory );
248 return mProxyFactories;
253 return mExcludedURLs;
263 return mFallbackProxy;
268 QgsDebugMsgLevel( QStringLiteral(
"proxy settings: (type:%1 host: %2:%3, user:%4, password:%5" )
269 .arg( proxy.type() == QNetworkProxy::DefaultProxy ? QStringLiteral(
"DefaultProxy" ) :
270 proxy.type() == QNetworkProxy::Socks5Proxy ? QStringLiteral(
"Socks5Proxy" ) :
271 proxy.type() == QNetworkProxy::NoProxy ? QStringLiteral(
"NoProxy" ) :
272 proxy.type() == QNetworkProxy::HttpProxy ? QStringLiteral(
"HttpProxy" ) :
273 proxy.type() == QNetworkProxy::HttpCachingProxy ? QStringLiteral(
"HttpCachingProxy" ) :
274 proxy.type() == QNetworkProxy::FtpCachingProxy ? QStringLiteral(
"FtpCachingProxy" ) :
275 QStringLiteral(
"Undefined" ),
279 proxy.password().isEmpty() ? QStringLiteral(
"not set" ) : QStringLiteral(
"set" ) ), 4 );
281 mFallbackProxy = proxy;
282 mExcludedURLs = excludes;
284 mExcludedURLs.erase( std::remove_if( mExcludedURLs.begin(), mExcludedURLs.end(),
285 [](
const QString & url )
287 return url.trimmed().isEmpty();
288 } ), mExcludedURLs.end() );
290 mNoProxyURLs = noProxyURLs;
291 mNoProxyURLs.erase( std::remove_if( mNoProxyURLs.begin(), mNoProxyURLs.end(),
292 [](
const QString & url )
294 return url.trimmed().isEmpty();
295 } ), mNoProxyURLs.end() );
302 QNetworkRequest *pReq(
const_cast< QNetworkRequest *
>( &req ) );
304 QString userAgent = s.
value( QStringLiteral(
"/qgis/networkAndProxy/userAgent" ),
"Mozilla/5.0" ).toString();
305 if ( !userAgent.isEmpty() )
307 userAgent += QStringLiteral(
"QGIS/%1/%2" ).arg(
Qgis::versionInt() ).arg( QSysInfo::prettyProductName() );
308 pReq->setRawHeader(
"User-Agent", userAgent.toLatin1() );
311 const bool ishttps = pReq->url().scheme().compare( QLatin1String(
"https" ), Qt::CaseInsensitive ) == 0;
314 QgsDebugMsgLevel( QStringLiteral(
"Adding trusted CA certs to request" ), 3 );
315 QSslConfiguration sslconfig( pReq->sslConfiguration() );
319 const QString hostport( QStringLiteral(
"%1:%2" )
320 .arg( pReq->url().host().trimmed() )
321 .arg( pReq->url().port() != -1 ? pReq->url().port() : 443 ) );
323 if ( !servconfig.
isNull() )
325 QgsDebugMsgLevel( QStringLiteral(
"Adding SSL custom config to request for %1" ).arg( hostport ), 2 );
331 pReq->setSslConfiguration( sslconfig );
335 if ( sMainNAM->mCacheDisabled )
338 pReq->setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork );
339 pReq->setAttribute( QNetworkRequest::CacheSaveControlAttribute,
false );
342 for (
const auto &preprocessor : sCustomPreprocessors )
344 preprocessor.second( pReq );
347 static QAtomicInt sRequestId = 0;
348 const int requestId = ++sRequestId;
350 if ( QBuffer *buffer = qobject_cast<QBuffer *>( outgoingData ) )
352 content = buffer->buffer();
359 QNetworkReply *reply = QNetworkAccessManager::createRequest( op, req, outgoingData );
360 reply->setProperty(
"requestId", requestId );
367 connect( reply, &QNetworkReply::downloadProgress,
this, &QgsNetworkAccessManager::onReplyDownloadProgress );
369 connect( reply, &QNetworkReply::sslErrors,
this, &QgsNetworkAccessManager::onReplySslErrors );
372 for (
const auto &replyPreprocessor : sCustomReplyPreprocessors )
374 replyPreprocessor.second( req, reply );
382 QTimer *timer =
new QTimer( reply );
383 timer->setObjectName( QStringLiteral(
"timeoutTimer" ) );
384 connect( timer, &QTimer::timeout,
this, &QgsNetworkAccessManager::abortRequest );
385 timer->setSingleShot(
true );
388 connect( reply, &QNetworkReply::downloadProgress, timer, [timer] { timer->start(); } );
389 connect( reply, &QNetworkReply::uploadProgress, timer, [timer] { timer->start(); } );
390 connect( reply, &QNetworkReply::finished, timer, &QTimer::stop );
392 QgsDebugMsgLevel( QStringLiteral(
"Created [reply:%1]" ).arg(
reinterpret_cast< qint64
>( reply ), 0, 16 ), 3 );
397void QgsNetworkAccessManager::abortRequest()
399 QTimer *timer = qobject_cast<QTimer *>( sender() );
402 QNetworkReply *reply = qobject_cast<QNetworkReply *>( timer->parent() );
406 QgsDebugMsgLevel( QStringLiteral(
"Abort [reply:%1] %2" ).arg(
reinterpret_cast< qint64
>( reply ), 0, 16 ).arg( reply->url().toString() ), 3 );
413void QgsNetworkAccessManager::onReplyFinished( QNetworkReply *reply )
418void QgsNetworkAccessManager::onReplyDownloadProgress( qint64 bytesReceived, qint64 bytesTotal )
420 if ( QNetworkReply *reply = qobject_cast< QNetworkReply *>( sender() ) )
427void QgsNetworkAccessManager::onReplySslErrors(
const QList<QSslError> &errors )
429 QNetworkReply *reply = qobject_cast< QNetworkReply *>( sender() );
431 Q_ASSERT( reply->manager() ==
this );
433 QgsDebugMsgLevel( QStringLiteral(
"Stopping network reply timeout whilst SSL error is handled" ), 2 );
434 pauseTimeout( reply );
439 mSslErrorHandlerSemaphore.acquire();
443 emit sslErrorsOccurred( reply, errors );
444 if (
this != sMainNAM )
448 mSslErrorHandlerSemaphore.acquire();
449 mSslErrorHandlerSemaphore.release();
450 afterSslErrorHandled( reply );
454void QgsNetworkAccessManager::afterSslErrorHandled( QNetworkReply *reply )
456 if ( reply->manager() ==
this )
458 restartTimeout( reply );
459 emit sslErrorsHandled( reply );
463void QgsNetworkAccessManager::afterAuthRequestHandled( QNetworkReply *reply )
465 if ( reply->manager() ==
this )
467 restartTimeout( reply );
468 emit authRequestHandled( reply );
472void QgsNetworkAccessManager::pauseTimeout( QNetworkReply *reply )
474 Q_ASSERT( reply->manager() ==
this );
476 QTimer *timer = reply->findChild<QTimer *>( QStringLiteral(
"timeoutTimer" ) );
477 if ( timer && timer->isActive() )
483void QgsNetworkAccessManager::restartTimeout( QNetworkReply *reply )
485 Q_ASSERT( reply->manager() ==
this );
487 QTimer *timer = reply->findChild<QTimer *>( QStringLiteral(
"timeoutTimer" ) );
490 Q_ASSERT( !timer->isActive() );
491 QgsDebugMsgLevel( QStringLiteral(
"Restarting network reply timeout" ), 2 );
492 timer->setSingleShot(
true );
497int QgsNetworkAccessManager::getRequestId( QNetworkReply *reply )
499 return reply->property(
"requestId" ).toInt();
502void QgsNetworkAccessManager::handleSslErrors( QNetworkReply *reply,
const QList<QSslError> &errors )
504 mSslErrorHandler->handleSslErrors( reply, errors );
505 afterSslErrorHandled( reply );
506 qobject_cast<QgsNetworkAccessManager *>( reply->manager() )->mSslErrorHandlerSemaphore.release();
511void QgsNetworkAccessManager::onAuthRequired( QNetworkReply *reply, QAuthenticator *auth )
514 Q_ASSERT( reply->manager() ==
this );
516 QgsDebugMsgLevel( QStringLiteral(
"Stopping network reply timeout whilst auth request is handled" ), 2 );
517 pauseTimeout( reply );
522 mAuthRequestHandlerSemaphore.acquire();
526 emit authRequestOccurred( reply, auth );
528 if (
this != sMainNAM )
532 mAuthRequestHandlerSemaphore.acquire();
533 mAuthRequestHandlerSemaphore.release();
534 afterAuthRequestHandled( reply );
540 if (
this != sMainNAM )
546 mAuthHandler->handleAuthRequestOpenBrowser( url );
551 if (
this != sMainNAM )
557 mAuthHandler->handleAuthRequestCloseBrowser();
562 if (
this != sMainNAM )
569void QgsNetworkAccessManager::handleAuthRequest( QNetworkReply *reply, QAuthenticator *auth )
571 mAuthHandler->handleAuthRequest( reply, auth );
575 afterAuthRequestHandled( reply );
576 qobject_cast<QgsNetworkAccessManager *>( reply->manager() )->mAuthRequestHandlerSemaphore.release();
583 case QNetworkRequest::AlwaysNetwork:
584 return QStringLiteral(
"AlwaysNetwork" );
585 case QNetworkRequest::PreferNetwork:
586 return QStringLiteral(
"PreferNetwork" );
587 case QNetworkRequest::PreferCache:
588 return QStringLiteral(
"PreferCache" );
589 case QNetworkRequest::AlwaysCache:
590 return QStringLiteral(
"AlwaysCache" );
592 return QStringLiteral(
"PreferNetwork" );
597 if ( name == QLatin1String(
"AlwaysNetwork" ) )
599 return QNetworkRequest::AlwaysNetwork;
601 else if ( name == QLatin1String(
"PreferNetwork" ) )
603 return QNetworkRequest::PreferNetwork;
605 else if ( name == QLatin1String(
"PreferCache" ) )
607 return QNetworkRequest::PreferCache;
609 else if ( name == QLatin1String(
"AlwaysCache" ) )
611 return QNetworkRequest::AlwaysCache;
613 return QNetworkRequest::PreferNetwork;
619 mUseSystemProxy =
false;
621 Q_ASSERT( sMainNAM );
623 if ( sMainNAM !=
this )
625 connect(
this, &QNetworkAccessManager::proxyAuthenticationRequired,
626 sMainNAM, &QNetworkAccessManager::proxyAuthenticationRequired,
647 connect(
this, &QNetworkAccessManager::sslErrors,
648 sMainNAM, &QNetworkAccessManager::sslErrors,
661 if ( !mSslErrorHandler )
665 setAuthHandler( std::make_unique< QgsNetworkAuthenticationHandler>() );
668 connect(
this, &QgsNetworkAccessManager::sslErrorsOccurred, sMainNAM, &QgsNetworkAccessManager::handleSslErrors );
670 connect(
this, &QNetworkAccessManager::authenticationRequired,
this, &QgsNetworkAccessManager::onAuthRequired );
671 connect(
this, &QgsNetworkAccessManager::authRequestOccurred, sMainNAM, &QgsNetworkAccessManager::handleAuthRequest );
673 connect(
this, &QNetworkAccessManager::finished,
this, &QgsNetworkAccessManager::onReplyFinished );
678 QStringList excludes;
679 QStringList noProxyURLs;
681 const bool proxyEnabled = settings.
value( QStringLiteral(
"proxy/proxyEnabled" ),
false ).toBool();
686 excludes = settings.
value( QStringLiteral(
"proxy/proxyExcludedUrls" ), QStringList() ).toStringList();
688 noProxyURLs = settings.
value( QStringLiteral(
"proxy/noProxyUrls" ), QStringList() ).toStringList();
691 const QString proxyHost = settings.
value( QStringLiteral(
"proxy/proxyHost" ),
"" ).toString();
692 const int proxyPort = settings.
value( QStringLiteral(
"proxy/proxyPort" ),
"" ).toString().toInt();
694 const QString proxyUser = settings.
value( QStringLiteral(
"proxy/proxyUser" ),
"" ).toString();
695 const QString proxyPassword = settings.
value( QStringLiteral(
"proxy/proxyPassword" ),
"" ).toString();
697 const QString proxyTypeString = settings.
value( QStringLiteral(
"proxy/proxyType" ),
"" ).toString();
699 if ( proxyTypeString == QLatin1String(
"DefaultProxy" ) )
701 mUseSystemProxy =
true;
702 QNetworkProxyFactory::setUseSystemConfiguration(
true );
703 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery();
704 if ( !proxies.isEmpty() )
706 proxy = proxies.first();
712 QNetworkProxy::ProxyType proxyType = QNetworkProxy::DefaultProxy;
713 if ( proxyTypeString == QLatin1String(
"Socks5Proxy" ) )
715 proxyType = QNetworkProxy::Socks5Proxy;
717 else if ( proxyTypeString == QLatin1String(
"HttpProxy" ) )
719 proxyType = QNetworkProxy::HttpProxy;
721 else if ( proxyTypeString == QLatin1String(
"HttpCachingProxy" ) )
723 proxyType = QNetworkProxy::HttpCachingProxy;
725 else if ( proxyTypeString == QLatin1String(
"FtpCachingProxy" ) )
727 proxyType = QNetworkProxy::FtpCachingProxy;
731 .arg( proxyHost ).arg( proxyPort )
732 .arg( proxyUser, proxyPassword ), 2
734 proxy = QNetworkProxy( proxyType, proxyHost, proxyPort, proxyUser, proxyPassword );
737 const QString authcfg = settings.
value( QStringLiteral(
"proxy/authcfg" ),
"" ).toString();
738 if ( !authcfg.isEmpty( ) )
740 QgsDebugMsgLevel( QStringLiteral(
"setting proxy from stored authentication configuration %1" ).arg( authcfg ), 2 );
743 authManager->updateNetworkProxy( proxy, authcfg );
754 if ( cacheDirectory.isEmpty() )
755 cacheDirectory = QStandardPaths::writableLocation( QStandardPaths::CacheLocation );
763 if ( cache() != newcache )
764 setCache( newcache );
766 if (
this != sMainNAM )
768 static_cast<QgsNetworkCookieJar *
>( cookieJar() )->setAllCookies(
static_cast<QgsNetworkCookieJar *
>( sMainNAM->cookieJar() )->allCookies() );
772void QgsNetworkAccessManager::syncCookies(
const QList<QNetworkCookie> &cookies )
774 if ( sender() !=
this )
776 static_cast<QgsNetworkCookieJar *
>( cookieJar() )->setAllCookies( cookies );
777 if (
this == sMainNAM )
798 br.
get( request, forceRefresh, feedback );
806 br.
post( request, data, forceRefresh, feedback );
812 QString
id = QUuid::createUuid().toString();
813 sCustomPreprocessors.emplace_back( std::make_pair(
id, processor ) );
819 const size_t prevCount = sCustomPreprocessors.size();
820 sCustomPreprocessors.erase( std::remove_if( sCustomPreprocessors.begin(), sCustomPreprocessors.end(), [
id]( std::pair< QString, std::function<
void( QNetworkRequest * ) > > &a )
822 return a.first == id;
823 } ), sCustomPreprocessors.end() );
824 return prevCount != sCustomPreprocessors.size();
829 QString
id = QUuid::createUuid().toString();
830 sCustomReplyPreprocessors.emplace_back( std::make_pair(
id, processor ) );
836 const size_t prevCount = sCustomReplyPreprocessors.size();
837 sCustomReplyPreprocessors.erase( std::remove_if( sCustomReplyPreprocessors.begin(), sCustomReplyPreprocessors.end(), [
id]( std::pair< QString, std::function<
void(
const QNetworkRequest &, QNetworkReply * ) > > &a )
839 return a.first == id;
840 } ), sCustomReplyPreprocessors.end() );
841 return prevCount != sCustomReplyPreprocessors.size();
846 for (
const auto &preprocessor : sCustomPreprocessors )
848 preprocessor.second( req );
858 : mOperation( operation )
859 , mRequest( request )
860 , mOriginatingThreadId( QStringLiteral(
"0x%2" ).arg( reinterpret_cast<quintptr>( QThread::currentThread() ), 2 * QT_POINTER_SIZE, 16, QLatin1Char(
'0' ) ) )
861 , mRequestId( requestId )
862 , mContent( content )
863 , mInitiatorClass( request.attribute( static_cast< QNetworkRequest::Attribute >(
QgsNetworkRequestParameters::AttributeInitiatorClass ) ).toString() )
864 , mInitiatorRequestId( request.attribute( static_cast< QNetworkRequest::Attribute >(
QgsNetworkRequestParameters::AttributeInitiatorRequestId ) ) )
876 QgsDebugError( QStringLiteral(
"SSL errors occurred accessing URL:\n%1" ).arg( reply->request().url().toString() ) );
886 QgsDebugError( 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() ) );
892 QgsDebugError( QStringLiteral(
"Network authentication required external browser to open URL %1, but no handler was in place" ).arg( url.toString() ) );
897 QgsDebugError( QStringLiteral(
"Network authentication required external browser closed, but no handler was in place" ) );
901#include "qgsnetworkaccessmanager.moc"
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.
Singleton offering an interface to manage the authentication configuration database and to utilize co...
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 post(QNetworkRequest &request, QIODevice *data, bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Performs a "post" operation on the specified request, using the given data.
void setAuthCfg(const QString &authCfg)
Sets the authentication config id which should be used during the request.
ErrorCode get(QNetworkRequest &request, bool forceRefresh=false, QgsFeedback *feedback=nullptr, RequestFlags requestFlags=QgsBlockingNetworkRequest::RequestFlags())
Performs a "get" operation on the specified request.
QgsNetworkReplyContent reply() const
Returns the content of the network reply, after a get(), post(), head() or put() request has been mad...
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 const QgsSettingsEntryInteger * settingsNetworkTimeout
Settings entry network timeout.
void cookiesChanged(const QList< QNetworkCookie > &cookies)
Emitted when the cookies changed.
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...
Q_DECL_DEPRECATED void requestAboutToBeCreated(QNetworkAccessManager::Operation operation, const QNetworkRequest &request, QIODevice *device)
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.
void requestCreated(const QgsNetworkRequestParameters &request)
Emitted when a network request has been created.
static QString setReplyPreprocessor(const std::function< void(const QNetworkRequest &, QNetworkReply *)> &processor)
Sets a reply pre-processor function, which allows manipulation of QNetworkReply objects after they ar...
static bool removeRequestPreprocessor(const QString &id)
Removes the custom request pre-processor function with matching id.
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 preprocessRequest(QNetworkRequest *req) const
Preprocesses 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.
static QString setRequestPreprocessor(const std::function< void(QNetworkRequest *request)> &processor)
Sets a request pre-processor function, which allows manipulation of a network request before it is pr...
void setFallbackProxyAndExcludes(const QNetworkProxy &proxy, const QStringList &excludes, const QStringList &noProxyURLs)
Sets the fallback proxy and URLs which shouldn't use it.
static bool removeReplyPreprocessor(const QString &id)
Removes the custom reply pre-processor function with matching id.
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
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
bool setValue(const T &value, const QString &dynamicKeyPart=QString()) const
Set settings value.
An integer settings entry.
static const QgsSettingsEntryInteger64 * settingsNetworkCacheSize
Settings entry network cache directory.
static const QgsSettingsEntryString * settingsNetworkCacheDirectory
Settings entry network cache directory.
static QgsSettingsTreeNode * sTreeNetwork
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
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)
#define QgsDebugError(str)