QGIS API Documentation  3.14.0-Pi (9f7028fd23)
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( __FILE__ ).mid( sFilePrefixLength ) + ':' + QString::number( __LINE__ ) + " (" + __FUNCTION__ + ")" );
42 #define QgsSetRequestInitiatorId(request, str) request.setAttribute( static_cast< QNetworkRequest::Attribute >( QgsNetworkRequestParameters::AttributeInitiatorRequestId ), 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 
65  QgsNetworkRequestParameters() = default;
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 
415  bool useSystemProxy() const { return mUseSystemProxy; }
416 
423  static int timeout();
424 
431  static void setTimeout( int time );
432 
453  static QgsNetworkReplyContent blockingGet( QNetworkRequest &request, const QString &authCfg = QString(), bool forceRefresh = false, QgsFeedback *feedback = nullptr );
454 
475  static QgsNetworkReplyContent blockingPost( QNetworkRequest &request, const QByteArray &data, const QString &authCfg = QString(), bool forceRefresh = false, QgsFeedback *feedback = nullptr );
476 
477  signals:
478 
482  Q_DECL_DEPRECATED void requestAboutToBeCreated( QNetworkAccessManager::Operation, const QNetworkRequest &, QIODevice * ) SIP_DEPRECATED;
483 
495  void requestAboutToBeCreated( QgsNetworkRequestParameters request );
496 
511  void finished( QgsNetworkReplyContent reply );
512 
524  void requestTimedOut( QgsNetworkRequestParameters request );
525 
540  void downloadProgress( int requestId, qint64 bytesReceived, qint64 bytesTotal );
541 
557  void requestRequiresAuth( int requestId, const QString &realm );
558 
574  void requestAuthDetailsAdded( int requestId, const QString &realm, const QString &user, const QString &password );
575 
576 #ifndef QT_NO_SSL
577 
592  void requestEncounteredSslErrors( int requestId, const QList<QSslError> &errors );
593 
594 #ifndef SIP_RUN
595  // these signals are for internal use only - it's not safe to connect by external code
597  void sslErrorsOccurred( QNetworkReply *, const QList<QSslError> &errors );
598  void sslErrorsHandled( QNetworkReply *reply );
600 #endif
601 
602 #endif
603 
607  Q_DECL_DEPRECATED void requestCreated( QNetworkReply * ) SIP_DEPRECATED;
608 
609  void requestTimedOut( QNetworkReply * );
610 
611 #ifndef SIP_RUN
612  // these signals are for internal use only - it's not safe to connect by external code
614  void authRequestOccurred( QNetworkReply *, QAuthenticator *auth );
615  void authRequestHandled( QNetworkReply *reply );
617 #endif
618 
619 
620  private slots:
621  void abortRequest();
622 
623  void onReplyFinished( QNetworkReply *reply );
624 
625  void onReplyDownloadProgress( qint64 bytesReceived, qint64 bytesTotal );
626 #ifndef QT_NO_SSL
627  void onReplySslErrors( const QList<QSslError> &errors );
628 
629  void handleSslErrors( QNetworkReply *reply, const QList<QSslError> &errors );
630 #endif
631 
632  void onAuthRequired( QNetworkReply *reply, QAuthenticator *auth );
633  void handleAuthRequest( QNetworkReply *reply, QAuthenticator *auth );
634 
635  protected:
636  QNetworkReply *createRequest( QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData = nullptr ) override;
637 
638  private:
639 #ifndef QT_NO_SSL
640  void unlockAfterSslErrorHandled();
641  void afterSslErrorHandled( QNetworkReply *reply );
642 #endif
643 
644  void unlockAfterAuthRequestHandled();
645  void afterAuthRequestHandled( QNetworkReply *reply );
646 
647  void pauseTimeout( QNetworkReply *reply );
648  void restartTimeout( QNetworkReply *reply );
649  static int getRequestId( QNetworkReply *reply );
650 
651  QList<QNetworkProxyFactory *> mProxyFactories;
652  QNetworkProxy mFallbackProxy;
653  QStringList mExcludedURLs;
654  QStringList mNoProxyURLs;
655  bool mUseSystemProxy = false;
656  bool mInitialized = false;
657  static QgsNetworkAccessManager *sMainNAM;
658  // ssl error handler, will be set for main thread ONLY
659  std::unique_ptr< QgsSslErrorHandler > mSslErrorHandler;
660  // only in use by worker threads, unused in main thread
661  QMutex mSslErrorHandlerMutex;
662  // only in use by worker threads, unused in main thread
663  QWaitCondition mSslErrorWaitCondition;
664 
665  // auth request handler, will be set for main thread ONLY
666  std::unique_ptr< QgsNetworkAuthenticationHandler > mAuthHandler;
667  // only in use by worker threads, unused in main thread
668  QMutex mAuthRequestHandlerMutex;
669  // only in use by worker threads, unused in main thread
670  QWaitCondition mAuthRequestWaitCondition;
671 
672 };
673 
674 #endif // QGSNETWORKACCESSMANAGER_H
QgsNetworkRequestParameters::requestId
int requestId() const
Returns a unique ID identifying the request.
Definition: qgsnetworkaccessmanager.h:97
QgsNetworkAuthenticationHandler
Network authentication handler, used for responding to network authentication requests during network...
Definition: qgsnetworkaccessmanager.h:213
QgsNetworkRequestParameters::request
QNetworkRequest request() const
Returns the network request.
Definition: qgsnetworkaccessmanager.h:87
QgsNetworkRequestParameters::content
QByteArray content() const
Returns the request's content.
Definition: qgsnetworkaccessmanager.h:103
QgsNetworkRequestParameters::initiatorClassName
QString initiatorClassName() const
Returns the class name of the object which initiated this request.
Definition: qgsnetworkaccessmanager.h:113
QgsNetworkRequestParameters::RequestAttributes
RequestAttributes
Custom request attributes.
Definition: qgsnetworkaccessmanager.h:56
SIP_TRANSFERBACK
#define SIP_TRANSFERBACK
Definition: qgis_sip.h:48
SIP_DEPRECATED
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
QgsSslErrorHandler
SSL error handler, used for responding to SSL errors encountered during network requests.
Definition: qgsnetworkaccessmanager.h:169
QgsNetworkRequestParameters
Definition: qgsnetworkaccessmanager.h:51
QgsNetworkRequestParameters::AttributeInitiatorRequestId
@ AttributeInitiatorRequestId
Internal ID used by originator object to identify requests.
Definition: qgsnetworkaccessmanager.h:59
QgsFeedback
Definition: qgsfeedback.h:43
qgis_sip.h
SIP_TRANSFER
#define SIP_TRANSFER
Definition: qgis_sip.h:36
QgsNetworkRequestParameters::initiatorRequestId
QVariant initiatorRequestId() const
Returns the internal ID used by the object which initiated this request to identify individual reques...
Definition: qgsnetworkaccessmanager.h:124
QgsNetworkAccessManager
network access manager for QGIS
Definition: qgsnetworkaccessmanager.h:251
sFilePrefixLength
constexpr int sFilePrefixLength
Definition: qgsnetworkaccessmanager.h:39
qgsnetworkreply.h
QgsNetworkReplyContent
Encapsulates a network reply within a container which is inexpensive to copy and safe to pass between...
Definition: qgsnetworkreply.h:28
QgsNetworkRequestParameters::originatingThreadId
QString originatingThreadId() const
Returns a string identifying the thread which the request originated from.
Definition: qgsnetworkaccessmanager.h:92
QgsNetworkRequestParameters::operation
QNetworkAccessManager::Operation operation() const
Returns the request operation, e.g.
Definition: qgsnetworkaccessmanager.h:79
QgsNetworkAccessManager::useSystemProxy
bool useSystemProxy() const
Returns whether the system proxy should be used.
Definition: qgsnetworkaccessmanager.h:415