7#include <QtCore/QByteArray>
10#ifndef QT_NO_NETWORKPROXY
13
14
15
19using namespace Qt::StringLiterals;
23 const QByteArray noProxy = qgetenv(
"no_proxy").trimmed();
24 if (noProxy.isEmpty())
27 const QString host = query.peerHostName();
29 const QList<QByteArray> noProxyTokens = noProxy.split(
',');
31 for (
const QByteArray &rawToken : noProxyTokens) {
32 QString token = QString::fromUtf8(rawToken).trimmed();
39 if (token.startsWith(u'*'))
43 if (token.endsWith(u'.') && !host.endsWith(u'.'))
44 token = token.chopped(1);
46 if (token.startsWith(u'.'))
50 if (
const QByteArray ace = QUrl::toAce(token); !ace.isEmpty())
51 token = QUrl::fromAce(ace);
53 if (host.endsWith(token)) {
58 if (host.size() == token.size())
60 if (host[host.size() - token.size() - 1] == u'.')
68QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(
const QNetworkProxyQuery &query)
70 QList<QNetworkProxy> proxyList;
72 if (ignoreProxyFor(query))
73 return proxyList << QNetworkProxy::NoProxy;
76 const QString queryProtocol = query.protocolTag();
79 if (queryProtocol ==
"http"_L1)
80 proxy_env = qgetenv(
"http_proxy");
81 else if (queryProtocol ==
"https"_L1)
82 proxy_env = qgetenv(
"https_proxy");
83 else if (queryProtocol ==
"ftp"_L1)
84 proxy_env = qgetenv(
"ftp_proxy");
86 proxy_env = qgetenv(
"all_proxy");
89 if (proxy_env.isEmpty())
90 proxy_env = qgetenv(
"http_proxy");
92 if (!proxy_env.isEmpty()) {
93 QUrl url = QUrl(QString::fromLocal8Bit(proxy_env));
94 const QString scheme = url.scheme();
95 if (scheme ==
"socks5"_L1 || scheme ==
"socks5h"_L1) {
96 QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, url.host(),
97 url.port() ? url.port() : 1080, url.userName(), url.password());
99 }
else if ((scheme.isEmpty() || scheme ==
"http"_L1)
100 && query.queryType() != QNetworkProxyQuery::UdpSocket
101 && query.queryType() != QNetworkProxyQuery::TcpServer) {
102 QNetworkProxy proxy(QNetworkProxy::HttpProxy, url.host(),
103 url.port() ? url.port() : 8080, url.userName(), url.password());
107 if (proxyList.isEmpty())
108 proxyList << QNetworkProxy::NoProxy;
static bool ignoreProxyFor(const QNetworkProxyQuery &query)