52 #include <QNetworkProxy> 54 #include <QtCore/QByteArray> 55 #include <QtCore/QUrl> 59 class QLibProxyWrapper
63 : factory(px_proxy_factory_new())
69 px_proxy_factory_free(factory);
75 pxProxyFactory *factory;
84 QList<QUrl> QLibProxyWrapper::getProxies(
const QUrl &url)
89 char **proxies = px_proxy_factory_get_proxies(factory, url.toEncoded());
91 for (
int i = 0; proxies[i]; i++) {
92 ret.append(QUrl::fromEncoded(proxies[i]));
107 QNetworkProxy::Capabilities requiredCapabilities(0);
108 switch (query.queryType()) {
110 case QNetworkProxyQuery::UrlRequest:
111 queryUrl = query.url();
114 case QNetworkProxyQuery::TcpSocket:
115 queryUrl.setScheme(QLatin1String(
"tcp"));
116 queryUrl.setHost(query.peerHostName());
117 queryUrl.setPort(query.peerPort());
118 requiredCapabilities |= QNetworkProxy::TunnelingCapability;
120 case QNetworkProxyQuery::UdpSocket:
121 queryUrl.setScheme(QLatin1String(
"udp"));
122 queryUrl.setHost(query.peerHostName());
123 queryUrl.setPort(query.peerPort());
124 requiredCapabilities |= QNetworkProxy::UdpTunnelingCapability;
127 proxyList.append(QNetworkProxy(QNetworkProxy::NoProxy));
131 QList<QUrl> rawProxies = libProxyWrapper()->getProxies(queryUrl);
133 bool haveDirectConnection =
false;
134 foreach (
const QUrl& url, rawProxies) {
135 QNetworkProxy::ProxyType type;
136 if (url.scheme() == QLatin1String(
"http")) {
137 type = QNetworkProxy::HttpProxy;
138 }
else if (url.scheme() == QLatin1String(
"socks")
139 || url.scheme() == QLatin1String(
"socks5")) {
140 type = QNetworkProxy::Socks5Proxy;
141 }
else if (url.scheme() == QLatin1String(
"ftp")) {
142 type = QNetworkProxy::FtpCachingProxy;
143 }
else if (url.scheme() == QLatin1String(
"direct")) {
144 type = QNetworkProxy::NoProxy;
145 haveDirectConnection =
true;
150 QNetworkProxy proxy(type,
156 if ((proxy.capabilities() & requiredCapabilities) == requiredCapabilities)
157 proxyList.append(proxy);
161 if (proxyList.isEmpty() || !haveDirectConnection)
162 proxyList.append(QNetworkProxy(QNetworkProxy::NoProxy));
QList< QNetworkProxy > queryProxy(const QNetworkProxyQuery &query=QNetworkProxyQuery())
Q_GLOBAL_STATIC(QLibProxyWrapper, libProxyWrapper)