Skip to content

Commit 89fc927

Browse files
committed
Merge pull request #276 from jekh/capture-failed-connect-requests-in-har
Add HAR error capture for HTTPS requests
2 parents dc97668 + 0ebd2e7 commit 89fc927

File tree

10 files changed

+786
-343
lines changed

10 files changed

+786
-343
lines changed

browsermob-core-littleproxy/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import net.lightbody.bmp.filters.BlacklistFilter;
1717
import net.lightbody.bmp.filters.BrowserMobHttpFilterChain;
1818
import net.lightbody.bmp.filters.HarCaptureFilter;
19+
import net.lightbody.bmp.filters.ResolvedHostnameCacheFilter;
20+
import net.lightbody.bmp.filters.HttpConnectHarCaptureFilter;
1921
import net.lightbody.bmp.filters.HttpsHostCaptureFilter;
2022
import net.lightbody.bmp.filters.HttpsOriginalHostCaptureFilter;
2123
import net.lightbody.bmp.filters.LatencyFilter;
@@ -52,6 +54,7 @@
5254
import org.littleshoot.proxy.HttpProxyServer;
5355
import org.littleshoot.proxy.HttpProxyServerBootstrap;
5456
import org.littleshoot.proxy.impl.DefaultHttpProxyServer;
57+
import org.littleshoot.proxy.impl.ProxyUtils;
5558
import org.openqa.selenium.Proxy;
5659
import org.slf4j.Logger;
5760
import org.slf4j.LoggerFactory;
@@ -1279,6 +1282,13 @@ public boolean isMitmDisabled() {
12791282
* Adds the basic browsermob-proxy filters, except for the relatively-expensive HAR capture filter.
12801283
*/
12811284
protected void addBrowserMobFilters() {
1285+
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
1286+
@Override
1287+
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
1288+
return new ResolvedHostnameCacheFilter(originalRequest, ctx);
1289+
}
1290+
});
1291+
12821292
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
12831293
@Override
12841294
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
@@ -1374,10 +1384,31 @@ private int getMaximumResponseBufferSize() {
13741384
*/
13751385
protected void addHarCaptureFilter() {
13761386
if (harCaptureFilterEnabled.compareAndSet(false, true)) {
1387+
// the HAR capture filter is (relatively) expensive, so only enable it when a HAR is being captured. furthermore,
1388+
// restricting the HAR capture filter to requests where the HAR exists, as well as excluding HTTP CONNECTs
1389+
// from the HAR capture filter, greatly simplifies the filter code.
1390+
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
1391+
@Override
1392+
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
1393+
Har har = getHar();
1394+
if (har != null && !ProxyUtils.isCONNECT(originalRequest)) {
1395+
return new HarCaptureFilter(originalRequest, ctx, har, getCurrentHarPage() == null ? null : getCurrentHarPage().getId(), getHarCaptureTypes());
1396+
} else {
1397+
return null;
1398+
}
1399+
}
1400+
});
1401+
1402+
// HTTP CONNECTs are a special case, since they require special timing and error handling
13771403
addHttpFilterFactory(new HttpFiltersSourceAdapter() {
13781404
@Override
13791405
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
1380-
return new HarCaptureFilter(originalRequest, ctx, getHar(), getCurrentHarPage() == null ? null : getCurrentHarPage().getId(), getHarCaptureTypes());
1406+
Har har = getHar();
1407+
if (har != null && ProxyUtils.isCONNECT(originalRequest)) {
1408+
return new HttpConnectHarCaptureFilter(originalRequest, ctx, har, getCurrentHarPage() == null ? null : getCurrentHarPage().getId());
1409+
} else {
1410+
return null;
1411+
}
13811412
}
13821413
});
13831414
}

browsermob-core-littleproxy/src/main/java/net/lightbody/bmp/filters/BrowserMobHttpFilterChain.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ public BrowserMobHttpFilterChain(BrowserMobProxyServer proxyServer, HttpRequest
4040
// instantiate all HttpFilters using the proxy's filter factories
4141
for (HttpFiltersSource filterFactory : proxyServer.getFilterFactories()) {
4242
HttpFilters filter = filterFactory.filterRequest(originalRequest, ctx);
43-
filters.add(filter);
43+
// allow filter factories to avoid adding a filter on a per-request basis by returning a null
44+
// HttpFilters instance
45+
if (filter != null) {
46+
filters.add(filter);
47+
}
4448
}
4549
} else {
4650
filters = Collections.emptyList();

0 commit comments

Comments
 (0)