Skip to content
This repository was archived by the owner on Jun 11, 2024. It is now read-only.

Commit 2e42047

Browse files
authored
Merge branch 'master' into dependabot/gradle/com.squareup.okhttp3-okhttp-4.9.0
2 parents 765b848 + 6eae7c6 commit 2e42047

File tree

20 files changed

+606
-80
lines changed

20 files changed

+606
-80
lines changed

browserup-proxy-core/build.gradle

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ uploadArchives {
5858

5959
dependencies {
6060
api "io.netty:netty-codec:${nettyVersion}"
61-
api('xyz.rogfam:littleproxy:2.0.0-beta-5') {
61+
api('xyz.rogfam:littleproxy:2.0.1') {
6262
exclude(group: 'io.netty', module: 'netty-all')
6363
}
6464

@@ -70,9 +70,9 @@ dependencies {
7070
implementation "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}"
7171
implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}"
7272
implementation "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}"
73-
implementation 'com.google.guava:guava:28.2-jre'
73+
implementation 'com.google.guava:guava:30.0-jre'
7474
implementation 'com.jcraft:jzlib:1.1.3'
75-
implementation 'dnsjava:dnsjava:3.1.0'
75+
implementation 'dnsjava:dnsjava:3.3.1'
7676
implementation "io.netty:netty-all:${nettyVersion}"
7777
implementation "org.bouncycastle:bcpkix-jdk15on:${bcpVersion}"
7878
implementation "org.bouncycastle:bcprov-jdk15on:${bcpVersion}"
@@ -82,22 +82,21 @@ dependencies {
8282
implementation "org.slf4j:jcl-over-slf4j:${slf4jVersion}"
8383
implementation "org.slf4j:slf4j-api:${slf4jVersion}"
8484
implementation "com.squareup.okhttp3:okhttp:4.9.0"
85-
implementation 'org.zeroturnaround:zt-exec:1.11'
86-
87-
testImplementation 'junit:junit:4.13'
88-
testImplementation 'org.codehaus.groovy:groovy-all:2.5.8'
85+
implementation 'org.zeroturnaround:zt-exec:1.12'
86+
testImplementation 'junit:junit:4.13.1'
87+
testImplementation 'org.codehaus.groovy:groovy-all:3.0.6'
8988
testImplementation "org.apache.logging.log4j:log4j-api:${log4jVersion}"
9089
testImplementation "org.apache.logging.log4j:log4j-core:${log4jVersion}"
9190
testImplementation "org.apache.logging.log4j:log4j-slf4j-impl:${log4jVersion}"
9291
testImplementation 'org.codehaus.groovy.modules.http-builder:http-builder:0.7.2'
9392
testImplementation "org.eclipse.jetty:jetty-server:${jettyVersion}"
9493
testImplementation "org.eclipse.jetty:jetty-servlet:${jettyVersion}"
9594
testImplementation "org.eclipse.jetty:jetty-servlets:${jettyVersion}"
96-
testImplementation 'org.hamcrest:hamcrest:2.2'
95+
testImplementation 'org.hamcrest:hamcrest:2.2'
9796
testImplementation 'org.hamcrest:hamcrest-library:2.2'
9897
testImplementation 'com.github.tomakehurst:wiremock-jre8:2.26.3'
9998
testImplementation 'org.mockito:mockito-core:3.3.3'
10099
testImplementation 'org.seleniumhq.selenium:selenium-firefox-driver:3.141.59'
101-
testImplementation 'org.apache.httpcomponents:httpclient:4.5.12'
100+
testImplementation 'org.apache.httpcomponents:httpclient:4.5.13'
102101
}
103102

browserup-proxy-core/src/main/java/com/browserup/bup/BrowserUpProxyServer.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,21 @@ public SSLEngine newSslEngine() {
465465
proxyServer = bootstrap.start();
466466

467467
addHarCaptureFilter();
468+
469+
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
470+
@Override
471+
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
472+
return new BlacklistFilter(originalRequest, ctx, getBlacklist());
473+
}
474+
});
475+
476+
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
477+
@Override
478+
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
479+
Whitelist currentWhitelist = whitelist.get();
480+
return new WhitelistFilter(originalRequest, ctx, isWhitelistEnabled(), currentWhitelist.getStatusCode(), currentWhitelist.getPatterns());
481+
}
482+
});
468483
}
469484

470485
@Override
@@ -1453,21 +1468,6 @@ public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerCont
14531468
}
14541469
});
14551470

