Skip to content

Commit

Permalink
Merge pull request #149 from telekom/bugfix/upstream-proxy-auth
Browse files Browse the repository at this point in the history
Bugfix/upstream proxy auth
  • Loading branch information
Mike Reiche authored Nov 8, 2021
2 parents 6a96aec + 11b553a commit 90142f7
Show file tree
Hide file tree
Showing 6 changed files with 15,570 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,12 @@ public List<Integer> getProxies() {
* Calls POST /proxy with parameters
*
* @return BrowserUpRemoteProxyServer object.
* @deprecated Use {@link #startServer(BrowserUpRemoteProxyServer)} instead
*/
public BrowserUpRemoteProxyServer startServer() {
return startServer(new BrowserUpRemoteProxyServer());
BrowserUpRemoteProxyServer browserUpRemoteProxyServer = new BrowserUpRemoteProxyServer();
startServer(browserUpRemoteProxyServer);
return browserUpRemoteProxyServer;
}

/**
Expand All @@ -119,7 +122,7 @@ public BrowserUpRemoteProxyServer startServer() {
* @param proxyServer {@link BrowserUpRemoteProxyServer}
* @return BrowserUpRemoteProxyServer
*/
public BrowserUpRemoteProxyServer startServer(BrowserUpRemoteProxyServer proxyServer) {
public void startServer(BrowserUpRemoteProxyServer proxyServer) {

final URIBuilder startServerUriBuilder = url().setPath("/proxy");

Expand All @@ -128,7 +131,6 @@ public BrowserUpRemoteProxyServer startServer(BrowserUpRemoteProxyServer proxySe
// Check if port already in use...
if (this.isRunning(proxyServer)) {
log().info("Remote proxy session already running on this port.");
return proxyServer;
}

// Set port to start proxyserver on.
Expand All @@ -139,20 +141,34 @@ public BrowserUpRemoteProxyServer startServer(BrowserUpRemoteProxyServer proxySe
startServerUriBuilder.setParameter("trustAllServers", "true");

// Set bind address
if (StringUtils.isNotBlank(proxyServer.getBindAddress())) {
startServerUriBuilder.setParameter("bindAddress", proxyServer.getBindAddress());
}
proxyServer.getBindAddress().filter(StringUtils::isNotBlank).ifPresent(s -> {
startServerUriBuilder.setParameter("bindAddress", s);
});

// Set upstream proxy.
if (proxyServer.getUpstreamProxy() != null) {
startServerUriBuilder.setParameter("httpProxy", String.format("%s:%d", proxyServer.getUpstreamProxy().getHost(), proxyServer.getUpstreamProxy().getPort()));
startServerUriBuilder.setParameter("proxyHTTPS", String.format("%s:%d", proxyServer.getUpstreamProxy().getHost(), proxyServer.getUpstreamProxy().getPort()));
proxyServer.getUpstreamProxy().ifPresent(url -> {
startServerUriBuilder.setParameter("httpProxy", String.format("%s:%d", url.getHost(), url.getPort()));
if (url.getHost().equalsIgnoreCase("https")) {
startServerUriBuilder.setParameter("proxyHTTPS", "true");
}

// Set non proxy exceptions for upstream proxy
if (StringUtils.isNotBlank(proxyServer.getUpstreamNonProxy())) {
startServerUriBuilder.setParameter("httpNonProxyHosts", proxyServer.getUpstreamNonProxy());
String userInfo = url.getUserInfo();
if (StringUtils.isNotBlank(userInfo)) {
String[] parts = userInfo.split(":");
if (parts.length > 0) {
startServerUriBuilder.setParameter("proxyUsername", parts[0]);

if (parts.length > 1) {
startServerUriBuilder.setParameter("proxyPassword", parts[1]);
}
}
}
}

// Set non proxy exceptions for upstream proxy
proxyServer.getUpstreamNonProxy().filter(StringUtils::isNotBlank).ifPresent(s -> {
startServerUriBuilder.setParameter("httpNonProxyHosts", s);
});
});

final URI uri = buildUri(startServerUriBuilder, "Error parsing URL for POST /proxy for BrowserUp proxy server.");
final HttpPost httpPost = new HttpPost(uri);
Expand All @@ -161,7 +177,6 @@ public BrowserUpRemoteProxyServer startServer(BrowserUpRemoteProxyServer proxySe
final JsonElement jsonElement = JsonParser.parseString(jsonResponse);
final int port = jsonElement.getAsJsonObject().get("port").getAsInt();
proxyServer.setPort(port);
return proxyServer;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
package eu.tsystems.mms.tic.testerra.bup;

import java.net.URL;
import java.util.Optional;

/**
* Date: 25.05.2020
Expand All @@ -33,9 +34,7 @@ public class BrowserUpRemoteProxyServer {

private Integer port;
private URL upstreamProxy;

private String upstreamNonProxy;

private String bindAddress;

public Integer getPort() {
Expand All @@ -46,24 +45,29 @@ public void setPort(Integer port) {
this.port = port;
}

public URL getUpstreamProxy() {
return upstreamProxy;
public Optional<URL> getUpstreamProxy() {
return Optional.ofNullable(upstreamProxy);
}

/**
* Sets the URL for the upstream/chained proxy.
* Uses the user info for upstream proxy credentials.
* @param upstreamProxy
*/
public void setUpstreamProxy(URL upstreamProxy) {
this.upstreamProxy = upstreamProxy;
}

public String getUpstreamNonProxy() {
return upstreamNonProxy;
public Optional<String> getUpstreamNonProxy() {
return Optional.ofNullable(upstreamNonProxy);
}

public void setUpstreamNonProxy(String upstreamNonProxy) {
this.upstreamNonProxy = upstreamNonProxy;
}

public String getBindAddress() {
return bindAddress;
public Optional<String> getBindAddress() {
return Optional.ofNullable(bindAddress);
}

public void setBindAddress(String bindAddress) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public void testT03_StartProxyServerOnDesiredPortAndVerifyRunning() throws IOExc
BrowserUpRemoteProxyServer bup1 = new BrowserUpRemoteProxyServer();
bup1.setPort(8088);

bup1 = browserUpRemoteProxyManager.startServer(bup1);
browserUpRemoteProxyManager.startServer(bup1);
Assert.assertNotNull(bup1, "Proxy object generated.");

Assert.assertEquals(bup1.getPort().intValue(), 8088, "Port equals desired.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,7 @@ public void testT03_StartProxyServerOnDesiredPortAndVerifyRunning() throws IOExc

BrowserUpRemoteProxyServer browserUpRemoteProxyServer = new BrowserUpRemoteProxyServer();
browserUpRemoteProxyServer.setPort(8088);

browserUpRemoteProxyServer = browserUpRemoteProxyManager.startServer(browserUpRemoteProxyServer);
browserUpRemoteProxyManager.startServer(browserUpRemoteProxyServer);
Assert.assertNotNull(browserUpRemoteProxyServer, "Proxy object generated.");

Assert.assertEquals(browserUpRemoteProxyServer.getPort().intValue(), 8088, "Port equals desired.");
Expand Down Expand Up @@ -226,8 +225,7 @@ public void testT03a_StartProxyServerWithExtendedOptionsAndVerifyRunning() throw
browserUpRemoteProxyServer.setBindAddress("192.168.100.1");
browserUpRemoteProxyServer.setUpstreamProxy(new URL("http://proxy.company.example.org:8080"));
browserUpRemoteProxyServer.setUpstreamNonProxy(".internal.example.org|.mystuff.example.org");

browserUpRemoteProxyServer = browserUpRemoteProxyManager.startServer(browserUpRemoteProxyServer);
browserUpRemoteProxyManager.startServer(browserUpRemoteProxyServer);
Assert.assertNotNull(browserUpRemoteProxyServer, "Proxy object generated.");

Assert.assertEquals(browserUpRemoteProxyServer.getPort().intValue(), 8088, "Port equals desired.");
Expand Down Expand Up @@ -428,7 +426,7 @@ public void testT11_AddUpstreamProxy() throws MalformedURLException {

final URL apiBaseUrl = new URL(LOCAL_PROXY_FOR_TEST);
final BrowserUpRemoteProxyManager browserUpRemoteProxyManager = new BrowserUpRemoteProxyManager(apiBaseUrl);
bup1 = browserUpRemoteProxyManager.startServer(bup1);
browserUpRemoteProxyManager.startServer(bup1);
}

}
76 changes: 32 additions & 44 deletions docs/src/docs/modules/browser-up-proxy.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -45,22 +45,20 @@ import java.net.URL;
public class AbstractTest extends TesterraTest {
private static BrowserUpRemoteProxyServer bupProxy;
private static BrowserUpRemoteProxyServer bupProxy = new BrowserUpRemoteProxyServer();
@BeforeSuite
public void setupProxy() throws MalformedURLException {
final URL apiUrl = new URL("http://localhost:8080");
final BrowserUpRemoteProxyManager bupRemoteProxyManager
URL apiUrl = new URL("http://localhost:8080");
BrowserUpRemoteProxyManager bupRemoteProxyManager
= new BrowserUpRemoteProxyManager(apiUrl);
bupProxy = bupRemoteProxyManager.startServer();
bupProxybupRemoteProxyManager.startServer(bupProxy);
/* Additional Proxy setup here */
final String bmpProxyAddress
= String.format("%s:%d", apiUrl.getHost(), bupProxy.getPort());
String bmpProxyAddress = String.format("%s:%d", apiUrl.getHost(), bupProxy.getPort());
// For selenium usage.
final Proxy proxy = new Proxy();
Proxy proxy = new Proxy();
proxy.setHttpProxy(bmpProxyAddress).setSslProxy(bmpProxyAddress);
WebDriverManager.setGlobalExtraCapability(CapabilityType.PROXY, proxy);
Expand All @@ -69,12 +67,12 @@ public class AbstractTest extends TesterraTest {
@AfterSuite
public void tearDownProxy() throws MalformedURLException {
final URL apiBaseUrl = new URL("http://localhost:8080");
final BrowserUpRemoteProxyManager browserUpRemoteProxyManager
URL apiBaseUrl = new URL("http://localhost:8080");
BrowserUpRemoteProxyManager browserUpRemoteProxyManager
= new BrowserUpRemoteProxyManager(apiBaseUrl);
for (final Integer proxyPort : browserUpRemoteProxyManager.getProxies()) {
final BrowserUpRemoteProxyServer bupToStop = new BrowserUpRemoteProxyServer();
for (Integer proxyPort : browserUpRemoteProxyManager.getProxies()) {
BrowserUpRemoteProxyServer bupToStop = new BrowserUpRemoteProxyServer();
bupToStop.setPort(proxyPort);
browserUpRemoteProxyManager.stopServer(bupToStop);
}
Expand All @@ -91,7 +89,7 @@ If you need a dedicated port, use `startServer(BrowserUpRemoteProxyServer proxyS
BrowserUpRemoteProxyServer browserUpRemoteProxyServer = new BrowserUpRemoteProxyServer();
browserUpRemoteProxyServer.setPort(8088);
browserUpRemoteProxyServer = browserUpRemoteProxyManager.startServer(browserUpRemoteProxyServer);
browserUpRemoteProxyManager.startServer(browserUpRemoteProxyServer);
----

If the port already used, the `BrowserUpRemoteProxyManager` will do nothing, and just return the given config-object of type `BrowserUpRemoteProxyServer`.
Expand All @@ -107,12 +105,11 @@ String basicAuthUser;
String basicAuthPassword;
URL apiBaseUrl = new URL(LOCAL_PROXY_FOR_TEST);
BrowserUpRemoteProxyManager browserUpRemoteProxyManager
= new BrowserUpRemoteProxyManager(apiBaseUrl);
BrowserUpRemoteProxyServer bup1 = browserUpRemoteProxyManager.startServer();
BrowserUpRemoteProxyManager browserUpRemoteProxyManager = new BrowserUpRemoteProxyManager(apiBaseUrl);
BrowserUpRemoteProxyServer bup1 = new BrowserUpRemoteProxyServer();
browserUpRemoteProxyManager.startServer(bup1);
browserUpRemoteProxyManager
.setBasicAuth(bup1, baseUrl.getHost(), basicAuthUser, basicAuthPassword);
browserUpRemoteProxyManager.setBasicAuth(bup1, baseUrl.getHost(), basicAuthUser, basicAuthPassword);
----

=== Upstream proxy
Expand All @@ -127,26 +124,25 @@ bup1.setUpstreamProxy(ProxyUtils.getSystemHttpProxyUrl());
// Setup non-proxy for your upstream proxy, if needed
bup1.setUpstreamNonProxy(".internal.example.org|.mystuff.example.org");
final BrowserUpRemoteProxyManager browserUpRemoteProxyManager
= new BrowserUpRemoteProxyManager(apiBaseUrl);
bup1 = browserUpRemoteProxyManager.startServer();
BrowserUpRemoteProxyManager browserUpRemoteProxyManager = new BrowserUpRemoteProxyManager(apiBaseUrl);
browserUpRemoteProxyManager.startServer(bup1);
----

NOTE: User info like `username:password` is supported in your upstream proxy URL.

=== Setup bind address

If running BrowserUp Proxy in a multi-homed environment, you can specify a desired server bind address.

[source,java]
----
BrowserUpRemoteProxyServer bup1 = new BrowserUpRemoteProxyServer();
bup1.setUpstreamProxy(ProxyUtils.getSystemHttpProxyUrl());
// Setup a bind address, default is '0.0.0.0'
bup1.setBindAddress("192.168.100.1");
final BrowserUpRemoteProxyManager browserUpRemoteProxyManager
= new BrowserUpRemoteProxyManager(apiBaseUrl);
bup1 = browserUpRemoteProxyManager.startServer();
BrowserUpRemoteProxyManager browserUpRemoteProxyManager = new BrowserUpRemoteProxyManager(apiBaseUrl);
browserUpRemoteProxyManager.startServer(bup1);
----

=== Other features
Expand All @@ -156,43 +152,35 @@ bup1 = browserUpRemoteProxyManager.startServer();
/*
Check if proxy alread runs on port...
*/
final BrowserUpRemoteProxyManager browserUpRemoteProxyManager
= new BrowserUpRemoteProxyManager(apiBaseUrl);
BrowserUpRemoteProxyManager browserUpRemoteProxyManager = new BrowserUpRemoteProxyManager(apiBaseUrl);
BrowserUpRemoteProxyServer bup1 = new BrowserUpRemoteProxyServer();
bup1.setPort(8088);
bup1 = browserUpRemoteProxyManager.startServer(bup1);
browserUpRemoteProxyManager.startServer(bup1);
boolean isRunning = browserUpRemoteProxyManager.isRunning(nup1);
/*
Maps specific host names to another host names or IP adresses
*/
browserUpRemoteProxyManager
.setHostMapping(
BrowserUpRemoteProxyServer proxyServer,
Map<String, String> hostNameMapping);
browserUpRemoteProxyManager.setHostMapping(BrowserUpRemoteProxyServer proxyServer, Map<String, String> hostMap);
/*
Capture the traffic and return it as a JsonElement
You can choose, if you want to capture only the headers, the content or both via the boolean flags.
*/
browserUpRemoteProxyManager
.startCapture(
BrowserUpRemoteProxyServer proxyServer,
String initialPageRef,
boolean isCaptureHeaders,
boolean isCaptureContent);
browserUpRemoteProxyManager.startCapture(
BrowserUpRemoteProxyServer proxyServer,
String initialPageRef,
boolean isCaptureHeaders,
boolean isCaptureContent
);
JsonElement stopCapture(BrowserUpRemoteProxyServer proxyServer);
/*
Adds additional key-value pairs to the headers.
*/
browserUpRemoteProxyManager
.addHeader(
final BrowserUpRemoteProxyServer proxyServer,
final String key,
final String value);
browserUpRemoteProxyManager.addHeader(BrowserUpRemoteProxyServer proxyServer, String key, String value);
----

== Local browser instances
Expand All @@ -213,7 +201,7 @@ BrowserUpLocalProxyManager bupLocalManager = new BrowserUpLocalProxyManager(port
// Start instance
BrowserUpProxyServer browserUpProxyServer = new BrowserUpProxyServer();
browserUpProxyServer = bupLocalManager.startServer(browserUpProxyServer);
bupLocalManager.startServer(browserUpProxyServer);
// assert that a port of given port pool was used.
Assert.assertTrue(portPool.contains(port), "Port of range was used.");
Expand Down
Loading

0 comments on commit 90142f7

Please sign in to comment.