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]));
136 px_proxy_factory_free_proxies(data.proxies);
143 factory = px_proxy_factory_new();
144 Q_CHECK_PTR(factory);
147 requestReady.acquire();
148 if (isInterruptionRequested())
150 request->proxies = px_proxy_factory_get_proxies(factory, request->url);
151 request->replyReady.countDown();
154 px_proxy_factory_free(factory);
157QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(
const QNetworkProxyQuery &query)
159 QList<QNetworkProxy> proxyList;
162 QNetworkProxy::Capabilities requiredCapabilities(0);
163 switch (query.queryType()) {
165 case QNetworkProxyQuery::UrlRequest:
166 queryUrl = query.url();
169 case QNetworkProxyQuery::TcpSocket:
170 if (queryUrl.scheme().isEmpty())
171 queryUrl.setScheme(QStringLiteral(
"tcp"));
172 queryUrl.setHost(query.peerHostName());
173 queryUrl.setPort(query.peerPort());
174 requiredCapabilities |= QNetworkProxy::TunnelingCapability;
176 case QNetworkProxyQuery::UdpSocket:
177 if (queryUrl.scheme().isEmpty())
178 queryUrl.setScheme(QStringLiteral(
"udp"));
179 queryUrl.setHost(query.peerHostName());
180 queryUrl.setPort(query.peerPort());
181 requiredCapabilities |= QNetworkProxy::UdpTunnelingCapability;
184 proxyList.append(QNetworkProxy(QNetworkProxy::NoProxy));
188 const QList<QUrl> rawProxies = libProxyWrapper()->getProxies(queryUrl);
190 bool haveDirectConnection =
false;
191 for (
const QUrl& url : rawProxies) {
192 QNetworkProxy::ProxyType type;
193 const QString scheme = url.scheme();
194 if (scheme ==
"http"_L1) {
195 type = QNetworkProxy::HttpProxy;
196 }
else if (scheme ==
"socks"_L1 || scheme ==
"socks5"_L1) {
197 type = QNetworkProxy::Socks5Proxy;
198 }
else if (scheme ==
"ftp"_L1) {
199 type = QNetworkProxy::FtpCachingProxy;
200 }
else if (scheme ==
"direct"_L1) {
201 type = QNetworkProxy::NoProxy;
202 haveDirectConnection =
true;
207 QNetworkProxy proxy(type,
208 url.host(QUrl::EncodeUnicode),
210 url.userName(QUrl::FullyDecoded),
211 url.password(QUrl::FullyDecoded));
213 if ((proxy.capabilities() & requiredCapabilities) == requiredCapabilities)
214 proxyList.append(proxy);
218 if (proxyList.isEmpty() || !haveDirectConnection)
219 proxyList.append(QNetworkProxy(QNetworkProxy::NoProxy));
226#include "qnetworkproxy_libproxy.moc"
QList< QUrl > getProxies(const QUrl &url)
static bool isThreadingNeeded()