1456-
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
1457-
@Override
1458-
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
1459-
return new BlacklistFilter(originalRequest, ctx, getBlacklist());
1460-
}
1461-
});
1462-
1463-
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
1464-
@Override
1465-
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
1466-
Whitelist currentWhitelist = whitelist.get();
1467-
return new WhitelistFilter(originalRequest, ctx, isWhitelistEnabled(), currentWhitelist.getStatusCode(), currentWhitelist.getPatterns());
1468-
}
1469-
});
1470-
14711471
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
14721472
@Override
14731473
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {

browserup-proxy-core/src/main/java/com/browserup/bup/filters/BlacklistFilter.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
import io.netty.channel.ChannelHandlerContext;
88
import io.netty.handler.codec.http.DefaultFullHttpResponse;
9-
import io.netty.handler.codec.http.HttpHeaders;
109
import io.netty.handler.codec.http.HttpMethod;
1110
import io.netty.handler.codec.http.HttpObject;
1211
import io.netty.handler.codec.http.HttpRequest;
1312
import io.netty.handler.codec.http.HttpResponse;
1413
import io.netty.handler.codec.http.HttpResponseStatus;
1514
import com.browserup.bup.proxy.BlacklistEntry;
15+
import com.browserup.bup.util.HttpStatusClass;
16+
import io.netty.handler.codec.http.HttpUtil;
1617

1718
import java.util.Collection;
1819
import java.util.Collections;
@@ -22,6 +23,7 @@
2223
* that the blacklist at the time of construction will contain the same values when the filter is actually invoked, if the entries are modified concurrently.
2324
*/
2425
public class BlacklistFilter extends HttpsAwareFiltersAdapter {
26+
public static final String BLOCKED_PHRASE = "Request blocked";
2527
private final Collection<BlacklistEntry> blacklistedUrls;
2628

2729
public BlacklistFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, Collection<BlacklistEntry> blacklistedUrls) {
@@ -39,18 +41,23 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) {
3941
if (httpObject instanceof HttpRequest) {
4042
HttpRequest httpRequest = (HttpRequest) httpObject;
4143

42-
String url = getFullUrl(httpRequest);
44+
String url = getOriginalUrl();
4345

4446
for (BlacklistEntry entry : blacklistedUrls) {
45-
if (HttpMethod.CONNECT.equals(httpRequest.getMethod()) && entry.getHttpMethodPattern() == null) {
47+
if (HttpMethod.CONNECT.equals(httpRequest.method()) && entry.getHttpMethodPattern() == null) {
4648
// do not allow CONNECTs to be blacklisted unless a method pattern is explicitly specified
4749
continue;
4850
}
4951

50-
if (entry.matches(url, httpRequest.getMethod().name())) {
51-
HttpResponseStatus status = HttpResponseStatus.valueOf(entry.getStatusCode());
52-
HttpResponse resp = new DefaultFullHttpResponse(httpRequest.getProtocolVersion(), status);
53-
HttpHeaders.setContentLength(resp, 0L);
52+
if (entry.matches(url, httpRequest.method().name())) {
53+
HttpResponseStatus status;
54+
if(HttpStatusClass.UNKNOWN.equals(HttpStatusClass.valueOf(entry.getStatusCode()))) {
55+
status = new HttpResponseStatus(entry.getStatusCode(), BLOCKED_PHRASE);
56+
} else {
57+
status = HttpResponseStatus.valueOf(entry.getStatusCode());
58+
}
59+
HttpResponse resp = new DefaultFullHttpResponse(httpRequest.protocolVersion(), status);
60+
HttpUtil.setContentLength(resp, 0L);
5461

5562
return resp;
5663
}

browserup-proxy-core/src/main/java/com/browserup/bup/filters/HarCaptureFilter.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import java.util.EnumSet;
4848
import java.util.List;
4949
import java.util.Set;
50-
import java.util.concurrent.TimeUnit;
5150
import java.util.concurrent.atomic.AtomicInteger;
5251

5352
import static com.browserup.bup.util.BrowserUpProxyUtil.getTotalElapsedTime;
@@ -120,12 +119,14 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter {
120119
*/
121120
private volatile HttpRequest capturedOriginalRequest;
122121

122+
private volatile boolean isResponse = false;
123+
123124
/**
124125
* True if this filter instance processed a {@link #proxyToServerResolutionSucceeded(String, java.net.InetSocketAddress)} call, indicating
125126
* that the hostname was resolved and populated in the HAR (if this is not a CONNECT).
126127
*/
127128
private volatile boolean addressResolved = false;
128-
129+
129130
/**
130131
* Create a new instance of the HarCaptureFilter that will capture request and response information. If no har is specified in the
131132
* constructor, this filter will do nothing.
@@ -255,6 +256,7 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) {
255256

256257
@Override
257258
public HttpObject serverToProxyResponse(HttpObject httpObject) {
259+
isResponse = true;
258260
// if a ServerResponseCaptureFilter is configured, delegate to it to collect the server's response. if it is not
259261
// configured, we still need to capture basic information (timings, HTTP status, etc.), just not content.
260262
if (responseCaptureFilter != null) {
@@ -286,8 +288,20 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) {
286288
return super.serverToProxyResponse(httpObject);
287289
}
288290

291+
@Override
292+
public HttpObject proxyToClientResponse(HttpObject httpObject) {
293+
// if a subsequent filter short-circuited the response, capture it here
294+
if (!isResponse && httpObject instanceof HttpResponse) {
295+
HttpResponse httpResponse = (HttpResponse) httpObject;
296+
captureResponse(httpResponse);
297+
harEntry.setTime(getTotalElapsedTime(harEntry.getTimings()));
298+
}
299+
return super.proxyToClientResponse(httpObject);
300+
}
301+
289302
@Override
290303
public void serverToProxyResponseTimedOut() {
304+
isResponse = true;
291305
// replace any existing HarResponse that was created if the server sent a partial response
292306
HarResponse response = HarCaptureUtil.createHarResponseForFailure();
293307
harEntry.setResponse(response);
@@ -678,6 +692,7 @@ public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHo
678692

679693
@Override
680694
public void proxyToServerResolutionFailed(String hostAndPort) {
695+
isResponse = true;
681696
HarResponse response = HarCaptureUtil.createHarResponseForFailure();
682697
this.harEntry.setResponse(response);
683698

@@ -720,6 +735,7 @@ public void proxyToServerConnectionStarted() {
720735

721736
@Override
722737
public void proxyToServerConnectionFailed() {
738+
isResponse = true;
723739
HarResponse response = HarCaptureUtil.createHarResponseForFailure();
724740
this.harEntry.setResponse(response);
725741

@@ -733,6 +749,7 @@ public void proxyToServerConnectionFailed() {
733749

734750
@Override
735751
public void proxyToServerConnectionSucceeded(ChannelHandlerContext serverCtx) {
752+
isResponse = true;
736753
long connectionSucceededTimeNanos = System.nanoTime();
737754

738755
// make sure the previous timestamp was captured, to avoid setting an absurd value in the har (see serverToProxyResponseReceiving())

browserup-proxy-core/src/main/java/com/browserup/bup/filters/ResponseFilterAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void setModifiedHttpRequest(HttpRequest modifiedHttpRequest) {
6666
* and sets a maximum response buffer size of 2 MiB.
6767
*/
6868
public static class FilterSource extends HttpFiltersSourceAdapter {
69-
private static final int DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE = 2097152;
69+
private static final int DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE = 10485760;
7070

7171
private final ResponseFilter filter;
7272
private final int maximumResponseBufferSizeInBytes;

browserup-proxy-core/src/main/java/com/browserup/bup/filters/WhitelistFilter.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
package com.browserup.bup.filters;
66

7+
import com.browserup.bup.util.HttpStatusClass;
78
import io.netty.channel.ChannelHandlerContext;
89
import io.netty.handler.codec.http.DefaultFullHttpResponse;
9-
import io.netty.handler.codec.http.HttpHeaders;
1010
import io.netty.handler.codec.http.HttpObject;
1111
import io.netty.handler.codec.http.HttpRequest;
1212
import io.netty.handler.codec.http.HttpResponse;
@@ -15,7 +15,6 @@
1515
import org.littleshoot.proxy.impl.ProxyUtils;
1616

1717
import java.util.Collection;
18-
import java.util.Collections;
1918
import java.util.regex.Pattern;
2019

2120
import static java.util.Collections.*;
@@ -58,12 +57,17 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) {
5857

5958
boolean urlWhitelisted;
6059

61-
String url = getFullUrl(httpRequest);
60+
String url = getOriginalUrl();
6261

6362
urlWhitelisted = whitelistUrls.stream().anyMatch(pattern -> pattern.matcher(url).matches());
6463

6564
if (!urlWhitelisted) {
66-
HttpResponseStatus status = HttpResponseStatus.valueOf(whitelistResponseCode);
65+
HttpResponseStatus status;
66+
if(HttpStatusClass.UNKNOWN.equals(HttpStatusClass.valueOf(whitelistResponseCode))) {
67+
status = new HttpResponseStatus(whitelistResponseCode, BlacklistFilter.BLOCKED_PHRASE);
68+
} else {
69+
status = HttpResponseStatus.valueOf(whitelistResponseCode);
70+
}
6771
HttpResponse resp = new DefaultFullHttpResponse(httpRequest.protocolVersion(), status);
6872
HttpUtil.setContentLength(resp, 0L);
6973

browserup-proxy-core/src/main/java/com/browserup/bup/mitmproxy/MitmProxyProcessManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ private void startProxy(int port, List<AbstractAddon> addons) {
173173
add("mitmdump");
174174
add("-p");
175175
add(String.valueOf(port));
176+
add("--set");
177+
add("flow_detail=3");
176178
}};
177179
if (trustAll) {
178180
command.add("--ssl-insecure");

browserup-proxy-core/src/main/java/com/browserup/bup/mitmproxy/management/HarCaptureManager.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public class HarCaptureManager {
2222

2323
private final AddonsManagerClient addonsManagerClient;
2424
private final MitmProxyProcessManager mitmProxyManager;
25-
private Har lastHar = new Har();
2625
private EnumSet<CaptureType> lastCaptureTypes = EnumSet.noneOf(CaptureType.class);
2726

2827
public HarCaptureManager(AddonsManagerClient addonsManagerClient, MitmProxyProcessManager mitmProxyManager) {
@@ -35,7 +34,7 @@ public Har getHar() {
3534
}
3635

3736
public Har getHar(Boolean cleanHar) {
38-
if (!mitmProxyManager.isRunning()) return lastHar;
37+
if (!mitmProxyManager.isRunning()) return null;
3938

4039
HarResponse response = addonsManagerClient.
4140
getRequestToAddonsManager(
@@ -58,7 +57,7 @@ public Har newHar(String pageRef) {
5857
}
5958

6059
public Har newHar(String pageRef, String pageTitle) {
61-
if (!mitmProxyManager.isRunning()) return lastHar;
60+
if (!mitmProxyManager.isRunning()) return null;
6261

6362
HarResponse response = addonsManagerClient.
6463
getRequestToAddonsManager(
@@ -73,7 +72,7 @@ public Har newHar(String pageRef, String pageTitle) {
7372
}
7473

7574
public Har endHar() {
76-
if (!mitmProxyManager.isRunning()) return lastHar;
75+
if (!mitmProxyManager.isRunning()) return null;
7776

7877
HarResponse response = addonsManagerClient.
7978
getRequestToAddonsManager(
@@ -93,7 +92,7 @@ public Har newPage(String pageRef) {
9392
}
9493

9594
public Har newPage(String pageRef, String pageTitle) {
96-
if (!mitmProxyManager.isRunning()) return lastHar;
95+
if (!mitmProxyManager.isRunning()) return null;
9796

9897
HarResponse response = addonsManagerClient.
9998
getRequestToAddonsManager(
@@ -127,7 +126,6 @@ private Har parseHar(String filePath) {
127126
} catch (IOException e) {
128127
throw new RuntimeException("Couldn't read HAR file: " + harFile.getAbsolutePath(), e);
129128
}
130-
lastHar = har;
131129
return har;
132130
}
133131

browserup-proxy-core/src/main/java/com/browserup/harreader/model/HarEntry.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package com.browserup.harreader.model;
22

3-
import com.fasterxml.jackson.annotation.JsonAnyGetter;
4-
import com.fasterxml.jackson.annotation.JsonAnySetter;
5-
import com.fasterxml.jackson.annotation.JsonFormat;
6-
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
7-
import com.fasterxml.jackson.annotation.JsonInclude;
3+
import com.fasterxml.jackson.annotation.*;
84

95
import java.util.Date;
106
import java.util.HashMap;
@@ -29,6 +25,7 @@ public class HarEntry {
2925
private String serverIPAddress;
3026
private String connection;
3127
private String comment;
28+
private String _url;
3229
private Map<String, Object> additional = new HashMap<>();
3330

3431
/**
@@ -121,6 +118,19 @@ public void setTimings(HarTiming timings) {
121118
this.timings = timings;
122119
}
123120

121+
@JsonProperty("_url")
122+
public String getUrl() {
123+
if (_url == null) {
124+
_url = "";
125+
}
126+
return _url;
127+
}
128+
129+
@JsonProperty("_url")
130+
public void setUrl(String url) {
131+
this._url = url;
132+
}
133+
124134
/**
125135
* @return Server IP address (result of DNS resolution), null if not present.
126136
*/

browserup-proxy-core/src/main/java/com/browserup/harreader/model/HarResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class HarResponse {
1919

2020
private HttpStatus status;
2121
private String statusText = "";
22-
private String httpVersion = "HTTP/1.1";
22+
private String httpVersion = "unknown";
2323
private List<HarCookie> cookies;
2424
private List<HarHeader> headers;
2525
private HarContent content;

0 commit comments

Comments
 (0)