diff options
Diffstat (limited to 'src/network/kernel/qnetworkproxy_win.cpp')
-rw-r--r-- | src/network/kernel/qnetworkproxy_win.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp index 107b2e5..90aae0a 100644 --- a/src/network/kernel/qnetworkproxy_win.cpp +++ b/src/network/kernel/qnetworkproxy_win.cpp @@ -47,6 +47,7 @@ #include <qstringlist.h> #include <qregexp.h> #include <qurl.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 == QHostAddress::LocalHost || ipAddress == QHostAddress::LocalHostIPv6)) + 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 { |