QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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
QVariant initiatorRequestId() const
Returns the internal ID used by the object which initiated this request to identify individual reques...
QByteArray content() const
Returns the request&#39;s content.
constexpr int sFilePrefixLength
Encapsulates parameters and properties of a network request.
#define SIP_TRANSFERBACK
Definition: qgis_sip.h:48
int requestId() const
Returns a unique ID identifying the request.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:44
Internal ID used by originator object to identify requests.
SSL error handler, used for responding to SSL errors encountered during network requests.
QString initiatorClassName() const
Returns the class name of the object which initiated this request.
#define SIP_TRANSFER
Definition: qgis_sip.h:36
QNetworkRequest request() const
Returns the network request.
QNetworkAccessManager::Operation operation() const
Returns the request operation, e.g.
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
Network authentication handler, used for responding to network authentication requests during network...
Encapsulates a network reply within a container which is inexpensive to copy and safe to pass between...
QString originatingThreadId() const
Returns a string identifying the thread which the request originated from.
bool useSystemProxy() const
Returns whether the system proxy should be used.
RequestAttributes
Custom request attributes.
network access manager for QGISThis class implements the QGIS network access manager.