8#ifndef QT_NO_NETWORKPROXY
10#include <QtCore/QByteArray>
11#include <QtCore/QMutex>
12#include <QtCore/QSemaphore>
14#include <QtCore/private/qlatch_p.h>
15#include <QtCore/private/qeventdispatcher_unix_p.h>
16#include <QtCore/private/qthread_p.h>
17#include <QtCore/qapplicationstatic.h>
24using namespace Qt::StringLiterals;
41 sym = dlsym(RTLD_DEFAULT,
"_ZTVN8libproxy19pacrunner_extensionE");
46 sym = dlsym(RTLD_DEFAULT,
"mm_info_ignore_hostname");
49 return sym !=
nullptr;
71 pxProxyFactory *factory;
74 QSemaphore requestReady;
80QLibProxyWrapper::QLibProxyWrapper()
82 if (isThreadingNeeded()) {
83 setEventDispatcher(
new QEventDispatcherUNIX);
86 factory = px_proxy_factory_new();
94 requestInterruption();
95 requestReady.release();
98 px_proxy_factory_free(factory);
103
104
105
106
109 QByteArray encodedUrl = url.toEncoded();
111 data.url = encodedUrl.constData();
114 QMutexLocker locker(&mutex);
121 requestReady.release();
124 data.replyReady.wait();
127 data.proxies = px_proxy_factory_get_proxies(factory, data.url);
133 for (
int i = 0; data.proxies[i]; i++) {
134 ret.append(QUrl::fromEncoded(data.proxies[i]));
135 free(data.proxies[i]);
144 factory = px_proxy_factory_new();
145 Q_CHECK_PTR(factory);
148 requestReady.acquire();
149 if (isInterruptionRequested())
151 request->proxies = px_proxy_factory_get_proxies(factory, request->url);
152 request->replyReady.countDown();
155 px_proxy_factory_free(factory);
158QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(
const QNetworkProxyQuery &query)
160 QList<QNetworkProxy> proxyList;
163 QNetworkProxy::Capabilities requiredCapabilities(0);
164 switch (query.queryType()) {
166 case QNetworkProxyQuery::UrlRequest:
167 queryUrl = query.url();
170 case QNetworkProxyQuery::TcpSocket:
171 if (queryUrl.scheme().isEmpty())
172 queryUrl.setScheme(QStringLiteral(
"tcp"));
173 queryUrl.setHost(query.peerHostName());
174 queryUrl.setPort(query.peerPort());
175 requiredCapabilities |= QNetworkProxy::TunnelingCapability;
177 case QNetworkProxyQuery::UdpSocket:
178 if (queryUrl.scheme().isEmpty())
179 queryUrl.setScheme(QStringLiteral(
"udp"));
180 queryUrl.setHost(query.peerHostName());
181 queryUrl.setPort(query.peerPort());
182 requiredCapabilities |= QNetworkProxy::UdpTunnelingCapability;
185 proxyList.append(QNetworkProxy(QNetworkProxy::NoProxy));
189 const QList<QUrl> rawProxies = libProxyWrapper()->getProxies(queryUrl);
191 bool haveDirectConnection =
false;
192 for (
const QUrl& url : rawProxies) {
193 QNetworkProxy::ProxyType type;
194 const QString scheme = url.scheme();
195 if (scheme ==
"http"_L1) {
196 type = QNetworkProxy::HttpProxy;
197 }
else if (scheme ==
"socks"_L1 || scheme ==
"socks5"_L1) {
198 type = QNetworkProxy::Socks5Proxy;
199 }
else if (scheme ==
"ftp"_L1) {
200 type = QNetworkProxy::FtpCachingProxy;
201 }
else if (scheme ==
"direct"_L1) {
202 type = QNetworkProxy::NoProxy;
203 haveDirectConnection =
true;
208 QNetworkProxy proxy(type,
209 url.host(QUrl::EncodeUnicode),
211 url.userName(QUrl::FullyDecoded),
212 url.password(QUrl::FullyDecoded));
214 if ((proxy.capabilities() & requiredCapabilities) == requiredCapabilities)
215 proxyList.append(proxy);
219 if (proxyList.isEmpty() || !haveDirectConnection)
220 proxyList.append(QNetworkProxy(QNetworkProxy::NoProxy));
227#include "qnetworkproxy_libproxy.moc"
QList< QUrl > getProxies(const QUrl &url)
static bool isThreadingNeeded()