Skip to content

Commit 7ffec76

Browse files
committed
support bypassing the proxy for specific hosts
This adds the command line option --bypass-proxy-for which will bypass the proxy when specific hosts are referenced. It is most useful for bypassing localhost/127.0.0.1 references (e.g. --bypass-proxy-for localhost) This fixes wkhtmltopdf#1565 and wkhtmltopdf#2130
1 parent bac3fbf commit 7ffec76

File tree

8 files changed

+38
-1
lines changed

8 files changed

+38
-1
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Artem Butusov <[email protected]>
3232
Michael Nitze <[email protected]>
3333
3434
Kay Lukas <[email protected]>
35+
Emil Lerch <[email protected]>
3536
rainabba
3637
Mehdi Abbad
3738
Lyes Amazouz

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ v0.12.3 (unreleased)
99
* **#2190**: do not depend on ICU even if it is already installed
1010
* **#2280**: do not allow data URIs for --header-html or --footer-html
1111
* **#2322**: fix broken debug builds with MSVC
12+
* **#2355**: add support for proxy bypass for specific hosts with --bypass-proxy-for
1213

1314
v0.12.2.1 (2015-01-19)
1415
----------------------

include/wkhtmltox/loadsettings.hh

+3
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ struct DLL_PUBLIC LoadPage {
117117

118118
QString cacheDir;
119119
static QList<QString> mediaFilesExtensions;
120+
121+
// Hosts to bypass
122+
QList< QString > bypassProxyForHosts;
120123
};
121124

122125
DLL_PUBLIC LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok=0);

src/lib/loadsettings.hh

+3
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ struct DLL_PUBLIC LoadPage {
120120

121121
QString cacheDir;
122122
static QList<QString> mediaFilesExtensions;
123+
124+
// Hosts to bypass
125+
QList< QString > bypassProxyForHosts;
123126
};
124127

125128
DLL_PUBLIC LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok=0);

src/lib/multipageloader.cc

+18-1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,19 @@ QNetworkReply * MyNetworkAccessManager::createRequest(Operation op, const QNetwo
107107
return QNetworkAccessManager::createRequest(op, r3, outgoingData);
108108
}
109109

110+
MyNetworkProxyFactory::MyNetworkProxyFactory (QNetworkProxy proxy, QList<QString> bph):
111+
bypassHosts(bph),
112+
originalProxy(QList<QNetworkProxy>() << proxy),
113+
noProxy(QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::DefaultProxy)){}
114+
115+
QList<QNetworkProxy> MyNetworkProxyFactory::queryProxy (const QNetworkProxyQuery & query) {
116+
QString host = query.url().host();
117+
foreach (const QString & bypassHost, bypassHosts) {
118+
if (host.compare(bypassHost, Qt::CaseInsensitive) == 0)
119+
return noProxy;
120+
}
121+
return originalProxy;
122+
}
110123

111124
MyQWebPage::MyQWebPage(ResourceObject & res): resource(res) {}
112125

@@ -192,7 +205,11 @@ ResourceObject::ResourceObject(MultiPageLoaderPrivate & mpl, const QUrl & u, con
192205
proxy.setUser(settings.proxy.user);
193206
if (!settings.proxy.password.isEmpty())
194207
proxy.setPassword(settings.proxy.password);
195-
networkAccessManager.setProxy(proxy);
208+
if (!settings.bypassProxyForHosts.isEmpty())
209+
networkAccessManager.setProxyFactory(
210+
new MyNetworkProxyFactory(proxy, settings.bypassProxyForHosts));
211+
else
212+
networkAccessManager.setProxy(proxy);
196213
}
197214

198215
webPage.setNetworkAccessManager(&networkAccessManager);

src/lib/multipageloader_p.hh

+10
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@
3535
#include "dllbegin.inc"
3636
namespace wkhtmltopdf {
3737

38+
class DLL_LOCAL MyNetworkProxyFactory: public QObject, public QNetworkProxyFactory {
39+
Q_OBJECT
40+
private:
41+
QList<QString> bypassHosts;
42+
QList<QNetworkProxy> originalProxy, noProxy;
43+
public:
44+
MyNetworkProxyFactory(QNetworkProxy defaultProxy, QList<QString> bypassHosts);
45+
QList<QNetworkProxy> queryProxy (const QNetworkProxyQuery & query);
46+
};
47+
3848
class DLL_LOCAL MyNetworkAccessManager: public QNetworkAccessManager {
3949
Q_OBJECT
4050
private:

src/lib/reflect.cc

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ ReflectImpl<LoadPage>::ReflectImpl(LoadPage & c) {
7676
WKHTMLTOPDF_REFLECT(radiobuttonSvg);
7777
WKHTMLTOPDF_REFLECT(radiobuttonCheckedSvg);
7878
WKHTMLTOPDF_REFLECT(cacheDir);
79+
WKHTMLTOPDF_REFLECT(bypassProxyForHosts);
7980
}
8081

8182
ReflectImpl<Web>::ReflectImpl(Web & c) {

src/shared/commonarguments.cc

+1
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ void CommandLineParserBase::addPageLoadArgs(LoadPage & s) {
203203
extended(true);
204204
qthack(false);
205205
addarg("proxy",'p',"Use a proxy", new ProxySetter(s.proxy, "proxy"));
206+
addarg("bypass-proxy-for", 0, "Bypass proxy for host (repeatable)", new StringListSetter(s.bypassProxyForHosts, "value"));
206207
addarg("username",0,"HTTP Authentication username", new QStrSetter(s.username, "username"));
207208
addarg("password",0,"HTTP Authentication password", new QStrSetter(s.password, "password"));
208209
addarg("load-error-handling", 0, "Specify how to handle pages that fail to load: abort, ignore or skip", new LoadErrorHandlingSetting(s.loadErrorHandling, "handler"));

0 commit comments

Comments
 (0)