diff options
Diffstat (limited to 'src/network/kernel/qnetworkproxy.cpp')
-rw-r--r-- | src/network/kernel/qnetworkproxy.cpp | 72 |
1 files changed, 54 insertions, 18 deletions
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() |