QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgsnetworkaccessmanager.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsnetworkaccessmanager.h - description
3  -------------------
4  begin : 2010-05-08
5  copyright : (C) 2010 by Juergen E. Fischer
6  email : jef at norbit dot de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef QGSNETWORKACCESSMANAGER_H
19 #define QGSNETWORKACCESSMANAGER_H
20 
21 #include <QList>
22 #include "qgsnetworkreply.h"
23 #include "qgis_sip.h"
24 #include <QStringList>
25 #include <QNetworkAccessManager>
26 #include <QNetworkProxy>
27 #include <QNetworkRequest>
28 #include <QMutex>
29 #include <QWaitCondition>
30 #include <memory>
31 
32 #include "qgis_core.h"
33 #include "qgis_sip.h"
34 
35 class QgsFeedback;
36 
37 #ifndef SIP_RUN
38 #include "qgsconfig.h"
39 constexpr int sFilePrefixLength = CMAKE_SOURCE_DIR[sizeof( CMAKE_SOURCE_DIR ) - 1] == '/' ? sizeof( CMAKE_SOURCE_DIR ) + 1 : sizeof( CMAKE_SOURCE_DIR );
40 
41 #define QgsSetRequestInitiatorClass(request, _class) request.setAttribute( static_cast< QNetworkRequest::Attribute >( QgsNetworkRequestParameters::AttributeInitiatorClass ), _class ); request.setAttribute( static_cast< QNetworkRequest::Attribute >( QgsNetworkRequestParameters::AttributeInitiatorRequestId ), QString(QString( __FILE__ ).mid( sFilePrefixLength ) + ':' + QString::number( __LINE__ ) + " (" + __FUNCTION__ + ")") );
42 #define QgsSetRequestInitiatorId(request, str) request.setAttribute( static_cast< QNetworkRequest::Attribute >( QgsNetworkRequestParameters::AttributeInitiatorRequestId ), QString(QString( __FILE__ ).mid( sFilePrefixLength ) + ':' + QString::number( __LINE__ ) + " (" + __FUNCTION__ + "): " + str) );
43 #endif
44 
51 class CORE_EXPORT QgsNetworkRequestParameters
52 {
53  public:
54 
57  {
58  AttributeInitiatorClass = QNetworkRequest::User + 3000,
60  };
61 
66 
71  QgsNetworkRequestParameters( QNetworkAccessManager::Operation operation,
72  const QNetworkRequest &request,
73  int requestId,
74  const QByteArray &content = QByteArray() );
75 
79  QNetworkAccessManager::Operation operation() const { return mOperation; }
80 
87  QNetworkRequest request() const { return mRequest; }
88 
92  QString originatingThreadId() const { return mOriginatingThreadId; }
93 
97  int requestId() const { return mRequestId; }
98 
103  QByteArray content() const { return mContent; }
104 
113  QString initiatorClassName() const { return mInitiatorClass; }
114 
124  QVariant initiatorRequestId() const { return mInitiatorRequestId; }
125 
126  private:
127 
128  QNetworkAccessManager::Operation mOperation;
129  QNetworkRequest mRequest;
130  QString mOriginatingThreadId;
131  int mRequestId = 0;
132  QByteArray mContent;
133  QString mInitiatorClass;
134  QVariant mInitiatorRequestId;
135 };
136 
138 
139 #ifndef SIP_RUN
140 
169 class CORE_EXPORT QgsSslErrorHandler
170 {
171 
172  public:
173 
174  virtual ~QgsSslErrorHandler() = default;
175 
186  virtual void handleSslErrors( QNetworkReply *reply, const QList<QSslError> &errors );
187 
188 };
189 
214 {
215 
216  public:
217 
218  virtual ~QgsNetworkAuthenticationHandler() = default;
219 
228  virtual void handleAuthRequest( QNetworkReply *reply, QAuthenticator *auth );
229 
230 };
231 #endif
232 
233 
251 class CORE_EXPORT QgsNetworkAccessManager : public QNetworkAccessManager
252 {
253  Q_OBJECT
254 
255  public:
256 
275  static QgsNetworkAccessManager *instance( Qt::ConnectionType connectionType = Qt::BlockingQueuedConnection );
276 
277  QgsNetworkAccessManager( QObject *parent = nullptr );
278 
279 #ifndef SIP_RUN
280 
297  void setSslErrorHandler( std::unique_ptr< QgsSslErrorHandler > handler );
298 
315  void setAuthHandler( std::unique_ptr< QgsNetworkAuthenticationHandler > handler );
316 #endif
317 
326  void insertProxyFactory( QNetworkProxyFactory *factory SIP_TRANSFER );
327 
334  void removeProxyFactory( QNetworkProxyFactory *factory SIP_TRANSFERBACK );
335 
342  const QList<QNetworkProxyFactory *> proxyFactories() const;
343 
352  const QNetworkProxy &fallbackProxy() const;
353 
363  QStringList excludeList() const;
364 
374  QStringList noProxyList() const;
375 
387  void setFallbackProxyAndExcludes( const QNetworkProxy &proxy, const QStringList &excludes, const QStringList &noProxyURLs );
388 
394  static QString cacheLoadControlName( QNetworkRequest::CacheLoadControl control );
395 
401  static QNetworkRequest::CacheLoadControl cacheLoadControlFromName( const QString &name );
402 
410  void setupDefaultProxyAndCache( Qt::ConnectionType connectionType = Qt::BlockingQueuedConnection );
411 
412 #ifndef SIP_RUN
413 
421  bool cacheDisabled() const { return mCacheDisabled; }
422 
433  void setCacheDisabled( bool disabled ) { mCacheDisabled = disabled; }
434 #endif
435 
439  bool useSystemProxy() const { return mUseSystemProxy; }
440 
447  static int timeout();
448 
456  static void setTimeout( int time );
457 
478  static QgsNetworkReplyContent blockingGet( QNetworkRequest &request, const QString &authCfg = QString(), bool forceRefresh = false, QgsFeedback *feedback = nullptr );
479 
500  static QgsNetworkReplyContent blockingPost( QNetworkRequest &request, const QByteArray &data, const QString &authCfg = QString(), bool forceRefresh = false, QgsFeedback *feedback = nullptr );
501 
502  signals:
503 
507  Q_DECL_DEPRECATED void requestAboutToBeCreated( QNetworkAccessManager::Operation, const QNetworkRequest &, QIODevice * ) SIP_DEPRECATED;
508 
521 
537 
550 
565  void downloadProgress( int requestId, qint64 bytesReceived, qint64 bytesTotal );
566 
582  void requestRequiresAuth( int requestId, const QString &realm );
583 
599  void requestAuthDetailsAdded( int requestId, const QString &realm, const QString &user, const QString &password );
600 
601 #ifndef QT_NO_SSL
602 
617  void requestEncounteredSslErrors( int requestId, const QList<QSslError> &errors );
618 
619 #ifndef SIP_RUN
621  // these signals are for internal use only - it's not safe to connect by external code
622  void sslErrorsOccurred( QNetworkReply *, const QList<QSslError> &errors );
623  void sslErrorsHandled( QNetworkReply *reply );
625 #endif
626 
627 #endif
628 
632  Q_DECL_DEPRECATED void requestCreated( QNetworkReply * ) SIP_DEPRECATED;
633 
634  void requestTimedOut( QNetworkReply * );
635 
636 #ifndef SIP_RUN
638  // these signals are for internal use only - it's not safe to connect by external code
639  void authRequestOccurred( QNetworkReply *, QAuthenticator *auth );
640  void authRequestHandled( QNetworkReply *reply );
642 #endif
643 
644 
645  private slots:
646  void abortRequest();
647 
648  void onReplyFinished( QNetworkReply *reply );
649 
650  void onReplyDownloadProgress( qint64 bytesReceived, qint64 bytesTotal );
651 #ifndef QT_NO_SSL
652  void onReplySslErrors( const QList<QSslError> &errors );
653 
654  void handleSslErrors( QNetworkReply *reply, const QList<QSslError> &errors );
655 #endif
656 
657  void onAuthRequired( QNetworkReply *reply, QAuthenticator *auth );
658  void handleAuthRequest( QNetworkReply *reply, QAuthenticator *auth );
659 
660  protected:
661  QNetworkReply *createRequest( QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData = nullptr ) override;
662 
663  private:
664 #ifndef QT_NO_SSL
665  void unlockAfterSslErrorHandled();
666  void afterSslErrorHandled( QNetworkReply *reply );
667 #endif
668 
669  void unlockAfterAuthRequestHandled();
670  void afterAuthRequestHandled( QNetworkReply *reply );
671 
672  void pauseTimeout( QNetworkReply *reply );
673  void restartTimeout( QNetworkReply *reply );
674  static int getRequestId( QNetworkReply *reply );
675 
676  QList<QNetworkProxyFactory *> mProxyFactories;
677  QNetworkProxy mFallbackProxy;
678  QStringList mExcludedURLs;
679  QStringList mNoProxyURLs;
680  bool mUseSystemProxy = false;
681  bool mInitialized = false;
682  bool mCacheDisabled = false;
683  static QgsNetworkAccessManager *sMainNAM;
684  // ssl error handler, will be set for main thread ONLY
685  std::unique_ptr< QgsSslErrorHandler > mSslErrorHandler;
686  // only in use by worker threads, unused in main thread
687  QMutex mSslErrorHandlerMutex;
688  // only in use by worker threads, unused in main thread
689  QWaitCondition mSslErrorWaitCondition;
690 
691  // auth request handler, will be set for main thread ONLY
692  std::unique_ptr< QgsNetworkAuthenticationHandler > mAuthHandler;
693  // only in use by worker threads, unused in main thread
694  QMutex mAuthRequestHandlerMutex;
695  // only in use by worker threads, unused in main thread
696  QWaitCondition mAuthRequestWaitCondition;
697 
698 };
699 
700 #endif // QGSNETWORKACCESSMANAGER_H
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
network access manager for QGIS
void finished(QgsNetworkReplyContent reply)
Emitted whenever a pending network reply is finished.
void setCacheDisabled(bool disabled)
Sets whether all network caching should be disabled.
void downloadProgress(int requestId, qint64 bytesReceived, qint64 bytesTotal)
Emitted when a network reply receives a progress report.
void requestEncounteredSslErrors(int requestId, const QList< QSslError > &errors)
Emitted when a network request encounters SSL errors.
void requestTimedOut(QNetworkReply *)
void requestAboutToBeCreated(QgsNetworkRequestParameters request)
Emitted when a network request is about to be created.
void requestAuthDetailsAdded(int requestId, const QString &realm, const QString &user, const QString &password)
Emitted when network authentication details have been added to a request.
bool cacheDisabled() const
Returns true if all network caching is disabled.
void requestRequiresAuth(int requestId, const QString &realm)
Emitted when a network request prompts an authentication request.
Q_DECL_DEPRECATED void requestCreated(QNetworkReply *)
Q_DECL_DEPRECATED void requestAboutToBeCreated(QNetworkAccessManager::Operation, const QNetworkRequest &, QIODevice *)
void requestTimedOut(QgsNetworkRequestParameters request)
Emitted when a network request has timed out.
bool useSystemProxy() const
Returns whether the system proxy should be used.
Network authentication handler, used for responding to network authentication requests during network...
virtual ~QgsNetworkAuthenticationHandler()=default
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.
int requestId() const
Returns a unique ID identifying the request.
RequestAttributes
Custom request attributes.
@ AttributeInitiatorRequestId
Internal ID used by originator object to identify requests.
QgsNetworkRequestParameters()=default
Default constructor.
QNetworkAccessManager::Operation operation() const
Returns the request operation, e.g.
QNetworkRequest request() const
Returns the network request.
QString originatingThreadId() const
Returns a string identifying the thread which the request originated from.
QString initiatorClassName() const
Returns the class name of the object which initiated this request.
QByteArray content() const
Returns the request's content.
QVariant initiatorRequestId() const
Returns the internal ID used by the object which initiated this request to identify individual reques...
SSL error handler, used for responding to SSL errors encountered during network requests.
virtual ~QgsSslErrorHandler()=default
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_TRANSFERBACK
Definition: qgis_sip.h:48
constexpr int sFilePrefixLength