QGIS API Documentation  3.8.0-Zanzibar (11aff65)
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 
362  QStringList excludeList() const;
363 
373  void setFallbackProxyAndExcludes( const QNetworkProxy &proxy, const QStringList &excludes );
374 
380  static QString cacheLoadControlName( QNetworkRequest::CacheLoadControl control );
381 
387  static QNetworkRequest::CacheLoadControl cacheLoadControlFromName( const QString &name );
388 
396  void setupDefaultProxyAndCache( Qt::ConnectionType connectionType = Qt::BlockingQueuedConnection );
397 
401  bool useSystemProxy() const { return mUseSystemProxy; }
402 
409  static int timeout();
410 
417  static void setTimeout( int time );
418 
439  static QgsNetworkReplyContent blockingGet( QNetworkRequest &request, const QString &authCfg = QString(), bool forceRefresh = false, QgsFeedback *feedback = nullptr );
440 
461  static QgsNetworkReplyContent blockingPost( QNetworkRequest &request, const QByteArray &data, const QString &authCfg = QString(), bool forceRefresh = false, QgsFeedback *feedback = nullptr );
462 
463  signals:
464 
468  Q_DECL_DEPRECATED void requestAboutToBeCreated( QNetworkAccessManager::Operation, const QNetworkRequest &, QIODevice * ) SIP_DEPRECATED;
469 
481  void requestAboutToBeCreated( QgsNetworkRequestParameters request );
482 
497  void finished( QgsNetworkReplyContent reply );
498 
510  void requestTimedOut( QgsNetworkRequestParameters request );
511 
526  void downloadProgress( int requestId, qint64 bytesReceived, qint64 bytesTotal );
527 
543  void requestRequiresAuth( int requestId, const QString &realm );
544 
560  void requestAuthDetailsAdded( int requestId, const QString &realm, const QString &user, const QString &password );
561 
562 #ifndef QT_NO_SSL
563 
578  void requestEncounteredSslErrors( int requestId, const QList<QSslError> &errors );
579 
580 #ifndef SIP_RUN
581  // these signals are for internal use only - it's not safe to connect by external code
583  void sslErrorsOccurred( QNetworkReply *, const QList<QSslError> &errors );
584  void sslErrorsHandled( QNetworkReply *reply );
586 #endif
587 
588 #endif
589 
593  Q_DECL_DEPRECATED void requestCreated( QNetworkReply * ) SIP_DEPRECATED;
594 
595  void requestTimedOut( QNetworkReply * );
596 
597 #ifndef SIP_RUN
598  // these signals are for internal use only - it's not safe to connect by external code
600  void authRequestOccurred( QNetworkReply *, QAuthenticator *auth );
601  void authRequestHandled( QNetworkReply *reply );
603 #endif
604 
605 
606  private slots:
607  void abortRequest();
608 
609  void onReplyFinished( QNetworkReply *reply );
610 
611  void onReplyDownloadProgress( qint64 bytesReceived, qint64 bytesTotal );
612 #ifndef QT_NO_SSL
613  void onReplySslErrors( const QList<QSslError> &errors );
614 
615  void handleSslErrors( QNetworkReply *reply, const QList<QSslError> &errors );
616 #endif
617 
618  void onAuthRequired( QNetworkReply *reply, QAuthenticator *auth );
619  void handleAuthRequest( QNetworkReply *reply, QAuthenticator *auth );
620 
621  protected:
622  QNetworkReply *createRequest( QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData = nullptr ) override;
623 
624  private:
625 #ifndef QT_NO_SSL
626  void unlockAfterSslErrorHandled();
627  void afterSslErrorHandled( QNetworkReply *reply );
628 #endif
629 
630  void unlockAfterAuthRequestHandled();
631  void afterAuthRequestHandled( QNetworkReply *reply );
632 
633  void pauseTimeout( QNetworkReply *reply );
634  void restartTimeout( QNetworkReply *reply );
635  static int getRequestId( QNetworkReply *reply );
636 
637  QList<QNetworkProxyFactory *> mProxyFactories;
638  QNetworkProxy mFallbackProxy;
639  QStringList mExcludedURLs;
640  bool mUseSystemProxy = false;
641  bool mInitialized = false;
642  static QgsNetworkAccessManager *sMainNAM;
643  // ssl error handler, will be set for main thread ONLY
644  std::unique_ptr< QgsSslErrorHandler > mSslErrorHandler;
645  // only in use by worker threads, unused in main thread
646  QMutex mSslErrorHandlerMutex;
647  // only in use by worker threads, unused in main thread
648  QWaitCondition mSslErrorWaitCondition;
649 
650  // auth request handler, will be set for main thread ONLY
651  std::unique_ptr< QgsNetworkAuthenticationHandler > mAuthHandler;
652  // only in use by worker threads, unused in main thread
653  QMutex mAuthRequestHandlerMutex;
654  // only in use by worker threads, unused in main thread
655  QWaitCondition mAuthRequestWaitCondition;
656 
657 };
658 
659 #endif // QGSNETWORKACCESSMANAGER_H
660 
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:41
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:99
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.