Skip to content

Commit

Permalink
support bypassing the proxy for specific hosts
Browse files Browse the repository at this point in the history
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
  • Loading branch information
elerch committed Jun 5, 2015
1 parent bac3fbf commit 7ffec76
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 1 deletion.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Artem Butusov <[email protected]>
Michael Nitze <[email protected]>
theirix <[email protected]>
Kay Lukas <[email protected]>
Emil Lerch <[email protected]>
rainabba
Mehdi Abbad
Lyes Amazouz
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ v0.12.3 (unreleased)
* **#2190**: do not depend on ICU even if it is already installed
* **#2280**: do not allow data URIs for --header-html or --footer-html
* **#2322**: fix broken debug builds with MSVC
* **#2355**: add support for proxy bypass for specific hosts with --bypass-proxy-for

v0.12.2.1 (2015-01-19)
----------------------
Expand Down
3 changes: 3 additions & 0 deletions include/wkhtmltox/loadsettings.hh
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ struct DLL_PUBLIC LoadPage {

QString cacheDir;
static QList<QString> mediaFilesExtensions;

// Hosts to bypass
QList< QString > bypassProxyForHosts;
};

DLL_PUBLIC LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok=0);
Expand Down
3 changes: 3 additions & 0 deletions src/lib/loadsettings.hh
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ struct DLL_PUBLIC LoadPage {

QString cacheDir;
static QList<QString> mediaFilesExtensions;

// Hosts to bypass
QList< QString > bypassProxyForHosts;
};

DLL_PUBLIC LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok=0);
Expand Down
19 changes: 18 additions & 1 deletion src/lib/multipageloader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,19 @@ QNetworkReply * MyNetworkAccessManager::createRequest(Operation op, const QNetwo
return QNetworkAccessManager::createRequest(op, r3, outgoingData);
}

MyNetworkProxyFactory::MyNetworkProxyFactory (QNetworkProxy proxy, QList<QString> bph):
bypassHosts(bph),
originalProxy(QList<QNetworkProxy>() << proxy),
noProxy(QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::DefaultProxy)){}

QList<QNetworkProxy> MyNetworkProxyFactory::queryProxy (const QNetworkProxyQuery & query) {
QString host = query.url().host();
foreach (const QString & bypassHost, bypassHosts) {
if (host.compare(bypassHost, Qt::CaseInsensitive) == 0)
return noProxy;
}
return originalProxy;
}

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

Expand Down Expand Up @@ -192,7 +205,11 @@ ResourceObject::ResourceObject(MultiPageLoaderPrivate & mpl, const QUrl & u, con
proxy.setUser(settings.proxy.user);
if (!settings.proxy.password.isEmpty())
proxy.setPassword(settings.proxy.password);
networkAccessManager.setProxy(proxy);
if (!settings.bypassProxyForHosts.isEmpty())
networkAccessManager.setProxyFactory(
new MyNetworkProxyFactory(proxy, settings.bypassProxyForHosts));
else
networkAccessManager.setProxy(proxy);
}

webPage.setNetworkAccessManager(&networkAccessManager);
Expand Down
10 changes: 10 additions & 0 deletions src/lib/multipageloader_p.hh
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@
#include "dllbegin.inc"
namespace wkhtmltopdf {

class DLL_LOCAL MyNetworkProxyFactory: public QObject, public QNetworkProxyFactory {
Q_OBJECT
private:
QList<QString> bypassHosts;
QList<QNetworkProxy> originalProxy, noProxy;
public:
MyNetworkProxyFactory(QNetworkProxy defaultProxy, QList<QString> bypassHosts);
QList<QNetworkProxy> queryProxy (const QNetworkProxyQuery & query);
};

class DLL_LOCAL MyNetworkAccessManager: public QNetworkAccessManager {
Q_OBJECT
private:
Expand Down
1 change: 1 addition & 0 deletions src/lib/reflect.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ ReflectImpl<LoadPage>::ReflectImpl(LoadPage & c) {
WKHTMLTOPDF_REFLECT(radiobuttonSvg);
WKHTMLTOPDF_REFLECT(radiobuttonCheckedSvg);
WKHTMLTOPDF_REFLECT(cacheDir);
WKHTMLTOPDF_REFLECT(bypassProxyForHosts);
}

ReflectImpl<Web>::ReflectImpl(Web & c) {
Expand Down
1 change: 1 addition & 0 deletions src/shared/commonarguments.cc
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ void CommandLineParserBase::addPageLoadArgs(LoadPage & s) {
extended(true);
qthack(false);
addarg("proxy",'p',"Use a proxy", new ProxySetter(s.proxy, "proxy"));
addarg("bypass-proxy-for", 0, "Bypass proxy for host (repeatable)", new StringListSetter(s.bypassProxyForHosts, "value"));
addarg("username",0,"HTTP Authentication username", new QStrSetter(s.username, "username"));
addarg("password",0,"HTTP Authentication password", new QStrSetter(s.password, "password"));
addarg("load-error-handling", 0, "Specify how to handle pages that fail to load: abort, ignore or skip", new LoadErrorHandlingSetting(s.loadErrorHandling, "handler"));
Expand Down

0 comments on commit 7ffec76

Please sign in to comment.