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 auto token = QLatin1StringView(rawToken).trimmed();
35 if (token.startsWith(u'*'))
39 if (token.endsWith(u'.') && !host.endsWith(u'.'))
40 token = token.chopped(1);
42 if (token.startsWith(u'.'))
45 if (host.endsWith(token)) {
50 if (host.size() == token.size())
52 if (host[host.size() - token.size() - 1] == u'.')
60QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(
const QNetworkProxyQuery &query)
62 QList<QNetworkProxy> proxyList;
64 if (ignoreProxyFor(query))
65 return proxyList << QNetworkProxy::NoProxy;
68 const QString queryProtocol = query.protocolTag();
71 if (queryProtocol ==
"http"_L1)
72 proxy_env = qgetenv(
"http_proxy");
73 else if (queryProtocol ==
"https"_L1)
74 proxy_env = qgetenv(
"https_proxy");
75 else if (queryProtocol ==
"ftp"_L1)
76 proxy_env = qgetenv(
"ftp_proxy");
78 proxy_env = qgetenv(
"all_proxy");
81 if (proxy_env.isEmpty())
82 proxy_env = qgetenv(
"http_proxy");
84 if (!proxy_env.isEmpty()) {
85 QUrl url = QUrl(QString::fromLocal8Bit(proxy_env));
86 const QString scheme = url.scheme();
87 if (scheme ==
"socks5"_L1) {
88 QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, url.host(),
89 url.port() ? url.port() : 1080, url.userName(), url.password());
91 }
else if (scheme ==
"socks5h"_L1) {
92 QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, url.host(),
93 url.port() ? url.port() : 1080, url.userName(), url.password());
94 proxy.setCapabilities(QNetworkProxy::HostNameLookupCapability);
96 }
else if ((scheme.isEmpty() || scheme ==
"http"_L1)
97 && query.queryType() != QNetworkProxyQuery::UdpSocket
98 && query.queryType() != QNetworkProxyQuery::TcpServer) {
99 QNetworkProxy proxy(QNetworkProxy::HttpProxy, url.host(),
100 url.port() ? url.port() : 8080, url.userName(), url.password());
104 if (proxyList.isEmpty())
105 proxyList << QNetworkProxy::NoProxy;
static bool ignoreProxyFor(const QNetworkProxyQuery &query)