|
16 | 16 | import net.lightbody.bmp.filters.BlacklistFilter; |
17 | 17 | import net.lightbody.bmp.filters.BrowserMobHttpFilterChain; |
18 | 18 | import net.lightbody.bmp.filters.HarCaptureFilter; |
| 19 | +import net.lightbody.bmp.filters.ResolvedHostnameCacheFilter; |
| 20 | +import net.lightbody.bmp.filters.HttpConnectHarCaptureFilter; |
19 | 21 | import net.lightbody.bmp.filters.HttpsHostCaptureFilter; |
20 | 22 | import net.lightbody.bmp.filters.HttpsOriginalHostCaptureFilter; |
21 | 23 | import net.lightbody.bmp.filters.LatencyFilter; |
|
52 | 54 | import org.littleshoot.proxy.HttpProxyServer; |
53 | 55 | import org.littleshoot.proxy.HttpProxyServerBootstrap; |
54 | 56 | import org.littleshoot.proxy.impl.DefaultHttpProxyServer; |
| 57 | +import org.littleshoot.proxy.impl.ProxyUtils; |
55 | 58 | import org.openqa.selenium.Proxy; |
56 | 59 | import org.slf4j.Logger; |
57 | 60 | import org.slf4j.LoggerFactory; |
@@ -1279,6 +1282,13 @@ public boolean isMitmDisabled() { |
1279 | 1282 | * Adds the basic browsermob-proxy filters, except for the relatively-expensive HAR capture filter. |
1280 | 1283 | */ |
1281 | 1284 | 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 | + |
1282 | 1292 | addHttpFilterFactory(new HttpFiltersSourceAdapter() { |
1283 | 1293 | @Override |
1284 | 1294 | public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) { |
@@ -1374,10 +1384,31 @@ private int getMaximumResponseBufferSize() { |
1374 | 1384 | */ |
1375 | 1385 | protected void addHarCaptureFilter() { |
1376 | 1386 | 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 |
1377 | 1403 | addHttpFilterFactory(new HttpFiltersSourceAdapter() { |
1378 | 1404 | @Override |
1379 | 1405 | 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 | + } |
1381 | 1412 | } |
1382 | 1413 | }); |
1383 | 1414 | } |
|
0 commit comments