diff options
Diffstat (limited to 'src/network/kernel')
-rw-r--r-- | src/network/kernel/qnetworkproxy_generic.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/network/kernel/qnetworkproxy_generic.cpp b/src/network/kernel/qnetworkproxy_generic.cpp index 3ff0cc5168..d2c7b29bc4 100644 --- a/src/network/kernel/qnetworkproxy_generic.cpp +++ b/src/network/kernel/qnetworkproxy_generic.cpp @@ -57,30 +57,34 @@ static bool ignoreProxyFor(const QNetworkProxyQuery &query) if (noProxy.isEmpty()) return false; + const QString host = query.peerHostName(); + const QList<QByteArray> noProxyTokens = noProxy.split(','); for (const QByteArray &rawToken : noProxyTokens) { - QByteArray token = rawToken.trimmed(); - QString peerHostName = query.peerHostName(); + auto token = QLatin1String(rawToken).trimmed(); // Since we use suffix matching, "*" is our 'default' behaviour - if (token.startsWith('*')) + if (token.startsWith(u'*')) token = token.mid(1); // Harmonize trailing dot notation - if (token.endsWith('.') && !peerHostName.endsWith('.')) - token = token.left(token.length()-1); + if (token.endsWith(u'.') && !host.endsWith(u'.')) + token = token.chopped(1); + + if (token.startsWith(u'.')) // leading dot is implied + token = token.mid(1); - // We prepend a dot to both values, so that when we do a suffix match, - // we don't match "donotmatch.com" with "match.com" - if (!token.startsWith('.')) - token.prepend('.'); + if (host.endsWith(token)) { - if (!peerHostName.startsWith('.')) - peerHostName.prepend('.'); + // Make sure that when we have a suffix match, + // we don't match "donotmatch.com" with "match.com" - if (peerHostName.endsWith(QLatin1String(token))) - return true; + if (host.size() == token.size()) // iow: host == token + return true; + if (host[host.size() - token.size() - 1] == u'.') // match follows a dot + return true; + } } return false; |