diff options
-rw-r--r-- | src/network/kernel/qnetworkproxy_win.cpp | 21 | ||||
-rw-r--r-- | tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp | 4 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp index c6efa7d93f..cb137f8b76 100644 --- a/src/network/kernel/qnetworkproxy_win.cpp +++ b/src/network/kernel/qnetworkproxy_win.cpp @@ -48,6 +48,7 @@ #include <qregexp.h> #include <qurl.h> #include <private/qsystemlibrary_p.h> +#include <qnetworkinterface.h> #include <string.h> #include <qt_windows.h> @@ -191,10 +192,26 @@ static bool isBypassed(const QString &host, const QStringList &bypassList) QHostAddress ipAddress; bool isIpAddress = ipAddress.setAddress(host); + // always exclude loopback + if (isIpAddress && ipAddress.isLoopback()) + return true; + // does it match the list of exclusions? foreach (const QString &entry, bypassList) { - if (isSimple && entry == QLatin1String("<local>")) - return true; + if (entry == QLatin1String("<local>")) { + if (isSimple) + return true; + if (isIpAddress) { + //exclude all local subnets + foreach (const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) { + foreach (const QNetworkAddressEntry netaddr, iface.addressEntries()) { + if (ipAddress.isInSubnet(netaddr.ip(), netaddr.prefixLength())) { + return true; + } + } + } + } + } if (isIpAddress && ipAddress.isInSubnet(QHostAddress::parseSubnet(entry))) { return true; // excluded } else { diff --git a/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp b/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp index 9b7d21eff8..d8f5a0428f 100644 --- a/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp +++ b/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp @@ -133,6 +133,10 @@ void tst_QNetworkProxyFactory::systemProxyForQuery_data() QTest::newRow("imap") << (int)QNetworkProxyQuery::TcpSocket << QUrl() << QString() << QString("qt-project.org") << 0 << (int)QNetworkProxy::TunnelingCapability; QTest::newRow("autobind-server") << (int)QNetworkProxyQuery::TcpServer << QUrl() << QString() << QString() << 0 << (int)QNetworkProxy::ListeningCapability; QTest::newRow("web-server") << (int)QNetworkProxyQuery::TcpServer << QUrl() << QString() << QString() << 80 << (int)QNetworkProxy::ListeningCapability; + //windows: these should be bypassed if "bypass proxy server for local addresses" is ticked + foreach (QHostAddress address, QNetworkInterface::allAddresses()) { + QTest::newRow(qPrintable(address.toString())) << (int)QNetworkProxyQuery::TcpSocket << QUrl() << QString() << address.toString() << 0 << 0; + } //UDP QTest::newRow("udp") << (int)QNetworkProxyQuery::UdpSocket << QUrl() << QString() << QString() << 0 << (int)QNetworkProxy::UdpTunnelingCapability; |