diff options
author | Kai Koehne <kai.koehne@qt.io> | 2016-10-21 11:46:49 +0200 |
---|---|---|
committer | Kai Koehne <kai.koehne@qt.io> | 2016-11-02 08:04:14 +0000 |
commit | 71166288cb71b58eb7a84b70e92a10396cdf9ee4 (patch) | |
tree | 3f4441f151ed35ecab10bc6d8f73a94525b83b15 | |
parent | c12f42e91b146109cc9ee5d050928672776ca1ee (diff) |
Add QNetworkProxy::usesSystemConfiguration() accessor
Allow to check programmatically whether using the system proxy settings
is enabled. To implement this the QSystemConfigurationProxyFactory is
replaced by an explicit boolean in QGlobalNetworkProxy.
Change-Id: I52231b4ffc890b085bcd1739acf93c97bdb18eb5
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
-rw-r--r-- | src/network/kernel/kernel.pri | 1 | ||||
-rw-r--r-- | src/network/kernel/qnetworkproxy.cpp | 72 | ||||
-rw-r--r-- | src/network/kernel/qnetworkproxy.h | 1 | ||||
-rw-r--r-- | src/network/kernel/qnetworkproxy_p.h | 84 |
4 files changed, 55 insertions, 103 deletions
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri index 8f37e28669..005f000c25 100644 --- a/src/network/kernel/kernel.pri +++ b/src/network/kernel/kernel.pri @@ -18,7 +18,6 @@ HEADERS += kernel/qtnetworkglobal.h \ kernel/qnetworkinterface.h \ kernel/qnetworkinterface_p.h \ kernel/qnetworkproxy.h \ - kernel/qnetworkproxy_p.h \ kernel/qurlinfo_p.h SOURCES += kernel/qauthenticator.cpp \ diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp index bb1a7d0d8b..94719e9c2d 100644 --- a/src/network/kernel/qnetworkproxy.cpp +++ b/src/network/kernel/qnetworkproxy.cpp @@ -224,7 +224,6 @@ #ifndef QT_NO_NETWORKPROXY -#include "private/qnetworkproxy_p.h" #include "private/qnetworkrequest_p.h" #include "private/qsocks5socketengine_p.h" #include "private/qhttpsocketengine_p.h" @@ -256,10 +255,12 @@ public: #ifndef QT_NO_HTTP , httpSocketEngineHandler(0) #endif - { #ifdef QT_USE_SYSTEM_PROXIES - setApplicationProxyFactory(new QSystemConfigurationProxyFactory); + , useSystemProxies(true) +#else + , useSystemProxies(false) #endif + { #ifndef QT_NO_SOCKS5 socks5SocketEngineHandler = new QSocks5SocketEngineHandler(); #endif @@ -280,6 +281,24 @@ public: #endif } + bool usesSystemConfiguration() const + { + return useSystemProxies; + } + + void setUseSystemConfiguration(bool enable) + { + QMutexLocker lock(&mutex); + useSystemProxies = enable; + + if (useSystemProxies) { + if (applicationLevelProxy) + *applicationLevelProxy = QNetworkProxy(); + delete applicationLevelProxyFactory; + applicationLevelProxyFactory = nullptr; + } + } + void setApplicationProxy(const QNetworkProxy &proxy) { QMutexLocker lock(&mutex); @@ -288,6 +307,7 @@ public: *applicationLevelProxy = proxy; delete applicationLevelProxyFactory; applicationLevelProxyFactory = 0; + useSystemProxies = false; } void setApplicationProxyFactory(QNetworkProxyFactory *factory) @@ -299,6 +319,7 @@ public: *applicationLevelProxy = QNetworkProxy(); delete applicationLevelProxyFactory; applicationLevelProxyFactory = factory; + useSystemProxies = false; } QNetworkProxy applicationProxy() @@ -318,6 +339,7 @@ private: #ifndef QT_NO_HTTP QHttpSocketEngineHandler *httpSocketEngineHandler; #endif + bool useSystemProxies; }; QList<QNetworkProxy> QGlobalNetworkProxy::proxyForQuery(const QNetworkProxyQuery &query) @@ -339,10 +361,19 @@ QList<QNetworkProxy> QGlobalNetworkProxy::proxyForQuery(const QNetworkProxyQuery if (!applicationLevelProxyFactory) { if (applicationLevelProxy - && applicationLevelProxy->type() != QNetworkProxy::DefaultProxy) + && applicationLevelProxy->type() != QNetworkProxy::DefaultProxy) { result << *applicationLevelProxy; - else + } else if (useSystemProxies) { + result = QNetworkProxyFactory::systemProxyForQuery(query); + + // Make sure NoProxy is in the list, so that QTcpServer can work: + // it searches for the first proxy that can has the ListeningCapability capability + // if none have (as is the case with HTTP proxies), it fails to bind. + // NoProxy allows it to fallback to the 'no proxy' case and bind. + result << QNetworkProxy(QNetworkProxy::NoProxy); + } else { result << QNetworkProxy(QNetworkProxy::NoProxy); + } return result; } @@ -717,7 +748,8 @@ quint16 QNetworkProxy::port() const Setting a default proxy value with this function will override the application proxy factory set with - QNetworkProxyFactory::setApplicationProxyFactory. + QNetworkProxyFactory::setApplicationProxyFactory, and disable the + use of a system proxy. \sa QNetworkProxyFactory, applicationProxy(), QAbstractSocket::setProxy(), QTcpServer::setProxy() */ @@ -1465,6 +1497,17 @@ QNetworkProxyFactory::~QNetworkProxyFactory() { } +/*! + \since 5.8 + + Returns whether the use of platform-specific proxy settings are enabled. +*/ +bool QNetworkProxyFactory::usesSystemConfiguration() +{ + if (globalNetworkProxy()) + return globalNetworkProxy()->usesSystemConfiguration(); + return false; +} /*! \since 4.6 @@ -1472,23 +1515,16 @@ QNetworkProxyFactory::~QNetworkProxyFactory() Enables the use of the platform-specific proxy settings, and only those. See systemProxyForQuery() for more information. - Internally, this method (when called with \a enable set to true) - sets an application-wide proxy factory. For this reason, this method - is mutually exclusive with setApplicationProxyFactory(): calling - setApplicationProxyFactory() overrides the use of the system-wide proxy, - and calling setUseSystemConfiguration() overrides any - application proxy or proxy factory that was previously set. + Calling setUseSystemConfiguration(\c{true}) will reset any proxy or + QNetworkProxyFactory already set. \note See the systemProxyForQuery() documentation for a list of limitations related to the use of system proxies. */ void QNetworkProxyFactory::setUseSystemConfiguration(bool enable) { - if (enable) { - setApplicationProxyFactory(new QSystemConfigurationProxyFactory); - } else { - setApplicationProxyFactory(0); - } + if (globalNetworkProxy()) + globalNetworkProxy()->setUseSystemConfiguration(enable); } /*! @@ -1504,7 +1540,7 @@ void QNetworkProxyFactory::setUseSystemConfiguration(bool enable) If you set a proxy factory with this function, any application level proxies set with QNetworkProxy::setApplicationProxy will be - overridden. + overridden, and usesSystemConfiguration() will return \c{false}. \sa QNetworkProxy::setApplicationProxy(), QAbstractSocket::proxy(), QAbstractSocket::setProxy() diff --git a/src/network/kernel/qnetworkproxy.h b/src/network/kernel/qnetworkproxy.h index fc919a24a6..8fcb7e33cf 100644 --- a/src/network/kernel/qnetworkproxy.h +++ b/src/network/kernel/qnetworkproxy.h @@ -213,6 +213,7 @@ public: virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query = QNetworkProxyQuery()) = 0; + static bool usesSystemConfiguration(); static void setUseSystemConfiguration(bool enable); static void setApplicationProxyFactory(QNetworkProxyFactory *factory); static QList<QNetworkProxy> proxyForQuery(const QNetworkProxyQuery &query); diff --git a/src/network/kernel/qnetworkproxy_p.h b/src/network/kernel/qnetworkproxy_p.h deleted file mode 100644 index 733d8436d0..0000000000 --- a/src/network/kernel/qnetworkproxy_p.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 David Faure <dfaure@kdab.net> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QNETWORKPROXY_P_H -#define QNETWORKPROXY_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QtNetwork/private/qtnetworkglobal_p.h> - -#ifndef QT_NO_NETWORKPROXY - -QT_BEGIN_NAMESPACE - -class QSystemConfigurationProxyFactory : public QNetworkProxyFactory -{ -public: - QSystemConfigurationProxyFactory() : QNetworkProxyFactory() {} - - virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery& query) - { - QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery(query); - - // Make sure NoProxy is in the list, so that QTcpServer can work: - // it searches for the first proxy that can has the ListeningCapability capability - // if none have (as is the case with HTTP proxies), it fails to bind. - // NoProxy allows it to fallback to the 'no proxy' case and bind. - proxies.append(QNetworkProxy::NoProxy); - - return proxies; - } -}; - -QT_END_NAMESPACE - -#endif // QT_NO_NETWORKINTERFACE - -#endif - |