From 8f168ad2e933fcbf3598911ef71db4c3dba10947 Mon Sep 17 00:00:00 2001 From: Lennard Berger Date: Sun, 30 Sep 2018 22:29:18 +0200 Subject: [PATCH 01/41] [brotli] Add brotli support backed by org.brotli.dec --- browsermob-core/pom.xml | 7 ++++ .../filters/ServerResponseCaptureFilter.java | 8 ++++ .../bmp/util/BrowserMobHttpUtil.java | 40 ++++++++++++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 2071434ee..8e5cdab71 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -139,6 +139,13 @@ ${project.version} + + + org.brotli + dec + 0.1.2 + + org.javassist diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java index d69ad8f76..1bce61ad7 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java @@ -25,6 +25,7 @@ */ public class ServerResponseCaptureFilter extends HttpFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(ServerResponseCaptureFilter.class); + private static final String BROTLI_COMPRESSION = "br"; /** * Populated by serverToProxyResponse() when processing the HttpResponse object @@ -133,6 +134,13 @@ protected void decompressContents() { } catch (RuntimeException e) { log.warn("Failed to decompress response with encoding type " + contentEncoding + " when decoding request from " + originalRequest.getUri(), e); } + } else if(contentEncoding.equals(BROTLI_COMPRESSION)) { + try { + fullResponseContents = BrowserMobHttpUtil.decompressBrotliContents(getRawResponseContents()); + decompressionSuccessful = true; + } catch (RuntimeException e) { + log.warn("Failed to decompress response with encoding type " + contentEncoding + " when decoding request from " + originalRequest.getUri(), e); + } } else { log.warn("Cannot decode unsupported content encoding type {}", contentEncoding); } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java index 98172810f..264b3a2ee 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java @@ -3,6 +3,7 @@ import com.google.common.io.BaseEncoding; import com.google.common.net.HostAndPort; import com.google.common.net.MediaType; +import org.brotli.dec.BrotliInputStream; import io.netty.buffer.ByteBuf; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; @@ -14,6 +15,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -78,7 +80,7 @@ public static long getHeaderSize(HttpHeaders headers) { /** * Decompresses the gzipped byte stream. * - * @param fullMessage gzipped byte stream to decomress + * @param fullMessage gzipped byte stream to decompress * @return decompressed bytes * @throws DecompressionException thrown if the fullMessage cannot be read or decompressed for any reason */ @@ -111,6 +113,42 @@ public static byte[] decompressContents(byte[] fullMessage) throws Decompression return fullMessage; } + /** + * Decompresses the brotli byze stream + * + * @param fullMessage brotli byte stream to decompress + * @return decompressed bytes + * @throws DecompressionException thrown if the fullMessage cannot be read or decompressed for any reason + */ + public static byte[] decompressBrotliContents(byte[] fullMessage) throws DecompressionException { + InputStream brotliReader = null; + ByteArrayOutputStream uncompressed; + try { + brotliReader = new BrotliInputStream(new ByteArrayInputStream(fullMessage)); + + uncompressed = new ByteArrayOutputStream(fullMessage.length); + + byte[] decompressBuffer = new byte[DECOMPRESS_BUFFER_SIZE]; + int bytesRead; + while ((bytesRead = brotliReader.read(decompressBuffer)) > -1) { + uncompressed.write(decompressBuffer, 0, bytesRead); + } + + fullMessage = uncompressed.toByteArray(); + } catch (IOException e) { + throw new DecompressionException("Unable to decompress response", e); + } finally { + try { + if (brotliReader != null) { + brotliReader.close(); + } + } catch (IOException e) { + log.warn("Unable to close brotli stream", e); + } + } + return fullMessage; + } + /** * Returns true if the content type string indicates textual content. Currently these are any Content-Types that start with one of the * following: From 4863fa87389267d0981cfb3c213091a7601622c8 Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Thu, 31 Jan 2019 12:13:01 +0100 Subject: [PATCH 02/41] update jackson bindings --- .../java/net/lightbody/bmp/core/har/HarEntry.java | 9 +++++++++ .../java/net/lightbody/bmp/core/har/HarTimings.java | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarEntry.java b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarEntry.java index 1864a78c7..5b6529322 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarEntry.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarEntry.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Date; import java.util.concurrent.TimeUnit; @@ -17,6 +18,8 @@ public class HarEntry { private volatile HarCache cache = new HarCache(); private volatile HarTimings timings = new HarTimings(); private volatile String serverIPAddress; + @JsonProperty("time") + private volatile long time; private volatile String connection; private volatile String comment = ""; @@ -157,4 +160,10 @@ public String getConnection() { public void setConnection(String connection) { this.connection = connection; } + + public HarEntry setTime(long time) { + this.time = time; + return this; + } + } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarTimings.java b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarTimings.java index efb8d8612..3849baf4b 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarTimings.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarTimings.java @@ -1,15 +1,24 @@ package net.lightbody.bmp.core.har; +import com.fasterxml.jackson.annotation.JsonProperty; + import java.util.concurrent.TimeUnit; public class HarTimings { // optional values are initialized to -1, which indicates they do not apply to the current request, according to the HAR spec + @JsonProperty("blocked") private volatile long blockedNanos = -1; + @JsonProperty("dns") private volatile long dnsNanos = -1; + @JsonProperty("connect") private volatile long connectNanos = -1; + @JsonProperty("send") private volatile long sendNanos; + @JsonProperty("wait") private volatile long waitNanos; + @JsonProperty("receive") private volatile long receiveNanos; + @JsonProperty("ssl") private volatile long sslNanos = -1; private volatile String comment = ""; @@ -49,7 +58,7 @@ public long getDns(TimeUnit timeUnit) { public void setDns(long dns, TimeUnit timeUnit) { if (dns == -1) { this.dnsNanos = -1; - } else{ + } else { this.dnsNanos = TimeUnit.NANOSECONDS.convert(dns, timeUnit); } } From dd49e1a1bee681d8eadf12197f691bd3c8c3ee7e Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Thu, 31 Jan 2019 12:41:46 +0100 Subject: [PATCH 03/41] promote release version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 16 +++++++++------- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e932b282c..91a9ffe81 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.6-SNAPSHOT + 2.1.6 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 8e5cdab71..c8b6336e8 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6-SNAPSHOT + 2.1.6 4.0.0 diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 59edc89cb..dfe0e3df9 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6-SNAPSHOT + 2.1.6 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 592543c91..b55629632 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6-SNAPSHOT + 2.1.6 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 16499a206..0e18037bb 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6-SNAPSHOT + 2.1.6 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index ca0f5ecdb..4645d6ef4 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6-SNAPSHOT + 2.1.6 4.0.0 diff --git a/pom.xml b/pom.xml index 2bd63686e..8529cc6b4 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.6-SNAPSHOT + 2.1.6 browsermob-core browsermob-legacy @@ -47,14 +47,16 @@ - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + central + artifactory-artifactory-0-releases + https://artifactory.tools-k8s.hellofresh.io/artifactory/maven + + snapshots + artifactory-artifactory-0-snapshots + https://artifactory.tools-k8s.hellofresh.io/artifactory/maven + From e86f22595e60102ff9306629bbe3c24a2cf00a46 Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Thu, 31 Jan 2019 12:48:22 +0100 Subject: [PATCH 04/41] 2.1.7-SNAPSHOT --- README.md | 2 +- browsermob-core/pom.xml | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 91a9ffe81..80faec256 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.6 + 2.1.7-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index c8b6336e8..54f01d431 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6 + 2.1.7-SNAPSHOT 4.0.0 diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index dfe0e3df9..29b1dd659 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6 + 2.1.7-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index b55629632..010c82b5e 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6 + 2.1.7-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 0e18037bb..df74fa510 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6 + 2.1.7-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 4645d6ef4..38b8d2583 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.6 + 2.1.7-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 8529cc6b4..ee9036c5e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.6 + 2.1.7-SNAPSHOT browsermob-core browsermob-legacy From dae00cd954bfa1e0d83e5a1fff4fd486a7fd6926 Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Wed, 20 Feb 2019 17:41:39 +0100 Subject: [PATCH 05/41] added statsD metrics to gather failed requests --- README.md | 2 +- browsermob-core/pom.xml | 10 ++- .../lightbody/bmp/BrowserMobProxyServer.java | 28 +++----- .../bmp/filters/StatsDMetricsFilter.java | 67 +++++++++++++++++++ browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 12 +++- 9 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java diff --git a/README.md b/README.md index 80faec256..c14fae554 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.7-SNAPSHOT + 2.1.7 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 54f01d431..eaf02848e 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -1,11 +1,12 @@ - + jar browsermob-proxy net.lightbody.bmp - 2.1.7-SNAPSHOT + 2.1.7 4.0.0 @@ -133,6 +134,11 @@ bcpkix-jdk15on + + com.timgroup + java-statsd-client + + net.lightbody.bmp mitm diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java index d4ddc5543..39e89bf64 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java @@ -12,24 +12,7 @@ import net.lightbody.bmp.core.har.HarLog; import net.lightbody.bmp.core.har.HarNameVersion; import net.lightbody.bmp.core.har.HarPage; -import net.lightbody.bmp.filters.AddHeadersFilter; -import net.lightbody.bmp.filters.AutoBasicAuthFilter; -import net.lightbody.bmp.filters.BlacklistFilter; -import net.lightbody.bmp.filters.BrowserMobHttpFilterChain; -import net.lightbody.bmp.filters.HarCaptureFilter; -import net.lightbody.bmp.filters.HttpConnectHarCaptureFilter; -import net.lightbody.bmp.filters.HttpsHostCaptureFilter; -import net.lightbody.bmp.filters.HttpsOriginalHostCaptureFilter; -import net.lightbody.bmp.filters.LatencyFilter; -import net.lightbody.bmp.filters.RegisterRequestFilter; -import net.lightbody.bmp.filters.RequestFilter; -import net.lightbody.bmp.filters.RequestFilterAdapter; -import net.lightbody.bmp.filters.ResolvedHostnameCacheFilter; -import net.lightbody.bmp.filters.ResponseFilter; -import net.lightbody.bmp.filters.ResponseFilterAdapter; -import net.lightbody.bmp.filters.RewriteUrlFilter; -import net.lightbody.bmp.filters.UnregisterRequestFilter; -import net.lightbody.bmp.filters.WhitelistFilter; +import net.lightbody.bmp.filters.*; import net.lightbody.bmp.mitm.KeyStoreFileCertificateSource; import net.lightbody.bmp.mitm.TrustSource; import net.lightbody.bmp.mitm.keys.ECKeyGenerator; @@ -353,7 +336,7 @@ public void filterRequest(HttpObject httpObject) { String chainedProxyAuth = chainedProxyCredentials; if (chainedProxyAuth != null) { if (httpObject instanceof HttpRequest) { - HttpHeaders.addHeader((HttpRequest)httpObject, HttpHeaders.Names.PROXY_AUTHORIZATION, "Basic " + chainedProxyAuth); + HttpHeaders.addHeader((HttpRequest) httpObject, HttpHeaders.Names.PROXY_AUTHORIZATION, "Basic " + chainedProxyAuth); } } } @@ -1098,6 +1081,13 @@ public HttpFilters filterRequest(HttpRequest originalRequest) { } }); + addHttpFilterFactory(new HttpFiltersSourceAdapter() { + @Override + public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) { + return new StatsDMetricsFilter(originalRequest, ctx); + } + }); + addHttpFilterFactory(new HttpFiltersSourceAdapter() { @Override public HttpFilters filterRequest(HttpRequest originalRequest) { diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java new file mode 100644 index 000000000..1247bcc79 --- /dev/null +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -0,0 +1,67 @@ +package net.lightbody.bmp.filters; + +import com.timgroup.statsd.NonBlockingStatsDClient; +import com.timgroup.statsd.StatsDClient; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpResponse; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Stack; + +public class StatsDMetricsFilter extends HttpsAwareFiltersAdapter { + private StatsDClient client; + private static Stack HTTP_RESPONSE_STACK = new Stack<>(); + + + public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ctx) { + super(originalRequest, ctx); + this.client = new NonBlockingStatsDClient("proxy", getStatsDHost(), getStatsDPort()); + } + + @Override + public HttpResponse clientToProxyRequest(HttpObject httpObject) { + if (httpObject instanceof HttpRequest) { + HttpRequest httpRequest = (HttpRequest) httpObject; + String url = getFullUrl(httpRequest); + HTTP_RESPONSE_STACK.push(url); + } + return null; + } + + + @Override + public HttpObject serverToProxyResponse(HttpObject httpObject) { + if (httpObject instanceof HttpResponse) { + HttpResponse httpResponse = (HttpResponse) httpObject; + + int status = httpResponse.getStatus().code(); + if (status > 0 || status == 0) { + String metric; + String url = HTTP_RESPONSE_STACK.pop(); + try { + URI uri = new URI(url); + metric = uri.getHost().concat(uri.getPath()); + client.increment(metric); + HTTP_RESPONSE_STACK.clear(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + } + return super.serverToProxyResponse(httpObject); + } + + + public static String getStatsDHost() { + return StringUtils.isEmpty(System.getenv("STATSD_HOST")) ? "graphite000.tools.hellofresh.io" : System.getenv("STATSD_HOST"); + } + + public static int getStatsDPort() { + return StringUtils.isEmpty(System.getenv("STATSD_PORT")) ? 8125 : NumberUtils.toInt(System.getenv("STATSD_PORT")); + } +} diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 29b1dd659..6b341d05c 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7-SNAPSHOT + 2.1.7 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 010c82b5e..f607380c6 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7-SNAPSHOT + 2.1.7 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index df74fa510..95d318737 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7-SNAPSHOT + 2.1.7 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 38b8d2583..d2d8d6be0 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7-SNAPSHOT + 2.1.7 4.0.0 diff --git a/pom.xml b/pom.xml index ee9036c5e..481c81459 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,9 @@ - + 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.7-SNAPSHOT + 2.1.7 browsermob-core browsermob-legacy @@ -80,6 +81,7 @@ 4.1.15.Final 1.58 + 3.0.1 @@ -413,6 +415,12 @@ ${bouncycastle.version} + + com.timgroup + java-statsd-client + ${java-statsd-client.version} + + org.javassist javassist From cfa12b368d0e3773b49d2ea585487322751e6281 Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Wed, 20 Feb 2019 17:48:35 +0100 Subject: [PATCH 06/41] Update base prefix and namespace --- .../java/net/lightbody/bmp/filters/StatsDMetricsFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 1247bcc79..2fe01850c 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -20,7 +20,7 @@ public class StatsDMetricsFilter extends HttpsAwareFiltersAdapter { public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ctx) { super(originalRequest, ctx); - this.client = new NonBlockingStatsDClient("proxy", getStatsDHost(), getStatsDPort()); + this.client = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); } @Override @@ -45,7 +45,7 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { String url = HTTP_RESPONSE_STACK.pop(); try { URI uri = new URI(url); - metric = uri.getHost().concat(uri.getPath()); + metric = "proxy.".concat(uri.getHost().concat(uri.getPath())); client.increment(metric); HTTP_RESPONSE_STACK.clear(); } catch (URISyntaxException e) { From 41a9af375a50c8af18dfa3737e387a4da8d24406 Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Wed, 20 Feb 2019 17:58:20 +0100 Subject: [PATCH 07/41] Promote snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c14fae554..b03c1ae43 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.7 + 2.1.8-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index eaf02848e..8c2ee8ea6 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7 + 2.1.8-SNAPSHOT 4.0.0 diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 6b341d05c..1e9102ae4 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7 + 2.1.8-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index f607380c6..b10ee7d31 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7 + 2.1.8-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 95d318737..b7943a36c 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7 + 2.1.8-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index d2d8d6be0..9db27011a 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.7 + 2.1.8-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 481c81459..5667d609e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.7 + 2.1.8-SNAPSHOT browsermob-core browsermob-legacy From 6d131c5933f8e61c3f27dc0abd97b4d766a9feec Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Thu, 21 Feb 2019 13:19:51 +0100 Subject: [PATCH 08/41] Fix metrics (#5) * Fix metrics * Fix metrics --- README.md | 2 +- browsermob-core/pom.xml | 4 ++-- .../java/net/lightbody/bmp/filters/StatsDMetricsFilter.java | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b03c1ae43..5eb9c036f 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 8c2ee8ea6..ef3420775 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT 4.0.0 @@ -87,7 +87,7 @@ dnsjava dnsjava - 2.1.8 + 2.1.9-SNAPSHOT diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 2fe01850c..e95d56cce 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -40,7 +40,7 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { HttpResponse httpResponse = (HttpResponse) httpObject; int status = httpResponse.getStatus().code(); - if (status > 0 || status == 0) { + if (status > 399 || status == 0) { String metric; String url = HTTP_RESPONSE_STACK.pop(); try { diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 1e9102ae4..077480f39 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index b10ee7d31..0b3b967ef 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index b7943a36c..93f97e5a3 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 9db27011a..7884ee56e 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 5667d609e..1d30c65ab 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.8-SNAPSHOT + 2.1.9-SNAPSHOT browsermob-core browsermob-legacy From accde93f578a753657050054104b7caba321bfee Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 25 Feb 2019 10:40:10 +0100 Subject: [PATCH 09/41] 2.1.9 release (#6) * 2.1.9 release * 2.1.9 fixup * Promote snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 4 ++-- .../net/lightbody/bmp/filters/StatsDMetricsFilter.java | 9 +++++++-- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 15 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5eb9c036f..310b7a956 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index ef3420775..9ff15cfd9 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT 4.0.0 @@ -87,7 +87,7 @@ dnsjava dnsjava - 2.1.9-SNAPSHOT + 2.1.8 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index e95d56cce..17c6845a3 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -45,7 +45,8 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { String url = HTTP_RESPONSE_STACK.pop(); try { URI uri = new URI(url); - metric = "proxy.".concat(uri.getHost().concat(uri.getPath())); + metric = "proxy.".concat( + prepareMetric(uri.getHost().concat(uri.getPath())).concat(String.format(".%s", status))); client.increment(metric); HTTP_RESPONSE_STACK.clear(); } catch (URISyntaxException e) { @@ -56,7 +57,6 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { return super.serverToProxyResponse(httpObject); } - public static String getStatsDHost() { return StringUtils.isEmpty(System.getenv("STATSD_HOST")) ? "graphite000.tools.hellofresh.io" : System.getenv("STATSD_HOST"); } @@ -64,4 +64,9 @@ public static String getStatsDHost() { public static int getStatsDPort() { return StringUtils.isEmpty(System.getenv("STATSD_PORT")) ? 8125 : NumberUtils.toInt(System.getenv("STATSD_PORT")); } + + private String prepareMetric(String initialUrl) { + return initialUrl.replaceAll("/", "_").replaceAll("\\.", "_"); + } + } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 077480f39..603ddd77f 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 0b3b967ef..d6acfe625 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 93f97e5a3..deb908c7d 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 7884ee56e..65db54b25 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 1d30c65ab..76be5bf44 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.9-SNAPSHOT + 2.1.10-SNAPSHOT browsermob-core browsermob-legacy From 1da281b333497d1a72ee89633821370f83b0f880 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 25 Feb 2019 15:15:07 +0100 Subject: [PATCH 10/41] BrowserMob 0 response metrics (#7) * BrowserMob 0 response metrics * Fix failed tests * Fix metrics names * Release snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../bmp/filters/HarCaptureFilter.java | 30 ++++++++++++++----- .../filters/HttpConnectHarCaptureFilter.java | 10 +++++-- .../bmp/filters/StatsDMetricsFilter.java | 28 ++++++++++------- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 10 files changed, 54 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 310b7a956..3d9f77e8c 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 9ff15cfd9..c2bfef853 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index ca8c044c2..572b3baef 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -2,6 +2,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.io.BaseEncoding; +import com.timgroup.statsd.NonBlockingStatsDClient; +import com.timgroup.statsd.StatsDClient; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpContent; @@ -44,8 +46,12 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.*; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getStatsDPort; + public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); + private static final StatsDClient statsDClient = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); /** * The currently active HAR at the time the current request is received. @@ -123,16 +129,16 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { *

* Regardless of the CaptureTypes specified in dataToCapture, the HarCaptureFilter will always capture: *

    - *
  • Request and response sizes
  • - *
  • HTTP request and status lines
  • - *
  • Page timing information
  • + *
  • Request and response sizes
  • + *
  • HTTP request and status lines
  • + *
  • Page timing information
  • *
* * @param originalRequest the original HttpRequest from the HttpFiltersSource factory - * @param har a reference to the ProxyServer's current HAR file at the time this request is received (can be null if HAR capture is not required) - * @param currentPageRef the ProxyServer's currentPageRef at the time this request is received from the client - * @param dataToCapture the data types to capture for this request. null or empty set indicates only basic information will be - * captured (see {@link net.lightbody.bmp.proxy.CaptureType} for information on data collected for each CaptureType) + * @param har a reference to the ProxyServer's current HAR file at the time this request is received (can be null if HAR capture is not required) + * @param currentPageRef the ProxyServer's currentPageRef at the time this request is received from the client + * @param dataToCapture the data types to capture for this request. null or empty set indicates only basic information will be + * captured (see {@link net.lightbody.bmp.proxy.CaptureType} for information on data collected for each CaptureType) */ public HarCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, Har har, String currentPageRef, Set dataToCapture) { super(originalRequest, ctx); @@ -199,6 +205,8 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { HarResponse defaultHarResponse = HarCaptureUtil.createHarResponseForFailure(); defaultHarResponse.setError(HarCaptureUtil.getNoResponseReceivedErrorMessage()); harEntry.setResponse(defaultHarResponse); + statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".client_proxy_connection_fail")); captureQueryParameters(httpRequest); // not capturing user agent: in many cases, it doesn't make sense to capture at the HarLog level, since the proxy could be @@ -278,6 +286,8 @@ public void serverToProxyResponseTimedOut() { // replace any existing HarResponse that was created if the server sent a partial response HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); + statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".response_timeout")); response.setError(HarCaptureUtil.getResponseTimedOutErrorMessage()); @@ -408,7 +418,7 @@ protected void captureRequestContent(HttpRequest httpRequest, byte[] fullMessage Charset charset; try { - charset = BrowserMobHttpUtil.readCharsetInContentTypeHeader(contentType); + charset = BrowserMobHttpUtil.readCharsetInContentTypeHeader(contentType); } catch (UnsupportedCharsetException e) { log.warn("Found unsupported character set in Content-Type header '{}' in HTTP request to {}. Content will not be captured in HAR.", contentType, httpRequest.getUri(), e); return; @@ -651,6 +661,8 @@ public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHo public void proxyToServerResolutionFailed(String hostAndPort) { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); + statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".server_resolution_fail")); response.setError(HarCaptureUtil.getResolutionFailedErrorMessage(hostAndPort)); @@ -692,6 +704,8 @@ public void proxyToServerConnectionStarted() { @Override public void proxyToServerConnectionFailed() { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); + statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".server_connection_fail")); harEntry.setResponse(response); response.setError(HarCaptureUtil.getConnectionFailedErrorMessage()); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java index 1717370a2..8e979ff45 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java @@ -1,6 +1,8 @@ package net.lightbody.bmp.filters; import com.google.common.cache.CacheBuilder; +import com.timgroup.statsd.NonBlockingStatsDClient; +import com.timgroup.statsd.StatsDClient; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; @@ -23,6 +25,8 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.*; + /** * This filter captures HAR data for HTTP CONNECT requests. CONNECTs are "meta" requests that must be made before HTTPS * requests, but are not populated as separate requests in the HAR. Most information from HTTP CONNECTs (such as SSL @@ -31,10 +35,10 @@ * static methods. This filter also handles HTTP CONNECT errors and creates HAR entries for those errors, since there * would otherwise not be any record in the HAR of the error (if the CONNECT fails, there will be no subsequent "real" * request in which to record the error). - * */ public class HttpConnectHarCaptureFilter extends HttpsAwareFiltersAdapter implements ModifiedRequestAwareFilter { private static final Logger log = LoggerFactory.getLogger(HttpConnectHarCaptureFilter.class); + private static final StatsDClient statsDClient = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); /** * The currently active HAR at the time the current request is received. @@ -104,7 +108,7 @@ public class HttpConnectHarCaptureFilter extends HttpsAwareFiltersAdapter implem /** * Stores SSL connection timing information from HTTP CONNNECT requests. This timing information is stored in the first HTTP request * after the CONNECT, not in the CONNECT itself, so it needs to be stored across requests. - * + *

* This is the only state stored across multiple requests. */ private static final ConcurrentMap httpConnectTimes = @@ -330,6 +334,8 @@ private HarEntry createHarEntryForFailedCONNECT(String errorMessage) { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); + statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".failed_connect_request")); response.setError(errorMessage); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 17c6845a3..84a72c577 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -43,15 +43,10 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { if (status > 399 || status == 0) { String metric; String url = HTTP_RESPONSE_STACK.pop(); - try { - URI uri = new URI(url); - metric = "proxy.".concat( - prepareMetric(uri.getHost().concat(uri.getPath())).concat(String.format(".%s", status))); - client.increment(metric); - HTTP_RESPONSE_STACK.clear(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } + metric = getProxyPrefix().concat( + prepareMetric(url)).concat(String.format(".%s", status)); + client.increment(metric); + HTTP_RESPONSE_STACK.clear(); } } return super.serverToProxyResponse(httpObject); @@ -65,8 +60,19 @@ public static int getStatsDPort() { return StringUtils.isEmpty(System.getenv("STATSD_PORT")) ? 8125 : NumberUtils.toInt(System.getenv("STATSD_PORT")); } - private String prepareMetric(String initialUrl) { - return initialUrl.replaceAll("/", "_").replaceAll("\\.", "_"); + public static String getProxyPrefix() { + return "proxy."; + } + + public static String prepareMetric(String initialUrl) { + URI uri = null; + try { + uri = new URI(initialUrl); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + return uri.getHost().concat(uri.getPath()).replaceAll("/", "_") + .replaceAll("\\.", "_"); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 603ddd77f..05ac046d0 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index d6acfe625..d4af72b87 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index deb908c7d..a59c37d29 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 65db54b25..6bbefaa08 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 76be5bf44..652d6ab1d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.10-SNAPSHOT + 2.1.11-SNAPSHOT browsermob-core browsermob-legacy From aeb2a1835cd62de2b80ddd19728f00a2257e0605 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 25 Feb 2019 16:34:24 +0100 Subject: [PATCH 11/41] Release 2.1.11 fix stats d metrics (#8) * Release 2.1.11 fix stats d metrics * Fix failed tests * SNAPSHOT version release --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../bmp/filters/HarCaptureFilter.java | 22 ++++++++++++++----- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 23 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3d9f77e8c..a4bfb5036 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index c2bfef853..f41138802 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 572b3baef..8d8bb4430 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -51,7 +51,7 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); - private static final StatsDClient statsDClient = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); + private static final ThreadLocal statsDClient = new InheritableThreadLocal<>(); /** * The currently active HAR at the time the current request is received. @@ -174,6 +174,8 @@ public HarCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, responseCaptureFilter = null; } + createStatsDClient(); + this.har = har; this.harEntry = new HarEntry(currentPageRef); @@ -205,8 +207,6 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { HarResponse defaultHarResponse = HarCaptureUtil.createHarResponseForFailure(); defaultHarResponse.setError(HarCaptureUtil.getNoResponseReceivedErrorMessage()); harEntry.setResponse(defaultHarResponse); - statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) - .concat("." + harEntry.getResponse().getStatus()).concat(".client_proxy_connection_fail")); captureQueryParameters(httpRequest); // not capturing user agent: in many cases, it doesn't make sense to capture at the HarLog level, since the proxy could be @@ -286,7 +286,8 @@ public void serverToProxyResponseTimedOut() { // replace any existing HarResponse that was created if the server sent a partial response HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); - statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + createStatsDClient(); + statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".response_timeout")); response.setError(HarCaptureUtil.getResponseTimedOutErrorMessage()); @@ -661,7 +662,8 @@ public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHo public void proxyToServerResolutionFailed(String hostAndPort) { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); - statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + createStatsDClient(); + statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".server_resolution_fail")); response.setError(HarCaptureUtil.getResolutionFailedErrorMessage(hostAndPort)); @@ -704,7 +706,8 @@ public void proxyToServerConnectionStarted() { @Override public void proxyToServerConnectionFailed() { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); - statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + createStatsDClient(); + statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".server_connection_fail")); harEntry.setResponse(response); @@ -777,4 +780,11 @@ public void serverToProxyResponseReceived() { harEntry.getTimings().setReceive(0L, TimeUnit.NANOSECONDS); } } + + + private void createStatsDClient() { + if (statsDClient.get() == null) { + statsDClient.set(new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort())); + } + } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 05ac046d0..9e42e4cb7 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index d4af72b87..a767e5440 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index a59c37d29..91c4db91c 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 6bbefaa08..18c7da0a8 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 652d6ab1d..41d88d62a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.11-SNAPSHOT + 2.1.12-SNAPSHOT browsermob-core browsermob-legacy From 57f6c42dd919509eb7ea7ec8df488202d51a1184 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Tue, 5 Mar 2019 15:15:31 +0100 Subject: [PATCH 12/41] Libs pormotion (#11) * libs promotions * update dependencies * fix failed dependency * fix dependency * fix dependency * fix dependency * fix dependency * fix dependency * fix dependency * fix dependency * fix dependency * fix dependency * update libs * Poromote libs * Update dependencies * Version promotion --- README.md | 2 +- browsermob-core/pom.xml | 9 +- .../bmp/proxy/BindAddressTest.groovy | 21 +- .../lightbody/bmp/proxy/InterceptorTest.java | 4 +- .../bmp/proxy/test/util/MockServerTest.java | 2 +- .../test/util/NewProxyServerTestUtil.java | 19 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- .../util/TrustEverythingSSLTrustManager.java | 6 +- browsermob-rest/pom.xml | 2 +- mitm/README.md | 2 +- mitm/pom.xml | 10 +- .../net/lightbody/bmp/mitm/util/SslUtil.java | 11 +- mitm/src/main/resources/default-ciphers.txt | 74 +- .../LittleProxyIntegrationTest.java | 27 +- pom.xml | 81 +- resources/jar/littleproxy-1.1.3.jar | Bin 0 -> 130385 bytes resources/jar/littleproxy-1.1.3.pom | 720 ++++++++++++++++++ 18 files changed, 877 insertions(+), 117 deletions(-) create mode 100644 resources/jar/littleproxy-1.1.3.jar create mode 100644 resources/jar/littleproxy-1.1.3.pom diff --git a/README.md b/README.md index a4bfb5036..91e504719 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.12-SNAPSHOT + 2.1.12 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index f41138802..a35e372e2 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12-SNAPSHOT + 2.1.12 4.0.0 @@ -50,7 +50,7 @@ - net.lightbody.bmp + org.littleshoot littleproxy @@ -258,5 +258,10 @@ hamcrest-library test + + org.apache.httpcomponents + httpclient + test + \ No newline at end of file diff --git a/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/BindAddressTest.groovy b/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/BindAddressTest.groovy index 16fd4b5c4..381008582 100644 --- a/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/BindAddressTest.groovy +++ b/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/BindAddressTest.groovy @@ -1,18 +1,21 @@ package net.lightbody.bmp.proxy + import net.lightbody.bmp.BrowserMobProxy import net.lightbody.bmp.BrowserMobProxyServer import net.lightbody.bmp.proxy.test.util.MockServerTest import net.lightbody.bmp.proxy.test.util.NewProxyServerTestUtil +import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpGet import org.apache.http.conn.HttpHostConnectException +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients import org.junit.After import org.junit.Before import org.junit.Test import org.mockserver.matchers.Times import static org.junit.Assert.assertEquals -import static org.junit.Assume.assumeNoException import static org.mockserver.model.HttpRequest.request import static org.mockserver.model.HttpResponse.response @@ -58,16 +61,16 @@ class BindAddressTest extends MockServerTest { // find the local host address to bind to that isn't loopback. since ProxyServerTest.getNewHtpClient creates an HTTP client that // connects to a proxy at 127.0.0.1, the HTTP client should *not* be able to connect to the proxy - InetAddress localHostAddr - try { - localHostAddr = InetAddress.getLocalHost() - } catch (UnknownHostException e) { - assumeNoException("Could not get a localhost address. Skipping test.", e) - return - } + Socket socket = new Socket() + socket.connect(new InetSocketAddress("google.com", 80)) + socket.getLocalAddress() proxy = new BrowserMobProxyServer() - proxy.start(0, localHostAddr) + proxy.start(0, new InetAddress().getByName(socket.getLocalAddress().getHostAddress())) + + + CloseableHttpClient httpclient = HttpClients.createDefault(); + CloseableHttpResponse response = httpclient.execute(new HttpGet("http://127.0.0.1:${mockServerPort}/clientbind")); NewProxyServerTestUtil.getNewHttpClient(proxy.getPort()).withCloseable { it.execute(new HttpGet("http://127.0.0.1:${mockServerPort}/clientbind")) diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java index 3df880424..ac1c437cc 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java @@ -97,8 +97,8 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { HttpRequest httpRequest = (HttpRequest) httpObject; - if (httpRequest.getMethod().equals(HttpMethod.GET) && httpRequest.getUri().contains("/shortcircuit204")) { - HttpResponse httpResponse = new DefaultHttpResponse(httpRequest.getProtocolVersion(), HttpResponseStatus.NO_CONTENT); + if (httpRequest.method().equals(HttpMethod.GET) && httpRequest.uri().contains("/shortcircuit204")) { + HttpResponse httpResponse = new DefaultHttpResponse(httpRequest.protocolVersion(), HttpResponseStatus.NO_CONTENT); shortCircuitFired.set(true); diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/MockServerTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/MockServerTest.java index 9e1ba94ef..24108d5cc 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/MockServerTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/MockServerTest.java @@ -14,7 +14,7 @@ public class MockServerTest { @Before public void setUpMockServer() { mockServer = new ClientAndServer(0); - mockServerPort = mockServer.getPort(); + mockServerPort = mockServer.getLocalPort(); } @After diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/NewProxyServerTestUtil.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/NewProxyServerTestUtil.java index af86c4b96..b68e1bd85 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/NewProxyServerTestUtil.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/test/util/NewProxyServerTestUtil.java @@ -2,8 +2,8 @@ import org.apache.http.HttpHost; import org.apache.http.client.CookieStore; +import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; @@ -12,8 +12,6 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; public class NewProxyServerTestUtil { /** @@ -31,26 +29,19 @@ public static CloseableHttpClient getNewHttpClient(int proxyPort) { * Creates an all-trusting CloseableHttpClient (for tests ONLY!) that will connect to a proxy at 127.0.0.1:proxyPort, * using the specified cookie store. * - * @param proxyPort port of the proxy running at 127.0.0.1 + * @param proxyPort port of the proxy running at 127.0.0.1 * @param cookieStore CookieStore for HTTP cookies * @return a new CloseableHttpClient */ public static CloseableHttpClient getNewHttpClient(int proxyPort, CookieStore cookieStore) { try { // Trust all certs -- under no circumstances should this ever be used outside of testing - SSLContext sslcontext = SSLContexts.custom() - .useTLS() - .loadTrustMaterial(null, new TrustStrategy() { - @Override - public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { - return true; - } - }) + SSLContext sslcontext = org.apache.http.ssl.SSLContexts.custom() + .loadTrustMaterial(null, (TrustStrategy) (chain, authType) -> true) .build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( - sslcontext, - SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + sslcontext, NoopHostnameVerifier.INSTANCE); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 9e42e4cb7..50dd76636 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -3,7 +3,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12-SNAPSHOT + 2.1.12 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index a767e5440..01fc10dcf 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12-SNAPSHOT + 2.1.12 4.0.0 diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/util/TrustEverythingSSLTrustManager.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/util/TrustEverythingSSLTrustManager.java index 39cef989a..0151a719e 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/util/TrustEverythingSSLTrustManager.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/util/TrustEverythingSSLTrustManager.java @@ -58,10 +58,6 @@ public static void trustAllSSLCertificatesUniversally() { public static void trustAllSSLCertificates(HttpsURLConnection connection) { getTrustingSSLSocketFactory(); connection.setSSLSocketFactory(socketFactory); - connection.setHostnameVerifier(new HostnameVerifier() { - public boolean verify(String s, SSLSession sslSession) { - return true; - } - }); + connection.setHostnameVerifier((s, sslSession) -> true); } } \ No newline at end of file diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 91c4db91c..efaedf3bb 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12-SNAPSHOT + 2.1.12 4.0.0 diff --git a/mitm/README.md b/mitm/README.md index d37ad8da3..878eedaa4 100644 --- a/mitm/README.md +++ b/mitm/README.md @@ -17,7 +17,7 @@ To use MITM with standalone LittleProxy, add a dependency on the `mitm` module i org.littleshoot littleproxy - 1.1.2 + 1.1.3 diff --git a/mitm/pom.xml b/mitm/pom.xml index 18c7da0a8..975a25007 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -1,9 +1,10 @@ - + browsermob-proxy net.lightbody.bmp - 2.1.12-SNAPSHOT + 2.1.12 4.0.0 @@ -14,9 +15,9 @@ - net.lightbody.bmp + org.littleshoot littleproxy - 1.1.0-beta-bmp-17 + 1.1.3 true @@ -111,5 +112,4 @@ - \ No newline at end of file diff --git a/mitm/src/main/java/net/lightbody/bmp/mitm/util/SslUtil.java b/mitm/src/main/java/net/lightbody/bmp/mitm/util/SslUtil.java index 198f194e1..a329eda68 100644 --- a/mitm/src/main/java/net/lightbody/bmp/mitm/util/SslUtil.java +++ b/mitm/src/main/java/net/lightbody/bmp/mitm/util/SslUtil.java @@ -3,10 +3,7 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.io.CharStreams; -import io.netty.handler.ssl.OpenSsl; -import io.netty.handler.ssl.SslContext; -import io.netty.handler.ssl.SslContextBuilder; -import io.netty.handler.ssl.SupportedCipherSuiteFilter; +import io.netty.handler.ssl.*; import net.lightbody.bmp.mitm.trustmanager.InsecureTrustManagerFactory; import net.lightbody.bmp.mitm.TrustSource; import net.lightbody.bmp.mitm.exception.SslContextInitializationException; @@ -74,12 +71,12 @@ public List get() { * supply an appropriate trustSource except in extraordinary circumstances (e.g. testing with dynamically-generated * certificates). * - * @param cipherSuites cipher suites to allow when connecting to the upstream server - * @param trustSource the trust store that will be used to validate upstream servers' certificates, or null to accept all upstream server certificates + * @param cipherSuites cipher suites to allow when connecting to the upstream server + * @param trustSource the trust store that will be used to validate upstream servers' certificates, or null to accept all upstream server certificates * @return an SSLContext to connect to upstream servers with */ public static SslContext getUpstreamServerSslContext(Collection cipherSuites, TrustSource trustSource) { - SslContextBuilder sslContextBuilder = SslContextBuilder.forClient(); + SslContextBuilder sslContextBuilder = SslContextBuilder.forClient().sslProvider(SslProvider.JDK); if (trustSource == null) { log.warn("Disabling upstream server certificate verification. This will allow attackers to intercept communications with upstream servers."); diff --git a/mitm/src/main/resources/default-ciphers.txt b/mitm/src/main/resources/default-ciphers.txt index 2295941f6..027acd018 100644 --- a/mitm/src/main/resources/default-ciphers.txt +++ b/mitm/src/main/resources/default-ciphers.txt @@ -1,29 +1,53 @@ -TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 +TLS_RSA_WITH_NULL_SHA +TLS_RSA_WITH_3DES_EDE_CBC_SHA +TLS_RSA_WITH_AES_128_GCM_SHA256 +TLS_RSA_WITH_AES_128_CBC_SHA +TLS_RSA_WITH_AES_128_CBC_SHA256 +TLS_RSA_WITH_AES_256_GCM_SHA384 +TLS_RSA_WITH_AES_256_CBC_SHA +TLS_RSA_WITH_AES_256_CBC_SHA256 +TLS_RSA_WITH_CAMELLIA_128_CBC_SHA +TLS_RSA_WITH_CAMELLIA_256_CBC_SHA +TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 +TLS_DHE_DSS_WITH_AES_128_CBC_SHA +TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 +TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 +TLS_DHE_DSS_WITH_AES_256_CBC_SHA +TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 +TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA +TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 -TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 +TLS_DHE_RSA_WITH_AES_128_CBC_SHA +TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 +TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 +TLS_DHE_RSA_WITH_AES_256_CBC_SHA +TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 +TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA +TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA +TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 +TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA +TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 +TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 +TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA +TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 +TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 +TLS_ECDH_RSA_WITH_AES_128_CBC_SHA +TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 +TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 +TLS_ECDH_RSA_WITH_AES_256_CBC_SHA +TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 +TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 +TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 -TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 -TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 +TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA -TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA -TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA +TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 +TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA -TLS_DHE_RSA_WITH_AES_256_CBC_SHA -TLS_DHE_RSA_WITH_AES_128_CBC_SHA -TLS_RSA_WITH_AES_256_GCM_SHA384 -TLS_RSA_WITH_AES_256_GCM_SHA384 -TLS_RSA_WITH_AES_128_GCM_SHA256 -TLS_RSA_WITH_AES_256_CBC_SHA -TLS_RSA_WITH_AES_128_CBC_SHA -SSL_RSA_WITH_3DES_EDE_CBC_SHA -TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 -TLS_DHE_DSS_WITH_AES_256_CBC_SHA -TLS_DHE_DSS_WITH_AES_128_CBC_SHA - +TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 +TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA +TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 +TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 +TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 +TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 \ No newline at end of file diff --git a/mitm/src/test/java/net/lightbody/bmp/mitm/integration/LittleProxyIntegrationTest.java b/mitm/src/test/java/net/lightbody/bmp/mitm/integration/LittleProxyIntegrationTest.java index 19e30ec57..2412342d3 100644 --- a/mitm/src/test/java/net/lightbody/bmp/mitm/integration/LittleProxyIntegrationTest.java +++ b/mitm/src/test/java/net/lightbody/bmp/mitm/integration/LittleProxyIntegrationTest.java @@ -8,24 +8,19 @@ import org.apache.http.HttpHost; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import org.junit.Test; -import org.littleshoot.proxy.HttpFilters; -import org.littleshoot.proxy.HttpFiltersAdapter; -import org.littleshoot.proxy.HttpFiltersSource; -import org.littleshoot.proxy.HttpFiltersSourceAdapter; -import org.littleshoot.proxy.HttpProxyServer; +import org.littleshoot.proxy.*; import org.littleshoot.proxy.impl.DefaultHttpProxyServer; import javax.net.ssl.SSLContext; import java.io.IOException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; @@ -48,7 +43,7 @@ public HttpFilters filterRequest(HttpRequest originalRequest) { public HttpResponse proxyToServerRequest(HttpObject httpObject) { if (httpObject instanceof HttpRequest) { HttpRequest httpRequest = (HttpRequest) httpObject; - if (httpRequest.getMethod().equals(HttpMethod.GET)) { + if (httpRequest.method().equals(HttpMethod.GET)) { interceptedGetRequest.set(true); } } @@ -60,7 +55,7 @@ public HttpResponse proxyToServerRequest(HttpObject httpObject) { public HttpObject serverToProxyResponse(HttpObject httpObject) { if (httpObject instanceof HttpResponse) { HttpResponse httpResponse = (HttpResponse) httpObject; - if (httpResponse.getStatus().code() == 200) { + if (httpResponse.status().code() == 200) { interceptedGetResponse.set(true); } } @@ -100,19 +95,13 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { private static CloseableHttpClient getNewHttpClient(int proxyPort) { try { // Trust all certs -- under no circumstances should this ever be used outside of testing - SSLContext sslcontext = SSLContexts.custom() - .useTLS() - .loadTrustMaterial(null, new TrustStrategy() { - @Override - public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { - return true; - } - }) + SSLContext sslcontext = SSLContexts.custom().setProtocol("TLS") + .loadTrustMaterial(null, (TrustStrategy) (chain, authType) -> true) .build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, - SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + new DefaultHostnameVerifier()); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) diff --git a/pom.xml b/pom.xml index 41d88d62a..c3853bd5e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.12-SNAPSHOT + 2.1.12 browsermob-core browsermob-legacy @@ -60,27 +60,41 @@ + + + bintray + Groovy Bintray + https://dl.bintray.com/groovy/maven + + never + + + false + + + + UTF-8 UTF-8 1.7.25 - 2.53.1 + 3.141.59 2.8.9 - 3.0.2 + 3.1.1 2.9.0 - 2.4.12 - 2.4.3-01 + 2.5.6 + 2.5.6-01 - 4.0.51.Final + 4.1.33.Final - 4.1.15.Final + 4.1.33.Final - 1.58 + 1.61 3.0.1 @@ -91,7 +105,7 @@ org.apache.maven.plugins maven-clean-plugin - 3.0.0 + 3.1.0 org.apache.maven.plugins @@ -101,22 +115,22 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.8.0 groovy-eclipse-compiler - 1.7 - 1.7 + 1.8 + 1.8 org.codehaus.groovy groovy-eclipse-compiler - 2.9.2-01 + 3.3.0-01 org.codehaus.groovy groovy-eclipse-batch - ${groovy-eclipse-batch.version} + 2.5.6-01 @@ -168,6 +182,25 @@ org.apache.maven.plugins maven-install-plugin 2.5.2 + + + install-external + false + install + + ${basedir}/resources/jar/littleproxy-1.1.3.jar + default + org.littleshoot + littleproxy + 1.1.3 + jar + ${basedir}/resources/jar/littleproxy-1.1.3.pom + + + install-file + + + org.apache.maven.plugins @@ -215,8 +248,7 @@ com.google.guava guava - - 23.0-android + 27.0.1-jre @@ -272,18 +304,20 @@ org.codehaus.groovy groovy-all ${groovy.version} + pom - net.lightbody.bmp + org.littleshoot littleproxy - 1.1.0-beta-bmp-17 + 1.1.3 + org.mock-server mockserver-netty - 3.10.4 + 5.5.1 ch.qos.logback @@ -319,13 +353,13 @@ org.apache.httpcomponents httpclient - 4.5.3 + 4.5.7 org.apache.httpcomponents httpmime - 4.5.3 + 4.5.7 @@ -424,7 +458,7 @@ org.javassist javassist - 3.21.0-GA + 3.24.1-GA @@ -434,7 +468,8 @@ org.codehaus.groovy groovy-all - test + 2.5.6 + pom diff --git a/resources/jar/littleproxy-1.1.3.jar b/resources/jar/littleproxy-1.1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..d581142bd9e13d24aec4aef32d73611a30f983b8 GIT binary patch literal 130385 zcmagFV~}V;)-71Bx@Ft8ZQHhO+qP}nwr$(CZW*`ccK1wA&%F2bI}sVNf2@_c&t92v zGVSokpDIr5oG}y30YA(839=dQ4u9&S{c#b zGSgGiQZ%#+Fj6#>v(s};iuB7&`zMZ+Gt(3cE|txS9~=Pz}_q|H8rgA2}8__SXM}i1R-ZP28Ow4V?ai`VR&FqW}HC{f+)z9vcH! z6Wjj+#`|Bve``kjzpu#ue|qQXOgWG9zS02yCmn`m&vBjkGBtCA2F8u+}-|MAWeWx*bOH_ z-N@cg1VFh>)_hjH z2t6BVVm-cUog>7;IQmFpHR^|o)Ozahikoy_UaCu6+nPDZuW>?Ht_-UY)Q zJIk84Z9ic?Kya$$m;B>+NAR9}d)BOcr@&8wfEH$rg%H0VEs3GOfNZI@Q4Uswx=F;* z?&F8#dAuB<)$WM0fovt1Lnotg3d-Je%`n0{Ix`#IZ$ct^_8s5P8A(io9UBhjpr#vM zJ{2LHM3)V>G{7LB8bTl2j^TU|E`Z`Ls^|RdD_mvAoiNK<7WVNL*ck1sja+t`NKo@1 zpnt5t|J3AP%jW-4YjUTrGm-@WKrI*mfc<||>z|Wa$lAih)>+x^pPC8T+1i>IIa}D- z{!6_P?_b`^E6?{GQ^zu-aWqiys|Iiy8z9gGi7?^BfQkIjV6NJD7ZN{-8SXBSOkZtL|}7jqk1>4MIm;I`ji? z3sn!lb?7(V90Eq^oClPT#zcZQMwB~;C+Jq*OlW;M`Uqq6Ch7|5^yc4IXvfdCmfl#t zG%a65$bJ%&^wLIEAFp)2zO6 z!@@8c{mK}PU8I$Cv|}G3kU=1WLuUYsdu(eELLgSHB!55+$qw#jJzKMK15dG7}+V?uvTf>De_&m0bnhaJqDk8 z_#GvRxnZ3mvf?I@S%EMWu~_lLLo`!;bZ<#GLn*lkBoY#>n}kxQP?EZA46;o90&(R~ zx>EN9nPs^&m4BII#1g1J6xYh4-LuTRUxWygrC}Bn?_Twzkr$>lNg=>7Z?6gg;wKkJ|#i@I}i!A5{i_ZPWbPwQ}zo8RzL`f!M|+(uUlm zaEYQ5A~dfYhFyeBC07gt>;j=sEWP)6KI}%eVTi(&Q-toD6Ax5DJD!pj8EpX{ZRrS6 z@Mw|Q0mCmYQ~MTK4PHeJkwC3u7;Sh()*(hoTPj75*t++4aM5M?#j~s(@SVc8cuc0^ z(9{7c=8p;Hx2nu`>ZmMIo7EwetOGcT8^?&P=iUXf9*J;oD(Nkvo7Le}=38hK4btB7 zaGQ2@wjJ5U7c0+g!B|hTAgrY!+(54!(w;-)9U|l_*9dSXe~BU)?(*;}OG8?K?#-)L z5K2z2{5X~&eW#&|j*g0m(eq{Jj0#MQ$qCB}3{@2+#&pF4Xyn(feS2H^(2?EE6Ihfc zP|a>?VXS?7mpKXVWlzDaKi{zpgx4TX0SR>JYPD@;WgWRy`R2B|p6XhCccrhBiq6R8 z8pq8*0r%@X&5Po|Y`6N6;3+4}jtV;>*F?Ne>lpfqh1wiwr)xDgEGT$Ldmyjv|)# zjju4nxyd~8XNxgDBTIn3mqHmG_U%(BCs2UBf*XB(Q``93%8o{JXk<)4C_8d$GUCIZ z+*+F5{ma(KT>begIJXy3%(tx=*zp_gt$P|kzo>=gaU@vhcg@Jj<*H3Q(aazSM@ho? zT~(;VWAQ9cJ2`SiyCc{jhEwu~JalSy6ip0hHbB}}mrxYgCB%LL0tPIDwgj3SUO}Se zjeVF9WS}EtF4x3#ln}uj5f~VjQ#R{5m-j)Pac(ec;2?wCTzhcW*B1BquVZ!%TnJ}R z9uO;UFEjn9vL=Re3#;EP%+Bte2=|gg)fm*+d9{VFNlK69Kp*S4!za*&f7s# zhO&kQ0S**=|1^0>)9Xt{z(tine>loAJD0T0EG=P>=0idWHIX*5m6KL|-SGCc5zHf5 zKhSQ#k2HfSJbNi1px?3d+S-w^YCBqLTEBRLH3CJDE=A~HCi7T4SzkOQHo!K!bFO&> z@_yK;PTGgjIU`;v6gc}B;m7V7Uv?D@Go|}MVhafiHEbKuQ%SHM0ySYF0?QDOZrC^` zbf+gdV$L9N^3ZI}2g!3Q^sWHPJXsX#A%PM#hvi{6Rp!v_-iDvemv#qO`jKBhEH%g2HB3buP%Ud6ACuk$5?(8W z8lfLSnZEaM6+%ZXGWBlVZV$s&MF^p<8NLPGGLNpHa~46JKxIf_=)*$WPuI+-Dq^&u%`sq|rhU7zt9S;n~TNP=e{7Ji00taP!S2}%0g~%V+phOqsl(eQ^ zMk!*XAoS$yF=33)Rk?N9jlAI=$nM$6;E=+~AY|1svUPaz$SNN#yO1+VC$t$Y`Pd5G zMl^M7dmF=iAaEzjIbM?Q+fZ??6yydnZ@*`Oca1I{K{VD zKM6$hu4sS&7bj%g4g;^HZhPgzNxp zHeAl;&EWM7q0L3JTVAamSzvhof(9qh%;yI*(QPzbnOmT)44z2cDR?uPoVhxXyPGdh z&NlE=nL*RkRsvw$Rn`c_`;zaI?;kkr!Yc{0|6?Fo z+q>)H*mJoI{838z<9uIB-EyF@J-tbc_@RL!iB5p3o>m=4F(3+yNKac05{dY)fXtGD z_B;r#nWfGavfvL}oQ?v`FhDj8xkX{Xh&&8|nSKri+an<^?}OCXc8GcNJmk{^hF`yv zVVm?k-Ke`&c6Av6$q{!JCP({O=}LITnuk>t`iu6{6Z0xQYM`B!U^y6ZIZP^z#r-s& z#K>8@w)aU4(owaN_-FCPY9$A!cxtHT53lc^HZ2Qf3o9A0m@9?U!S)6XOdCF)iLIcUQ^7nf1(7m2r@U;jEV^XY>D(5I-#BwiU{epIQ>Qe zQ@S2!VP2MhBw0S#IBj{KGPfyb3GY`i=P7^EHEt|_=iW^u(@>Gp@)Qn(b1S_EH92;<(Eg0J-hjlue z=Fk90g8(1#Lz?CWVxl9%s6uUvKntMH!)MOJB$SBAYywfsNMN`5*ekYO2GA{FcGhrT0jQqebW{Cz2cKKo1hqa=w(3?eOKYNbel2%x zqr**7HOAa5sT6IhVJ{Gg=6 zP3Bt~!K=ePr*?68c8FFMdZaD$rHDockzHaF&AkBm6tbY%j^r$l6-%SLd{J|oZx*%% z%@etUrd=GR7qw@8D5BFnjF$gWk>5XZ0~frrldC_DWnoFyIImN27?Pi5_$`YxZ8tKN z`IbYgi%@rY$g&zPWsCDLQ{`T$udvAkB#%^gbqMp|^|a~oQ2G`$YxY}Pr&}b^4Q(qb zRt)D5zUhI>B$D=z_}-mqmkVz++?ocOkVIdsPF)0W=UY-g#%I%86zQMJsJ;j{W(RS! zyU0E!byM56MQlRWQ|*GN%>&p3IhA=sc9mOk&K>+U`()_HKLZN*eRD6D-l#l~9tfVg zDu3kVQ7+U> z9`1_yisQPxI$QeK61<>AHe}-@IG1UzWV!eqTBuYQB_}TzRdk3R6hXG#$u9@eZmj4?%w?axZFkNZ`+Y`gOEjr z(VW-Z-7}b0Y*K;qlgleoK(=vIFYSVSo-ydmP@grKhFHgR zl3FJ=)ySDQF>di)-Fv(tJYZV1_???E*w4goX+y4_cx>WZkWc$V_M3YCztgo1lqe(99Z<7F8D3V&!yaYy-L6iOhLpiq52wgcf5KVk^BITZt zTTiBEtE^8!w-|7;v_o<_S|~~2uB~Y9`UZ$hBL!8{l~xx{Qr>y$ zy9bxb;ekNLzOB_|9CL+Uq{$q?xcCGX%tA&Iuy}j&({|vU-TbkB(2m^$ncz^aFxDFhoKN5Z zTDh{VwbD$i!jP4M*xY(Ve^q7QCa9g30At4C*zXh2?1V?dS>k%`N$N^!WEaZkev`ib&EXD{atkd{vB zf-yz!`YPiJ+PVC^DPs)a3#*cFqnCan3{l0ha!kL9wf{_{PaXNcy;4+eK=3D5YD+Y6zEh{ zVr=XxEkkW+N0kfqz%8K-Dxn_K>~w$DmP%?g_Sk*E$@3<7Zg_R-0cc4o#8|9?l_v=# zcrACsV;Dmi_)xh=z>PUcjgsFBjvS0s6WZ6#OfZ-9dl;4nsPdb<@J~5+45)XI9g0YC zmyMV(@Nx&4v~$T-%n$0){Ky;T;uNpJ^!|$`G1V(3IGtmTEwpRnEuGbAFzm~nqbHzI zEF0xhE{;4j&7@$}>S<;QpQaH4FY74CmE+BoY?pRTPUkQ|D(v1~Rog6MfeQRTgzN#XUDO2gUJ2`@C&>M57n5 z&K)Y&2a8wk)uNkY6fbK6QgdmshfE;b+faByDe-K=6wRJOJG&eNnkz@S0s;NHpmZ!! zj-H)Ew>fqPUk1HjQJa|(a`HCbjUDUl=37Y6*8|QE@OR^@Aw_FCebvQ}g;? zJ0aR}tmliH>x;{?){D@CjFFObI=6)n4)4n|s)cvTr)D0tmE{#EqCf(nLopnSSp8FF zMHU24VhKyCiA%iXIX9HET`vsc)3W8N(nAzVwjB|@^tsYeFG#eEseYBEg<2cYS2CPG zgl%>Y0GU|JFS~5WGVDpf$QW1Du(3TW5`xN5pxIT?ave)P<)(eQE;_0qJi8kGRLH0C zcBrInk;mrgR=HYU7l2U!85NN4DH^O$uo=n=PBnCGZCMT%O)dy^NlgyM{5*ej=LiQK z@VZH89|K|L&4YZqvG*JCFAQvEe;=bcBiW|MHjL-p@n3(OQBoFNu8Kvc5A1p zjZejUEEn=(`qxy|k*b*mZ%o+S_MAUTUV5VFl}*vbJM?85`bq@k)7A;#L_(fw%J?dz z=^2JO>&7~Sbj!+`(i2tGfa&Pc*@d?^HfVuElZpZF2(+;}dlYs5GNY~C`1OMB?7{S$ z&dIL-nHofEm!P+LT+`VtvpcJ=eV7v(T)f!WNaAf_GcP(W!8F9FH>-Buor!Dqr~++D za*=UijkcAOOk_6az66tAULZ`Ld|H$r4&Mt5YLDbXO-o5R9V3hed{=Vrn6~Y6NGv6| z#?JP>%oaqFcW}?!shoEa&fQ6ocLUEE)Hvtei`8>LfQK$iUI_D07QREq)fZ%YSb^Or zOa9s_6lZ=~xTu0tS}%(OBH>F$C7PfPo{D}5g;+uNmuO!oCH8+Nts)#orQZY)X@7#~?GixpSpz&01GiXGt7w z84;%kV?9YWX-%a@J!Y9gaE6;K2uscej^TZUp%^LZQr&Lm5~VyplwMdSf2Tc!)vVlS z-puaV_CjEf*DT(M3(M+|O(Z(0%=Zp?j*5_xAPo*m zv&%Ra{%jH+e0Vg^vd@D+Y#z*WZ3ymTs12EQB739J={|Hzs)ojnK4m(@ z)OqHuu+&U#g`SV<@6$$?7^xs$I`iP>Ue7Zw(#Q_RQ^Im9vW8elS^_6o)YG|DUCur+Kl zWWO?E&@yS9`7GIXuTCBs99@vLm5}cgh*>t1d2P5%I_21vt#jrW8QBDa0Wi$LJwxn| zL@sUtzvzP6XXhi3wxo{S45n~hT=f#=aFesgL^JrN*=tK}LVX%*^)R#*2j#}8D9%bZFO}lm?e>|ro_Fm)W5~GTVmf;mc z2|Gr}_260;kHL1xi$TLf64w1X)Md<^RA@x@Rnh&7cp(R~?3=RF7~}ksY{J#rKTgZC zsmjG~f=^+X=*CMaY)c@XTw9nu1GIU2NUDu#COdJFEqxN$^HI5iIFX~+VWmuoa#6)g z)EJV7#16ypl&+b9Hs{glzw4SSEOjTOHUeXjaDHeo6{iciH8vsgT_ib(!LFs3--2Wf zid+n=tYdZDDS>iwRy*ggt8sB?^H2z4V=u5Hu+z$Wisf@SzbU>iQLaukoNgQMKBcE5 zMm1!LWVEHw65mxlvnf& zLaz~ijmO^Aj~C`IdK(skw#2Odl<+3`)Rgu<@_;tD*sz#|*g>v)_}Ci48GSlJBSM&B|2yRM`w40Fm?JqLl0`u+cWq!KJUe zpbW^$5SA_n!;)eQX5Op?6NX)Z6S2v6HYO+@U?hG2HR3s6#W?|C|5O`-1j>H>@P1Sy zBwT*JTA=B5i3t53bFN;vm#z+QqZSkz=Ghv&tmZO7JzEZ!+!I_Vy$ga0A3{;i9JL7? z@G=`dCh7Hfg6lN3vwpu7$cIKtKUsGJ2~ zqg+FyuX{!=J)I@sspyJtX5?{rM{G<)&5PN_vjF05*ji~yGPVZep!*i_*5f=MIw6%R zZ=J!eK3!fob?FI7%VKR}J(En_r)eFiiqQ~JB{v;V{GCh=C_<(o?$G7=bY>ilf(_dY z!dWvc!g$4yS!e!aXhQt_bsEqVs;R5dziUO^13rU&G zcoC*+cYbpbVMS($nr83f_xvsu=IS#qT+m{{q~BMxENsCPb}c{7nZ-RJ>@iby^sWe$ z$gC(jWG1c3;>@%Q%qpIAlMg;PHFo*0>wa{F87*O(^)2X1R>f!zIe6=QAjh|uAekP7HOnNpp z)iu=`-8J*z@Pr;N3-r*0OKXqlt_=bmp`_h>;h@Ym6mJFtah|| zZQdL=5XSKaF*|?v2~bCMnKH8+3n|pkVKADq&cN4CNH2T?C`HdtY-C^^Y^52q2;U_w z!mvuvWQV;K%|g+7e6zkc)PE*7T7PC*#RB^n={d_h?@K}l*H&t1zo1R8tH4Ju68dN% zl-4m@Q2`kBv2{QO7uh-O@^@vfslCgVT5$EPiBdVZu>A6dSSvnePCvDuY0HjYFLwqt zSGJ}$m%DOY%6oZRRa*8&IaPenejj0-x5iZR#f8*3c;4^1u3CNb;{E9K)3*BR1^)a! zK~V3j3nqcMpnL(X?!c7N3q$_G>$h`!4I+|z5|X?%n9uwi@BmP3IJX?_YzEHXnjEq| zIas$F21L)Gg6$`-mK&?Z0LMp)(wOOZb8zO1<^V8yaC3FC<%{M5IBMVym_&l>C#IGw zZTtj~9(Yuyl;Z+ea%wW+n;z!_^5}pYntswaR2aVq+ECB&gK%8ny9nwYikF*#f)yYL zE8Vsp10+|hIZLm3B`^ro37UJ351HE{K$#7ZHV0;N7UTsnV9sOKgr8Z>w0&DHM zJjgnxQ9rZ*q{jYbPqYo#HekCB>NePOufh)PHh^>wzzqsFSaW(ius%R=y-_g9cwEf^>bLH~Pd{e+&R7h-h(0n)48b-jnJ~#my=LIJ~w9G?v-bmQN4Tz0%Gy2=?@j&JBGJM&rMn%H~ITe6ayucZt z%$NSlL*$huB(ZN);NVhz^9O8m22CXVk)SXGcf4j+1-v?r0vqf|rADP#{#qZ&CMD(1 zYvfF28~ptj2tbGobLJ<*D9Ea^Zueah}A#2>hHsGmT@H#X{_mM+vkz-9w}2iR{A-1ooSF@kWSheo9P zQKSb~s6l&&7xz(Fp>Iux4sgBq#zgx8SrL6FMF*g$adZta?jffF+0I#KsUTsqxAavWsTOFLdt_t3lcS=mywA` zO2nmDw#HH$!s^eMsYOp&Gd$-rU?DYo9dmp6|nJu z@(S6BO4THcyWGIV41x=rx#s=KEM%5}AH@yPj`1NoK}WW@?z%RD7h5>|yCaX;@k2J9 zk8@Jsq8sxYGeBogF7*ZAG61&*(pK@lBbPQiiW3BFsasnQ8pDUnyC#A^iW@LQdSgbb zY`$yiDOLSJJe1Pxfe67Us{5Yzh|@fY>FOuIrAL*#@jais1NOrMaSbAU^+$$Nr{u`F z{?&!eI6rSjF#hWrbHut0a8Qo|uJe^*jxcikIeygEf8m-mJ=jq+Jesv%JzUxpt_hew=()kysh-iP zemOv2=P6(ZOcr^Ayj>Yeo04lBHetjhu70T0=m;Eq<5xQeni%EWoGW(VZ+QjwMjW{V z_;TLB&%Xh`IU4npD>rPxVRB#){4NYrlM<}poNan?&LfER9!$~sYpfxSmKCk+!0nq= z*&=1nrAKd|w*a>BlgP*Zp!JwQJ46b^2RYi=DT?uwwHTi^qKhQ!0J^X<-6S_Axv?jy z7kVSYmcuo^v`C<7)0jSk7h-AyQGFm!l;J&-dB4iSv~R@Yr`3JKo_}5s1i=ep@W$P~ z_Y0-=tZoop{oatwHC&|1^LQ{yd!VoXV(oyn`Zz902id6lbyo&YC@zIk30~!jP{~+A zh+s-?Kdxem@35~mCp8hi$+kjz91sm(X!EoJdkUX`a!iGGEI!1xc=4B_BlYJ#BegCr z8F_Zl@zd)IN%TH!NUiNtRQ_meeOa|gVj(=0%Ao@t_2?^#vM+jV_cLwDm|3YFiV@9f zVl}RyEBTcCE}R;hNCqF~32-~os6E>81G9R+i+ZFb4W(WQYLFxh7{wrHeTn!rLex5G zJfsC<+f^KYCr({m#Y7(|=cTP}KuxD6Sj1j28d@)AHkNDNG`QzP^+bY80&ITl0ln6QGw&R-16 z6VhU2+xXmgW3&J{Xq)TY(}ut4m0(FeDZFMuK5>?ga_UZBO_$uxgS3)e?!xHKWY3{xX-9~&l79*i;Y^E=M^zkcY!SkKi^fQ{tfxD?>aPqSr+~tDTI);H&31N zLxCs1;#MqdVV(N6V&Go3fv7S?`@r8YL`jHB3vG0{07b!nSIB!9!_V-D^~N!NBeQ>a zM!0~B+(E;>R3qQNm7ng`@93@e+onF$O_1kRhzPD?Ojr1u0A;BZhz|_ZoQ7dE!&Y9KG!Wp8^Cb?$lVi%Cvv7|DW+JL)niwvN2eGOwUCvL`TWJ~Af^a{%W{B0ep z0(?E!Aqo3~i<;6Gf7>D9Ud)m&8SE3wR$!L?0{1}an)sQxv#xGSxEHS0QnFeB^j;4C z+3|+6tkX^$d|X}8z|h5q=s=uX2zdr^PRXSWepb{X5H<~T z9~#1LP}Gy|vgGT*;TP=m$zI6P8?gLnA9%`_K$a_}okbZX*4}8)(7f!Jeq>_98l}QG zZ(wpOPGqYcOhPMfaSfgYS9tR?kxf{9t5|&NkoZ=S_?D6Q791ay zjh%X9Bj`vNr&$r?yDM>i-&p)OO>xc<=!wPr8&f%Qo=C}Cwv2oujle`Ki@%XW_ny|# zH)K_KTGjBPy6h@SdUm!l{DE=9bSflOnRXxfm8c2UThuvKcku3y z-GYYuFVp)pg{W`X$TzC;UOge&Uf8nVZ1P3lxUA)LO>Jj+9|If*BhWtzjlV~^_=*;$-cXM?D-zw z0ll9GUI~fedEgA6Utjq-TsN`SEc6CtKVxKvmgBV+U90)GWl9sj`);ES1=o|g?dlBw1jv@gs40eb}{OMr) z4i7t2EGwpY(rEN5Z1n2E*L~33nA90|AP${6#~zJi1?gjd%;SP@fG&y9KX({!iHI*2 zJG3k_gx-^P2X0Q7mpjWUxe!qWE<=6UARQg{Xc!`$M09{K;nxWvRON`dI?-sq=a)|_ zIyj9X_uDYYIU*7P@wRjibw)E>JW}XF>V7d8GOw*Eb4oaBHnyt1HbB$<#y z0vKSA?q-u{g+8z>_u-3^`eJv_5`;#!^DO&MVdZM-4 zk=h+F9gbX%C$Ptpw8xV<<0*E8YP})a9dI3ve2ympN{5p_B&U-)3C&QV28cr#{%Z)o zr+M8qOthe39=kTb%BHucsGt}1u7cLwhQhbMgzmwDeBXMSeLRw;xADf0DUe=KGuof{ zaD(}t2ew9HgYL~HLBC4aPw2Z>vU3vutOeb-`MQT8LSEeA2KS+H#SG>}D*bNC*)Zq* zA;7n#AKCO1Jzm6o?=h4Fnwxfod3)r&n3ryD{!vWAUmL4Ibdo1rY{t!+4eBiW@8P>kYNUx;M5)L zOgI*xX--ZbQT&%;2I-?BFAnD*X&Eg?f=7rUfq&+3Oapf0D8v6y22?ce3M7kfS}y+7 zsoLaxVU_$mbp{UI18O$I!43M^pZ-K)|BxH5^N|kyL1tg#+W5m%{jE@u!VnhS0;FdvoJ|YHZ*eiaPIib6dE6oVr3t-~U^riTq%`+@dd1d$ZgotHY z_evLV+9eo8NAHjnvU_6E&8iEYgCF1}&3t?vRiqU2Clwnc&wxcT20NaRRwrztp2`5f zkQ6rmrfo6TofL~-7yg=62tN_$og8+IyGT{R7aVVc4!yeW+58HEmO0w~f3 z^>tBDbUEM|jTHxzimFDd<{oy2eW(E901ch6pjVX*lW+t(p3JCMpAB@(uxfg8b&}v< z3GFl`kZW74lx=)E0kdM7FJe}HFh2&JxhhE}yfhke9YO@II9L#ozR)E$63%%rG1kt- zuiJ;m8j)d(D7gy_5$%dbXW@rubo%|NfyyJgWF(!tU~(;xic`{#EQ&vJPCkxU+>T5- z#iZY<9XgtiO;H<+sR4?040%7!G(e>`psE23r~zf50iHI_lIoiay%b%{IQo|4j+zSM zUeBBvr_khCF;XWL!`yrU_aK+w4dTJPnz`OJ6G78JuB|WaaFbuWuNFKWPY%*%n zb1YhXXPw+DL$7HY`tYcoPT@l@W-CH*-Dv89ENY72Ek*4u75yF~et;;C&;wg# zE?8z-|Ip%rj?>!~n;f($iB8_#ieAE&(o=|1RoImI6@F1k z#Xe428D~5^J=dYkD3fKxmz5k7H{mnAGgf*HriQE0_L@Zxx$ESu$Guc1RH_#@bq1zv z$u_j{h-#kDCYaR?WV|fRR%QbdZj^834VK8Tl5bGj zLg5@op+-__GojBk-cEj_zm9B@v@UIuG_L_uR46(_AGK^Jo3uF{%c)Pf6~i1`q=dqr z_x?yvogB9T9iy`yqf_WWZWCIN0cd0$N(!^ipl*(dAnSL}NHEz1E`)&!19)Nve`1Dk zat42LhH#?ii%Wi{PVToM%)u6Pg84Pg6wd{eF+uQ#S$nu<5bTYF-~)wnw#5qKL<8a^ z141&*jDQVzbcB#?OTeCWmia2HdIm*bkN1NaC2mZaB7KN*zDALx0f^x!pu-QMB zEZPFF!T#zbUbds z*AFNOzQO_)Fa-8j3M{xXmtw(e0vJrJLHz&&HYcjWTd}#veBT#e}DW{TrG(HKVJ)Y2P-9^Qkn*}{ zj_XceH$3!(qxS}=N|RIK4k!cMt>d|3F52Pa+8`CNQ4XQBff%t;_fFiR$lD|qe2T&OlKmZybGqH3#Z}}Qqhe| z(G6U&4Xff4Q_+n~@l~bxwstO#Q`FCXqS&^kgIn~BcRJNjeeOl^0G^7(aW*`Z!ZK>{ z0Y=+?PguCmMvJY;sLfO{!6T)6QqmgZvkxiedoLkuqtSHJPIqr^l3th6ZuZ6u<)LUh ztjHUj5$APFGy|PW@^qZ>!%M6k+aj4`m2u|EEM>u@5|yL6A%G!`yzIAlIEGfReIs8f!O~sQb2hjkb7%FdJ~U>8`WduY zzuv;ui=kDo*vD1*Ky*H-rIWJ{H!*%)A*{tX1H^`&&UgoT+8ICdd&zKqe2n@f&AfvA z&avrjns)1bFcfG_4JkI}y6-{SLp%H=^wtZ#n<@!bd&fC+9yi78?TP>X`KRCVKV4n_ zU%!{@CPLlQU-#mMH~;|KfA@O{o0uB7SUZb5JKO)$@}*?r=xXBlFT2+bmxa65N(0ka zV;!~Ln3VNcWE1&5ajW&%h7f8Zc`Oo@`>)m{eQ-=7A-cYk$K<+f%zYfnq*{Ykwm^<1<9<9!%<){PdfN<};n`wjE`2 zzb8ZeqWCi%Xm_Zk-CeWKW%}g-+Z)v8*CROWaGOCyLz_$HGBpUBt((i;0&+(xR`-|%j9NLfkeGxXqewgVO*&3eH16}B! z;EVU==$}&;(Q+dHab$DUL7<#sAi^Oaw0OvQG$gc)WfYA_d1`wK-ej0ps3s9(s3?tN za>15jbjL4yAY+$PwWva>S8snuA;7C~_245$V=`n8N6=GJ6IUge7Ww zC|+UY$P4XtWQHN2wkRaW;fTU*YE#6$VQNwnRwYdXgp|SBa7qznszNXUmyhpU{+u}! zXwN{1r8Un^9Rs~`0_4j*^!b--o8KU=9za&iG|14P+TRcuF*H{QkXSAJayIj8J@#TY zMXO6kzo^C17j`ez+h#S|YH9`=7B;$lwRD7hb||*8XKtQrvT$OyGB@Gvfdy@IPT@ke z|IC}F(OnmaWMP*fBsc9y@W;%ae%Qo3&s=R`wbs<=ovkmg%c{>p17P7x8_tJ%j%|Ld z+Sts_evm`>=*r|ty*cR&m7Xdg_7Wo3I5D%57FX=%w`t)H4Zb8fn0acOsHxA3O* zm9^3!-+y?SV{r&{oIL~5NPpJEb3J>ynDs7uet!70*c8PFtMg+&f`7K~ zhpVG4ZfC+3FoJq|F_IsgfpeRM@C?M4O)adT+=EEqDmepv=gQY4MY7KHEFndDlR&SO zb?Ee>H+SkleTpUg4iwPq=^MLxZMHb@&tm7{0%fs@@Mm_4pu)aDEYcYMG`IRA`}mv$jT@+}7=5LZ-8u*N#n3t*_!NSX!QHfdnd> zCyQ$2{O+c%Pc>_?&}yw*jMx(DbH@w&_ip^!i4}1vtLGO_fvzDm44b>QPA-4etF>XY z)gVUs==$g$f(?cSz)~=bYBe#%2 zKth`og84{fX;)&}MsE_RR8}!c(Zt^ig-l``SF7MwUT^MeqWpzsJa%KXy{)_UmJTA^zk)JSlYvbT|mTD!!yVyJJ6E)#%(L( zBcxI4i&CM^O1*)*be0VdaLm(ZJQ)*CKyvuIzQ(T%gwnQ92_slKK1f(1(}iTw-nAmj zN!lX0DTAv~bQiBu!r@A78kSgRjxY|GX)Mh?Rv*x(^)XfHY>?J2n0f7HouOAlVU8Zn zqg6R`W@jg7AWn5NNA50(O6Ws8HAYaQ$#{(Jf}e~S^Vm3DFpFw7upU9!5@~+N?+{2S zw{q>ncqsbNNG!kfe0Po}{Zxf_M5c@JRuP_383qudQW_=@qEZ<~5XuUApY&zE^~xcq^nJ#s4Y`8e!JN>t>Y=ny|f|FIP{p z>n;x>C?pdqtK9pCWH)YdDeO?YqGC7Sh}(>E>1OH6d4Pt*w~2~`f&h|9XG@~$Jo9RC z^SHi3kS(9bnUZ_Q054>;S+{>_=o3b`8%49uu)0>5m)6XC1Scdr8#6xSVkr<;th>xO zic3(IuLc9+Rp}hj?-|OCZKx#EO()%lJ#gw0_G(vKg>zR8L^&QhIu=66cEM#N9;&{{am8d+h(>?5(0I*_Lfl+@WxH zcXxMp_rl%XoryaI6z+w)J5022cc%(>DV)pNd!KgJYVE!I&O0BOEpuefoIlYcV)Tg7 z2h91D3iE^4Mvarxf^D=<+?qp=?@=dNj<;qp=Bn(T5`a`u^NQ@|`DrvBvCT%6^(Xg1 zX5Shk zNQQ6;yG_I}fHodIFP=hpEY9BWOMP^qD`hD|l}g=Fc)bMt4Ekw?Qrz*j);H@7hA8wV zyKRxILSwnJGiZ$ZO4v-#;Qt;tk+`9*(_yJ^MZ~_NoJT3`*1TOf4c@$6IxWV$T|A9yOm%N6z3rCb!f(L9 zO~^g8vJ$abA72GRr-5gQ>5!0R5OA!Nk!b39w}5nH!3x;=Ca_Grq| z4xMnWU51Y16jx^$_;|5(ub-GMg?JR1Jx72^1&)5{-?aeBwJ~8l4KKVc6=P(8IyZup zx)%aK!wWZ8Wmm^bG5l~B5~BxkTV+>5vm<>6MS@;ssJu`k{BnSd*6&MCtqD>Etsgu9 zW41Kf<4icib3#2ussbn{jbRuHiV-j>_Zk_a)#mlhs!wqvy6(!$fz}05>S?{~$u|Qs zOWiB`fu3`pUBgZ!i&jw#uUyYYuQVEIwmiC8d-U-~BkH+weKfmFHi@9r1qGG1SW{J; zw|&Y>{joy_1Mb7)Lxl+*QH8`li0{kiQW-8&0y7BlJkr;S8F8T@(F$(4nd153FO%vh z=p-6ps{vKf;C1I06l_N8=Qls!+-!qYqD3<|%6i6BE~bq`>vb_YnZIIm4iQEVs@JFU zS?(W;k3QBD4J0cBv}p5pBd`>~Pt~uUaEmrrZ?-t3FH7|$=ekZcdWWi4a4TgOnRIif z{|d~dow5Y#P=@l98eoOenYkW!w8%HyfobSdGpagsTy|}tz#W-YZOOw~r(s$Y9wLk>R{lJ*ow`|s&W z=>Ld59YU;VQ`snv&hkFMBy9gyY%f1W`JpIOzKCt+HMM-r?=c2({=hs*+&pFoq#8yu}9{+-_M-5s6TXb?rUS$ z((ATT8Q0$(e1A^HUazC+H>$MeObu9eo~vveDPWCr|E3yoYU*uj)Q1T#Lg$H6%@Lt0 zO~MzYCR&W1zY8kPGhBC)4N6v$q`KBj{P z91;J1mZ}9R%1FRbnt^j1B_{JTZA`|q6RZiV6I6u8Ig>6n4=*8$V3DPsytB81jRKA4 z-k1NPF12uVbz|wms-{vZW8RCt3>_lJu4y*amE44_d?cM zdY25(xSBaWf@d>%AV8Y;U@r?MitUd;E;3P@#glFucffF4PD{J5fPpa)U0aVH<)$3T z69CbtLMSV!vs>WCt~{wJu&8w!Zw}3#b)D!~&u1^*+4{y5c*GVu@SV$hQ?Z5_ko1MB z-Jv?+t113_4X08h5fLxncTmdOUcI75^arWNKd@Y)8niMLa#B6e=&|i9cm9LCL$K|g zqs)g^;JJeK=~UNTh(j{a@qr6{p85Qm zeS9(<&&$N5GNnlv-p%`sk?2E`0oA5`qv@j?=7%~qgJC*|xqQAU-|~ere^ld$9mfVn z#r?chqt^PuklUy0K<4sPkn(-wlrk`Q8-7UB1RkD}lOkuAZ!;u(pGy_7k{bkXXll0G zCyMx)*HRi#YZujHJB*_fpIf5z<7|(pvBm8c)P0!F8zLl+r+L&Tr<@B*2Y9qm+^+YH zb6&T%yn3tN!`>FGI?0ScZ3RbZ_o()&B4IZt5-IECqNE5<4z60MyZQ)CD)Yo~?c!IK zvCf8jW(K5^{fbG8V1xtF+jX9`Z8i1?&;+?wZzQ&`xKTW*3v6^)Dz3$|Ghu2Kc7J6P z+rgR^=7E$}?HrFJ!GCYMrrsmebq6~ADRUb5wNQbOsVp34E}DfIdm)TJ6T zc-laBkQ0%7#8|d1bpA7mSH^IUqCKc>*$1K*`I3W2z;@q_yoxB@orLO-`5QSu#p#b-933I}>9J>TFOj8fz~$((1Z*ont)U@6 zW+^;7=iA$7C~x=xjy@)k-qR&LFOKroqIBzjU>m02<6WT@e*8#&&r|tO@REz~MZ8ot zfLy(D^-3oW5b4HAB>9*QKQmV5b%L3IE(^UP{HCK0z9F;I8}{{h#|tZ?PrhjRiFjV#zc+)I&L6F;zRI{&& zx@t0h4#f|Y71NZ}JP9YaGNCo3h)*0JN_>ejuctxVeU8?pwRVK9^GJK&J-6@3wKuL{Av;HpWD@zGGvcqHT$IHXYD zSVUdT2L)4lsIP>0*dM+;M#`e5Jz|L{Sy(6M%bo*`&PTCB#=w;&&uPe;%E6iAGUxf= z>?4eZk+YdWs8oBqOtCE*oGdY>2t%Sl%bK(hgEkEXKr|jQLCae76u=YBnWpfAP7Ag$g*X4OP2`?gjp%f1R6PO9Jl|N-0QaH|mNc4JhPH z8M{MYE)z(RP4YVty67Q>(nu&bYB8N<}ekzY0GOrg-T z^G07aSvO5%Xc1g(7Dw9={ERE0in<>XI*Q-?@x$KqV&dv}U)GGLKPDOBn{h4KgQNmyG#UaB(aMZt} zPpC7?iSSsJ_S&UH^$tKwe}GhZmn!9_b`XW~sBs07GxlHVqnIu$WvM?#*QGS;cGKHp z;}a}Zp{7*BETN0MAy)|z$5B>BOEmZhCe;yptUS3y!2opWky05fViG@(sHKd^_F_W% zF#d^zDnmIApyixO#vdm;5^D?Rc75?hP|_G;%tXUDiQK%{t~F$DQkvrUuH^jhJ@mdf z1S6p`zEu(O`c#(Gvjrx;6Uosc@TT=7B=9M)t47k&Q7nI5S(Auz;-ZD5kcOoeE(Rq^ zKqtdkvyq#z5{%W4$|WbYVv{Pdh&xD23T`5M)8c>G+0C67S`XieI9)`P z&#$6eOdH8*8@0}-R~)mssf||6F;${^j~W!Gugi?{GZS#qjGBvk6>Y817!?cPT~9&v!2S+QjSx8r6eSL{L>d3 zx7|PhM!{#%504t>MI`P{-V#X!zPa%zL94nzXsKBDIcwY_d=mU?vmfu1(UEQ%Ueaj* zvpH34HY$#eXyEwwrwK6&$jivCia2PKXfB=1#_@cZ+91|0RG(`oZal{@J}W!7AD)sP zveAI{L=G^vRRbK*p^0SZ&C)E9k`MH30a4SN#?>pf_&(Y<-+OnxWxj{(o$6B!*5W5yr~UoF;O^n$?L-9PXbfOUU_ zs2ciFfRh*3394&SS_Nr4YAbBrN1w>U;aeHvI-0;@%rF&aXJvoju?uuDSw!K^(VsLM z?t=JSY0-wUumVRrRdh;dJq)RWX`I36%DLn@_W;;MxcM%m)n<=8Mb7vg-r$9#(TVRK zs=t~oGED%?07l`iyS4*{KO+AS<}NcxTYbR~+XG=h(IWK{<_@+@5G){UJwF~7SCnmt z?G2`N0L&&k{9qcAnwph>WF#f%CpOdICNr2;XW~Y}CgqCI4XLYN@If2bz_t0@S6@Vn zy;J2Fp>W7YO6Mnoy&Jv3U#(-)Z#+%=zD`i@s1G}}J0`Cj8-U)D#@C39#>TYxp-U%{ z$u?-kK8d!Bw~3XfQcZEvX7N{4ej3!(h58RoxPxzT#NXP~`_0LMl7bQZgZ!FM%65*- z!={E^cxBs2KhQ?it_~!K8j+t`T~P`Q#USdSmg|2b4&<&IIb<_GpuV`zdwFD|pFwyb zK{6jEzaxoRO6_`!IlZg+HZZ)fX^+Bb?LaeQ358KSdOGb$IY*Q_ETqkD4JF%=+PU9> z?De{D3ZF9T3peRwbL@sX&05{=iL`}@9?0=zcf=x%{d&H_a3xIUzmq;sWn|uj^6^EH zdzNj-=s>D5nW%)`#Z@iPc>Q(zoGx}1F7mjS;?z&_sM_<3`3x`2*8Gxp-ncE77b1@f zf$Pd%^!hPQsxnfF%f5W>yZbHk#sJ#34}=3+vDDY4#RRu#jSKJJYv%--^T->{3x;GG z7cgU4>J82yxO*#s=~M3j?uU`Hfz2Z0Wh5Lxa?rI}hJ0+6>^V-8R%czGWP#|9(QrZ* z6pu&~m?+dXarqGcLUadA&B9uQ3oNx=V;007ic+AO31=5E?XJ0Tgq8$G7sKzqui^}f z$hURs6GZomV=4Nk;DX^dP}v13&pAvsPD)} zU(q>fSMu}cb+c}1=vAD+rFJR#A@LCLgLz~K3$)F4U^41pvk(()Q1_%V6t zaGuP>4%F%wLE0&CR*jE(n~Xa_Z#K*he1PA$b}a-rl7jdda8|8@sv=zVB17iufI%U@ z#!}dERA-{}$VRE87~vlRxbeHFyhE1S^ho(E?i=pwn6`r(M;Dd0CW!qgtZ|ulAaY5R zp!N=LCfg9F<;7B?<`Z9(=8y4=*| z68q9{%NSa~i1Utvd`PpIIB11@tA_FJ)L7)uRC6xn7_ZQtTskw6bB@WQXzHlfyUr`6P$y`u}wb5Ev6>P*7@6uKfCW zI;H=-tq#gHE6`N_yrnCq(ka7ON}*p^EBU-?*83c@P56AeWcb&6jemV=YWDLnuhw5b z=KpK(_OC(4L>Wv6gGelt%Ly;%3D0a46djMudmOD!h{Lz zR@iZ5@#;~2-vr=L(5>X8yvobH_w=3kr5IT!O4f@; z?N|rl3MX)U6h`)KcP}{q$St+Vr3I+1q;*<9DY|X54;QjxTddE?DX7l*7Y_T=v7$qG zyUJ7*Sy^v(ZMh$ zP|H{Qc3D#f_b@a_s8YyJ&YO`?imBENsr+lqW-v!YCJ9)KICT6w(EJ^^nc;x?`ZfZ zPOK|i)jU3Nas&Cl#t92K>wn?IUI|SEIiN*7o-l&+F$5i=#6~YQJOm~<5gRP27}o^$ z>!kB$lWqL^zC%I~(VG+{_UxB;kib;uhcyru>%q#U3n+GVWVd?Lh!3fpm}C~Wl08Vh?p3u{=; zdNh+j>6~mAZ|rBkR!h67+>MhM)B7( zC_JMHxMaN?5q7E%R`=a%(1$MR6|7er@9-FMQ};PDhw(t;-(q6oFVtBXkM+yZ^Ld41 z*o4?YnrF02MkC1S?BGZ$7;bomV)jzAg;FSnrCU{u$hW)bbc@U7`O;n`Q=EEMswD$m{h|g zYS?IRraOpKo5w=YsG{NDTKZ&-th|`wQBh8t$DLv*HxA`@-wmQ|Z_Ce2GYvaHeePDS z>W;0GUGBc@QkLDztmQY)t}L$B8ZA1G`peh@tk0B(sb1;^j=A$Orzb!Q}5&{7?HXREDL30RI#eh6Vvq`ya%C|Mvg# zj+U0@F68o#rpABi3X6CeyO{qq_BkkS?doLgW@`0sv#-|BQ=3;teph6Im;?D1^K%GZ zxj9wtr$$MnNj;M8AP)90P973Pad6WZIq1RkBlrTeitt^q6w#|f{C=)7qo@=k@At9Q z&Bnv^O~+|Up#cANNan~N8fBvTfLKKm3NyC?J;^UV=4H}w%}gNy2-4W8%;d%yBv!h- zVp2;kZi^gP(CO;SoC{Uo_H&IfMwZ)(%oz-pv(d%E)44XZlMA*zxe%w>IJg{ja&7pQ zvfLM`S4y8%Bdsg77hJ&huI|cI*t=K&TGzKkLSg|qt_TH9&G{?~7IB3SCMC?ZJdJ)^ z^u)yZ_^l>)ol+>6M&h}HA0|Ebw1JghtmB|3SrY5^F zz2J9)y-Ix!Zxt;|{t@bv@?|Oc`CGZLEMAlElYC2=)Wfxcb~crnV||o3#UZ~t^#8~S zfyz$SwFBYR75%@1gzd1fr^Nx04VtpS{_xuy+X#u@$Bwv;t8F|)eRE0>$*tGS&Q4>2 zn4L8DKE`;2vr(=jj(&kdSC_+9NgOB(gN7TvQXU|K-1n*?j)R3&3R43ZpY%Qi+3-$* z0*@d?k0K(Igqn`7F=uv$B*v2u<3uNJ^y4EF?kQ5RvP;nZ6f|yNSPS8|cUi1u?pKrm zEM>8RlB1kPc29kw0G8Km20K${GDoPCIT;4^Z@x<&6==={wp;xSc9H4Trg^oX{aU}l z{Ju%p^WBFIG7|}@9-(`tjVFI7i6vy+6{L&A2?r5o5) zqT=lD@I=Oi{o^O)KYgLMz#i`FfxIO-B%R?AD&KY{Y-0`ASURJnE{l8}8t`gC^o#6U zqsTK=^cBu>eK?8TOMC3O1kb2BHiK0OewbSvKX{K@C^hV}D&86jX_JH7i~}}HgJ#Iv zpgU~q=u6AjCj$L~=J;aTXQ5~xvZk%-#6a-BlCi%-?Vlht_v7Vt_yi%sr^-I>{{V#l z56Kwke?p9gy%OH1M0A>K+ln9zawZrFlYRDZM%aFJ8z>koCA))tK8x&P0AKu&pteJG zCkLWXNpF50S&4#l32ojjSB0#`?F~5Xz4-&ojBW<9UPspI^+eO#CUO19@V1zp)`&fdC6?-%hVqWicCV2R={ zK3jhu!4fWa8p~F%l3&|d6H=!GZq9uWoa*ZCxtgUEmQCAx0LEniR!ng`ijq@F0Xfjt zUF!PkG>G&wS2*q}HLK`z=JM`yss_Cx2w8bpnEIJZM$-I*@~7mUCvLRw24T#dq_>Cw zBd`qDlwl!Eo7-(cn?j;a;s-84CavurrdZd(H-D)`Fj?Sg`^OcdY(+46%U+H(H~+g^ ze@e^rx3zk@_+CmcqfT|0@=F8br!7r6_U!E2wW>7j&CdFlzz|xt#I+))O=lGj; z?fBHUI(z8Mj-GyzYGJfnm<$i#xM?2^(gPRKN`?pQH)c^>F8Ot8p@8{Ga>>0Cv3utjl|OBWS#e!MciH{0qfYP<0TWIe&6W#Q->Ow z>~_#EAh8Mm&6bFp(zyO22mT}=_fB}X?udtGP(-&Qp@A*?0f~2i<0Iq`A3$_68jVph zWmx))pB!)^0dw=^ec*chVeSOVIN8&Z{Yh3O?awL_XNAmLWOS+7?}Ki@_+5_84<*dg zqnXy+CQKjRS;(I#){RX|X=WBzQgstMXifal*&WB5vWmJ9ccqaqvq)`~>-uJ2t^vXNK(fms!o$J;9- zJ-E>8ZKZ{=I6dP4`Mqa0$GdReH7b_0McgO1(j__Ng;qa4Go>@=O!!ue5(=Js+a?T? zxeddp!mE3QqO(4GgH@C9xH9-nXpB&dmiL~j4ReegN_rRu>oGBxv7y=caygzxKW^w9 z@-I~X9lQTTHD*XHT-#^r`1Ny&#ri)$^?!%f|4JCE)#a4XMUdZpJd8Hnk;M;4dUTvT zy%0!GK*?FMC}!zxSOMU<0OJO}HF-x1pTzDbEcvdZu`H}FnL(66w8s|7|nHQtkx3S zip>cDtE{d}CA}n5?jn2Fy5P+%*N*VPh1}+A&g$h7ufvJbaeOj!06rfJ({)hC&%QZh z8_mJ1GJhJnkpvuvxgzr!veNszGAQsSwbrrZf@yKANWo<8V}hnXy8G)!ONl**lbIQ> zQ4@a_TC9evHW49MTt!)^F-a}6?j zg_0;RuJJ6Hf37Sr(Z^v0RfE@7FZNq~n%!N}uX4gcg|Jo48sZ7v3Efm(AdGQ7q^pvkb*Yf%F&!0RHhh1w->j^U_1c2X!g)_J-YsdGJ#dYh6%C?jtgN^Y$K}>ai zBk8oIJl2VC{Jj?3EyzfYivmj63fsQDrYmu!rd^4<(T5!ys4a(SUAl2E@CZ7Ud?U;l zp}}?KY0Qv95G@JR<8~p4{B;I;{AONR2}M{^#aGcHI@c9V?FGr_H-{oc18<0pdo%Ji z2RfyQjV6{~yG%q`09 zD^Clxm_MvuV!K)7%t`m7+hGv#Ph#pa#*RzY+;*iy_S-bDchySeuN}+3u}a=$m08c- zbs_PH6<&!Ki8F@mQEDI7B?kL?VlK^FN1vRWCD5UzBC@42$czInNt~CZ0rmKUKYN@TqfJ%4M!(HXj2Uw$d zoc>4g!TbZ2sEENq$pa5}{cQkCpAi3aX=XmhM`rl!j=)uF9K4ESi6jU1((R8Qmu;>0U z!>eC`A=CSx+AWKqRLOZhiSy8jQH(ByMCEs+>CZ{gqVf6&IE=HoqyP!rk}ota9!A?s zcHBCYdR(G~yVT{K;pjCxHqrrz%Y5p1VamZvuaTA$Lk^w)wr_Cj z#CuTf!#nYMIx5S{aL#tdkHD$TR~DC&>gA4qNB)4=_uATA0a2YBoHE;9_n!K-dYjw$ zwtqrx#_k z1-`8)k{WBSy(q#+5qI!mA$OGZH8;h6Q|uv5DzJ3y97W6>|ALvlLt@kV(qbj2`Al?p z#$b6zakgPYeyoL2f8ywtg3MK2{znylD;A7x64c}(Lu1|*ct?4s7{VpRiHb5tqv&e1 z_LPRf*0yst3BSoN9^grp!wsxs0AOA1Bvyp4T1QSTZoi^B#@(BZKGNu@k}Ueckd(B7 zp&EzRHY%o|A4O3scoUB_bb`rg60NUATuQT*mC|!F24{LP4#B&~yJb>=i|u!NF2ezy z~UG~PyO{;mEvO#MUwpP7Vi z)WTIZ@wZiDz)Y7KGR-TI+@J~%B-J5IdLzHyzG=s&^usv0!{?H4F0+LNgz?$Q0dCJ2 zO~YXv$OMz_5JWGP;Aot^*F>jp;(KH%XlO-bYR*}Cw{82wn}zn?;U?Lvk&L>67waaG zo2U5*3L=F1{q%5f(KF`R8qCmQ{rvJcX(6anG<75w#sbTA-BNAxY5b7z`CPf$H1lwb zJB6|7=v}c|W?dCK9QvwPyo@U5RU;UHyXbk!!y8oKQiWD*L92%rwxUMu#7EIjKtl@j zSUs-1S+%G#Q-|%4a>>LkPQr~)QrkY*fqoWhkqd6jk1G77^3e&CwV8#5LeOot6(O5xUG)?(-v&u5=dJ z^b2;ZAjKUX77$FVXq^7k3~uLYUl43;hUiYMcZ~n2a^Wi)&uUZBRCf&YJ@xjzBOsPu zzcD%=tjL_UbRYRu3UjV)@`U829C@S*@`}}f`avdcGVR*{bcg{?ZHffuq? z^1HQ6xiB@t3Leqm@ra8lHwy+8^tuvp;OnluH zRyBkRqc_1BuW0q|jFOeMc#(GC7anZQO;K@CVpIchHO_mygDZ?MvCu5WA_e?ZNUQ?+ z;z04+u>*ysjR6~2syVGo!Cu+lqMxEa$ORx-r!K^z0%8Rr@ftDybn-I<8v z_pOmPfx-_%MWI`T8hE61?vgd(k6vb?6)nwcsxkICZfx9>SB(1cmDMMBlb3;0U~3(~ z7^T`D(H3uM=a15iJeiz-G~jCH_jqI}=JgE5C_BHOeN+;8q1n5u^c>dUWBTB>)(W+M zT|Er|GzdS<3ZJ}G zR8XxFLd_Zzan@&)YEK5?rMxXKH({ps+rtv+qb(BP-+uh>-uj<@{Cq7V!SOTAO8DQC z3LO7MDx5l?Nuj?}+BU3gg&_|x{8H^hA0b(V0COOLC<`SqieRr#Tno&)H&V(t)9&0C zCJd)Kx|D5VuMT^h#3Lqg@Q;!0&fe5V(8R~DZE~H;7D#uT;&FXg><#P!VGe%c_F>Kz zW}3>vmLU$Eg+N$w-Wx{69tkIBG$D2OQRtVJ$FV8VbzTa2|&m^=u$C( z^MDaHVtG0qv%$m@lT7{w`HS}^ct6Iemn1ek2&W3?X7{id4I;ZGoew6rL;R5;51Qi_ zq+c$dIUvbRgnE5nw{}fqgih{aow48bykd#t1&QGn4+_OY?Ir#t@&(~gm$*%)UNg*) zp_&drQkmyvJlaH*MDnCuG2#X>nRm3ra_dfWizv}>sxyP$bF@%MuUeVWHjMlg8Do0Z zJrFE9Va;PAn{a3px z2F0EV+Vt7uhi>i}Sy1J_!K#C8_)_nPRK~~b|G!L8c;=m$P$n8Wmg3GAJSUhsX z(_Z{f(}24gaQ2linUIz}I#*5Ap~T#Xj|XU2zlakd$hLKc&B{@!$c(3eOD1rKHfhMT zhG2IhH&VIs2P=J)%K8hZWcm0I9MhqHa~EvqLIw9^qmAb+*L;BIp6#>7!`#=D`}=U$ zkTyo2KSe~T8hbVKf~n+ez}^sZKwi;ly0mrBl7niSfcqnA@`wwva_`a1t^3bo~$PIm@GW#NW6NtP}B7BvV)Dp@ZbuhNRvU9_$_gUWjSI zc^@xy;>P0Cihbk{h)CFuELL4W=R%!*0S9cNL^eUmBUW^t819|{mOYq$%qeSpsxKrx z&e_FoZoB9*zO(mVrZTwg_a?T<6G$*}p7F9{tZ>D|O%JfRyD*ml`P-9b?<}Y9hO@un|<|CZYL}#8wB{gS;L=; zNr6NDL!N2>r~7T905Im*ILRhs`Y?}J+eh*+75T9I9h=WCMX@%(sqvsQS!`BDa)LEt z>i~?YB=CpJlqI5c7;{W9dk*|Qr{FR((|RhP3BZSNPipxhAcg>hy)Z`{!5pZ6#XlSv z^?ltfHQt`)8@69nxcwBi(lgBNtoeq*={YhQu;F3P($75Siw*4$Arg0M94_2~YFB;-#l^1H>fk8+(~{m$xu zMpH*6MO4aHz-65FQv$W1H)=ma(o$;~i>&jgkN*j47$#6;#Vmh4KfU0g`L)**`y z?j#e|{+Tpwj%5WP%Vt&5l((Olh15s5D<3HKv(2z*8XeMh{#n?)vbq$ThEsNVPShuZ zhYDf0Gyx5fGR01x7_e0;sm+LJR-DwyrVOriT`1G1k*H^#pSICrkAth`vBV+KPX^jF z*$Zi#mh#Shec7W1##cgA8>}TXZLp1-g}uQ>7z|h9)jzJS){^>bjFuEH)tu6K+l>wB zkBo6++UT`8;@1!E zl_!m&@w|3btl|&KMe!Wm2*V1~`-Xoc<8RJdHr;z9b=g z#o#j;oiL-{zQn;PjPt&C!aEI+bRMBho9|-f1g`b;SF93v9DaemjSghd-l@7 z4wiPf#75b>h2|t}wq#HtG2#{D^?5<%lSptKp_!lSSmqWBHPDoN(HmZmCQ)Osd>%8B z)AV_{n0xvK#ZN-z;3?9kW-?$od zR}i|UyoFaPl`7%uS(1ZFcuryJOBmj{+>gnm>X_LdMojrXfAgGJ zn7^RkPv_eg1e5U8g-ZgYxJ7c1fzvPv6*)G6cJLh`BaQ*SvHN3%3a;a`!Is>bcb%|nb*6|t!-OA-R1wsW~u5{F6PE&%8rh9pOlk@wWYhuzlxgw$$ye(Z9ds1 zz_giXi%2bDaP#`YLIWXw+ZmmRSv zON(^sF$)pLsfkzL_uD|Wv+1wffgpV({C9ofY4GbB)Ib3P54TnK-5&TaF!b}(CZ-f- zf#f&>outC?uj|Tn^&-?BX|L^Xqr#mk$tJm@AV99xeB+>{aj+}6rgH5@kbTAN z&|_LXXCJ5Gx_ouvZxI3vA$K602grrit_LU2phlo;NUc#|CK4^4^D$E+8^?CPNcj_w zN4lF)UAeKK(s^#u@@$i_WL1g%Dopo$>*AQ_XUC3CvL@r0k6;vs)SRSRT~KjylHEZv zcOyA;JNcv^s%88EY-T)W;sR^3!v5+r;$N2acl-ILWu?5K)xmz!`rV(KJpV5XcK_*} zD$%mmLes(yxClZTR7q-CsE)>^5Mke|(bfwiE)OP#rBy8fn#oHJe|K{M&P~>MxF7c{ zKd1>Ud|5IL{Xy92cO3Cd^bG!t=i~FdHC9J0PCUuee)=Lf?YsRll`@w1@%{=Ql=E1F z8i0ReOr~qr^sEeUqR5>6UG%%|%XwsE^AB2Q2o)mU85$2$jH6`dg$Rd1b8rd~Rs)nYR&GR7#1z`|g)D;?ItcX(z0$DBggg?0-My*D<(^Z&Pkgp9PIghrisl;QfS1YMhQ*kfG3ohtO3BK%_TP_@*?<)H6o^K=mQ zL_Gp`d&Hwb5wtg%nqkg!WuYI9&bM^#{D?#tAEUIS z1d?^6?fXo?eL2QVSn~iB&?EDY5ub)L01$(X7V5;(rk<>*M-bV>cWrn^ND`Fw;t%mb zsja~gY$*|;sl(_!7vzs-9wVzT(Rw*o3M@7zRNC3phvQO9;LrgIjcNpCLe#97t*-H< ztvIA_l`#h%r#kM^C2|OQnbwwwbc+SIO*yH?G-YDKBFLQHLeyr)Vv~(d=w|)q2j~dK z+Wjz+=KMc)yt|0^B_Nr0yF${h;ee+5pxWiS4$Bss`8E-Vxitz+ZY=6iWum1vC8G7g zjb_yQ8j!WS?zH);CnMX`A%0^0kX=v054lTWv90J`ah_qF9odTUJ3V z7XN}BIlqz}+gZQR%EG6#yHa!{0E4TK=$gDQ_msO2a?5lcpuo|C;f1I}e44U3M!yn_ z3m6X_+;n2OkUh4}Gwr6p8$~6($S#m|&*eY{ddVac6e^Kjx(GANF~uhdz@W+52KsM! zK)L^zEbX?ckNlCMl!VSut$Jr+C3=p;=b?Bs7m|w2EDqL)3vD^q_8WB8)~{men`((~ z`N^xZkA5?IRB;~is~YkvV@Ti{ij4mYDT2G}1WZ)tIXR*n$7TrWbc59yGs|?5OOXfd zucg_Rr)TAclxJbaA!HbFs%GXXg1M^Fo};&$qoubVRk+juz3@xaOVahD06WXnU1_6I zI=l7}n~PgF&+s+JaHBitqELme@96RH3uh zn0t%U57Vj>gwU5K~Hu(asky;4fs%Av`-yN%fX5ZiRYUn+_74%Fw02TGCS z#tqWAlRFyLQ^vY>+?FMmj^pEF`_uY5Q; zRxH-0hV20hwdyP9-cGr3;ZD;c7z&kub^Qo`@LrhT$Xk^5E@EFSq*hfS+qF7d7TY7T z5Nga8hsw_M!?1k&6;0b8n8qS4G^Z~L-V8qmH>YA(;OyUzq=y2wk<@2;VTFe~CKlUb z8Zlmn*2xcmItl-#?r|=-5f)R4?jf+@ayCqunM5@{BcK27k7wR(N?qFv>wyL@?gE80MN75hrx)l{G_Nn;wo=*UtOjbN(yZzM9doPQ@Wh$+u#`|hn_xcDJMw=0 zc5?lO=S7_m5w#CRNYfjh$xlepd9tp(b;=TNJX8zOsM=Tc)AZi?#(M&uJ%OXOPV*5x z*7ieq^7nvKPHXbW^Xa~vw_V%CR>G(I5gJ?Q#zJLKgTahwIL!uQpnkzT4au)4d|~ef82JuwTe3eYUB^ zVN3+yiS3?y$Z3W^Aed^C&$`qD&3}1*C1Jp_WSQyynXIt9;_+WKv%iOxe+Hc1h0xQ+ zPcmotlgwfH|5G#juTt_i4SO~8&&CiaB+N99h_bR-2nEJ5=RStS3@&5^MPf={BX057 zr$lqdF1^MJ{qw1c*GRw7m=evK&1p@ELd|lGYrO!u01;aARW_{aNMbvKO*bVa&*|Gc z`Op5!yM8hdq8(AL25b#r1}ykKWwcjs1ZKSZt{6Dc_rILU{trq@=GE|h8)wc!x{HT*wNi z2}*f6)E!9nWPVsqP>UigS^q@;2F4Z7qafuG&&s9v>JbB#pl?nK>$027dUzAhbe1UB zZbLQq#ZD>gvvACx`XEo55^39(gVj9c)ll_GXkZ^;->Ygd&H^I-O2#}O$Vi%FMWfqhM>)OGWTn{I7a3QuUnd0 zyMOKX{%h0n-zj{nva`%|q*45W`*bJ1oVije1^N4VNZrDN0ort~I#?Ru^OzRQw#Hu` zbXVd8;a{%8KP7wT`m`|dQ*n?SCp40}oXHjW6K-j1S?}KS3W9myZ@Eo(ZRxSgw6zCy z0HImM?MJ9<72y=wY9!;BQ~P))Md(;@1sOH@>e*P4Sf@#CYh4TsOZP>V*c&Y9fNl*D zf}?A0Mh;Nwc!Uwd)h)e0cD{yjrKjbw?e!|pec95tCD?vX7c2;Nu31NgFU}ORzBVv! z_(j&cY;NjLvZ|(|hkC;5X5w0odjsQbx>50Th1;cM9j0I1N!7!X)IrtJP->QoGvIJh zPOmn|O9w8dTXRRBC&{?O6)Kv_E8kNqOO3e`w+FzbjzrjnOzbWKNuX*w>GG zzq~bdavo(TvwDO zDzG1v-$~l_9|_I~Sr5kpkv65EfeiQ*YIFS|wIic=szVPTF*shdd z<|-ND1-RfDxB`_V3AafQDE+B1tr8%!7g>vvFlWW~6PljUcAvjTU%>;M2u#~Vrr#9s zsl1boQm^Tzc3Uwe$4_I^ScIMLjuIWLfB(F}w02C{ikaxe{?r6?``O3$G1GH-vU$uS zY^Y_IXrWLo>`TWJi*l|O7AIEx{UB%2cNgcc6!h=7|EEVF{1fKz)MduO8uF zz562WZdT?FZq}cTnvVYw1T&9gK?)H@miV9sD+~{hl0wF9t#53oXPuR{Y)wX_*U@Q2 zlB~7Z1?5jgp@j=z8ynC1=M`y1 zos0`*So>Z|@^9IU5t(fg@$zbeQjazEp_rn^>E#x@Mu)|BWRp`DWA;XsKLfg$txM?s zdCaGpNa_EFvv&;7ylb`xW81cE+qTU+w%Hv!>DWofPABQuwr$&XCzBWdGtYBo-ZOKZ zPxt-xSJ&FLYt>%0O2zyf6$-Q-+cTJ$?`I3?GdwXEz2r0GKSJ==5B+-xe1mJ2R=++S z@Wt^M|6>S5Esd@0&CUK933+3C<1c;cziC};twNs=Tn4M}<(CD|ga!D245ijMK;D>(G;~Kwk z-aG;CSXS=ITONOS^=Vi@L7^@qC?G!?W&H7XM@=(Vk3QZ0XW0H4oWF-{2M1RdS7+mY3owe*v{hA^(FBA!gdfE*oD3sjHA6UaYL1nPl|nH9 z>jWaW-k?@0iR&OAY=r+1A`K<74Rb8boMoT<@lIsi(suEGe}BXWN--*fG)4$s-bo=|Y{Js_KdX>ekvZ z-S_S!^bR%p_Rl#+Um8YPdQFsw#3LC$cZh+ZEYFqjrn*UT+6pnvTK3J7g-aAxS!)Yl z017Va{bEZ%hF8zc*vrY?B|?rVmHf79hNR|5dL|d4Dg(c9kc^In<)cf6_LOPyw==f=s)KeB54ooel@GO@{Zs^!|sl&MS=t+YX~Y$E$B zf9lfPD^5G%(Y_)s?V+$n4G8DvV@VdEbHzi`9V{-f9!I|kPo2llhJi+`+|q0n@^lziuotID~EIgI5Dr?Yg{R}^_!1w1o*C> zkqEqe@%VgDJX^ls0p~(=SP_46&Ib%0_Q_KI#I9gspcnjE{{O&8*Da66#WC1_Srhf=QwM9fI6YD^OiSDxq zne1|(BQTAekMpp~5-pZjEoKy2I}}v$+ZHu8u-Bp>Rq&siU*t6|uIl=%%Gy|0$jf(e z@^+)7fE~m&T|Hl3J^5Y1$93IIlL9T)&IL6?y#)^UeBj|AgnK$5HEl2It%p8AdwxR# zd4zuc9*!9KjAZDiC6*f=7v8MjFO2LF-mKa$Def!RtuKsbY{(!Gs|a=@?JLv00V04e z2K^ZE4ENa)hA8U$Y>PC|tl51e=9^RT33AjNhiC}5E8A??O^h7oat+i;w<|o!jMtAG z9gYRROB{W$YwR0>7zgFa7S8@mW9Td2ztnQFg>qC-*bmQ0g5Jco3PUzG~+0t18#)mHk+VnE?{zM6qgM2eb#Ia`}z&93_Yfk!*O4#r6 z?1j|T%?SP;*|W6n4lG)_QtwULxcS>&vvB47LcK~Sw7v0hvbb@P7DtDdhhxDdUtgvR zWd^-~b9P57V`ePkRKCw0t#76HSUQ<_$<*3mZI!!awY{vx&v{{Xex(=bUZYB$jJHOZ zmFhhfI= zo@>PuA8d{QCy|j{h;ReVU%X*G~#O5Y+%SnV5)Tpqk;nCB%Tl8Q(%zDZ^bAp zX))<M%HMDZrAeq=g)+>5#zT3bH7^UWSaH2Ie~@!I{cz)=4VA*I%0*4E;GTFWN}W0f z{K|={Id7gs1A%WTR2eVhp4uO{o4mLBw_7QaI znT1%%m8KMwHFnpL9h&;nct)82{@xEpp|YvJ2DcEwHZyH3;ZdQWPbaZmN6kYgX(F65 zro>|apY)M3a^KW^a&#ijXyihc5~n#5 z#*ld?wWDX^l1^0%;?LBSY?33#Yo?WjQRnZEIy&#PulACq+o#0DZolKGWkRe$RpW(1 zYjQ{42qa0~_#@17#da07;jq42rCOUAJ8RRPN~RG#hD)shIWl+6`aFECycg6---O&Y zzF+1hvKvFz7Fw5vN!!HyobA>Dh1hPRZJ0VVa>W3Lb;$td1P#5c&KRnz1=d_oVs_?U zD%+eoXnqDHa-(v^%;6;oSKvV0&isxHlCpq6@TuPeu>o`9nE3?oE6xA68IrVzd@Rb{ zD@b2#qKg+VFRPwTNoVix4Hgf#tU!*rGl07TPF^a^q@N3#x*EXO4J=7ag#9>KExTu7 z)JoTYw~{}=-&%rYHY%1IA;t@R4%((ABAxLwOJIONQA#2s+m$o1fEwp&r`1>E^2cJ} zNC!oqvi^9uy|pEGP;YTrIAJ}0vON=F1DHvgCwcvy2V!lhOxAtU*W@Q1UkG+H)wjzv zY09A`GX_ffoM}?{GR+O>BJpZ@zH1zM)|^ukco!O3PL04r7)a^wR>2*mkiJn$LTJaSHOpE^bmdv1aQ*uT=A`3 z9taZjNUUy7)KKyBKKMm0^larwsJWeStobdgUQGXb^J41Q z$jRrv6@#1yKK*QbYmpYY^IAGYMC3Ursz**Iy$bDIl3@mL@JBwa+ zABcD~msrB6cI}DqkS{{VDQO8~STF zA=Hj-3gi>9|FPbUpo&pJ7jxQMa<%oxBJbSd%WyHbU&yp4_J!DS>WstVD5+7HUc#9E zgYR!F&1tG4C`WR%*ADEB@ZvPT&mw(fBgSZ=GbUf+&rxKvIFju?tYCaeA`Z=3rD?)Z z{LuRBVy};BJco=c#EFMu@J^-SOpI5NyJuH8@qU3WbM=K$WxDIU25&4_!Y_=PQf)Ga zqVVXU(cll7R6AnHhSuIg?MsFcEj?EZPAO(O3k1#~s)xaZ)}9kNmtz@X&~?~#bnzq| zT~@hK9 zjus<@;ai}U9g-pBMzyuju$-N=1T_%AT)Co5_Z+(&tz0?L`*^C9C#y2L*J6)m0SG{? zqC~fd*|kk2Iabj-QD{ao20OwNV?HXq;d(D9C0`|;zn+8NJZaf1b9k?J?d`d14(cro z+SfX^+m~=MLOWu$6%^}k#^N+4B)*5{i?OHy5x}IG+Ox&!tB*u_)j+jeG{Rn-wZ^x0 zq~O@0tKY-h-4p`i!Ni&DGsse`!;xN}6sgqiWb@ zu1{EWpIwvAVC?;^hRdkz)-E?JAT#U_&#O)BCxy17q7gWj7Cp8Cqc@@^%)DxUw%w=#?z5fj+m%0A*&w?Ve}{TsO^2&MR`6Bb3pm!fL=XjeJxz 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 z

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 + 4.0.0 + org.littleshoot + littleproxy + jar + 1.1.3 + LittleProxy + + LittleProxy is a high performance HTTP proxy written in Java and using the Netty networking framework. + + http://littleproxy.org + + + UTF-8 + UTF-8 + github + 4.1.33.Final + 1.7.24 + 1.8 + + + + LittleShoot + http://littleproxy.org + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + + http://groups.google.com/group/littleproxy + littleproxy + littleproxy@googlegroups.com + http://groups.google.com/group/littleproxy + littleproxy+unsubscribe@googlegroups.com + + + + + github + https://github.com/adamfisk/LittleProxy/issues + + + + scm:git:https://adamfisk@github.com/adamfisk/LittleProxy.git + scm:git:git@github.com:adamfisk/LittleProxy + scm:git:git@github.com:adamfisk/LittleProxy.git + HEAD + + + + + central + artifactory-artifactory-0-releases + https://artifactory.tools-k8s.hellofresh.io/artifactory/maven + + + snapshots + artifactory-artifactory-0-snapshots + https://artifactory.tools-k8s.hellofresh.io/artifactory/maven + + + + 2009 + + + + + doclint-java8-disable + + [1.8,) + + + -Xdoclint:none + + + + doclint-java7-earlier + + [,1.8) + + + + + + + + release + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-sources + package + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + ${java.version} + + ${javadoc.opts} + + + + attach-javadocs + package + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + ossrh + https://oss.sonatype.org/ + false + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + true + false + release + deploy + + + + + + + + netty-4.1 + + 4.1.8.Final + + + + + + + com.google.guava + guava + 27.0.1-jre + + + + commons-cli + commons-cli + 1.4 + + true + + + + org.apache.commons + commons-lang3 + 3.8.1 + + + + junit + junit + 4.12 + test + + + + org.hamcrest + hamcrest-core + 1.3 + test + + + + org.hamcrest + hamcrest-library + 1.3 + test + + + + org.eclipse.jetty + jetty-server + 9.4.15.v20190215 + test + + + + org.mockito + mockito-core + 2.7.12 + test + + + + org.mock-server + mockserver-netty + 5.5.1 + test + + + ch.qos.logback + logback-classic + + + + + + org.seleniumhq.selenium + selenium-java + 3.141.59 + test + + + io.netty + netty + + + + + + log4j + log4j + 1.2.17 + true + + + + org.apache.httpcomponents + httpclient + 4.5.7 + test + + + + io.netty + netty-all + + + + com.barchart.udt + barchart-udt-bundle + 2.3.0 + + + + org.littleshoot + dnssec4j + 0.1.6 + true + + + org.littleshoot + dnsjava + + + + + + dnsjava + dnsjava + 2.1.8 + true + + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + true + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + org.apache.commons + commons-exec + 1.3 + test + + + + + + + + + io.netty + netty-all + ${netty.version} + + + io.netty + netty-buffer + ${netty.version} + + + io.netty + netty-codec + ${netty.version} + + + io.netty + netty-codec-haproxy + ${netty.version} + + + io.netty + netty-codec-http + ${netty.version} + + + io.netty + netty-codec-socks + ${netty.version} + + + io.netty + netty-common + ${netty.version} + + + io.netty + netty-handler + ${netty.version} + + + io.netty + netty-transport + ${netty.version} + + + io.netty + netty-transport-rxtx + ${netty.version} + + + io.netty + netty-transport-sctp + ${netty.version} + + + io.netty + netty-transport-udp + ${netty.version} + + + io.netty + netty-example + ${netty.version} + + + + + + 3.0.4 + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.4.1 + + + + org.apache.maven.plugins + maven-site-plugin + 3.6 + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + + + org.apache.maven.plugins + maven-clean-plugin + 3.0.0 + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + org.apache.maven.plugins + maven-install-plugin + 2.5.2 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + org.apache.maven.plugins + maven-resources-plugin + 3.0.2 + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + -Xmx1g -XX:MaxPermSize=256m + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.0 + + ${java.version} + ${java.version} + UTF-8 + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + private + ${java.version} + + http://netty.io/4.0/api/ + + + ${javadoc.opts} + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + package + + shade + + + true + littleproxy-shade + + + org.bouncycastle:* + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + org.littleshoot.proxy.Launcher + + + + log4j.xml + src/main/config/log4j.xml + + + + + + + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.4 + + + + maven-dependency-plugin + 2.10 + + + + analyze-report + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 2.9 + + true + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + private + ${java.version} + + http://netty.io/4.0/api/ + + + ${javadoc.opts} + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.19.1 + + false + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.17 + + + org.apache.maven.plugins + maven-changelog-plugin + 2.3 + + + org.apache.maven.plugins + maven-changes-plugin + 2.12.1 + + + + github-report + + + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.4 + + + + + + org.apache.maven.plugins + maven-jxr-plugin + 2.5 + + + org.apache.maven.plugins + maven-pmd-plugin + 3.7 + + true + utf-8 + 100 + ${java.version} + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.7 + + + org.codehaus.mojo + versions-maven-plugin + 2.3 + + + + dependency-updates-report + plugin-updates-report + property-updates-report + + + + + + + + org.codehaus.mojo + taglist-maven-plugin + 2.4 + + true + + mudo + todo + idea + MUDO + TODO + IDEA + + + + + + + + + afisk + Adam fisk + a@littleshoot.org + LittleShoot + http://www.littleshoot.org/ + + Developer + + -5 + + + + ox.to.a.cart + Ox Cart + ox@getlantern.org + GetLantern + https://www.getlantern.org/ + + Developer + + -5 + + + From 3dabce115e53f4473d08f252817a355af9defcf5 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Tue, 19 Mar 2019 09:55:57 +0100 Subject: [PATCH 13/41] [PT-3269] 500 errors to graylog (#12) * [PT-3269] 500 errors to graylog * Fix issues with dependencies * Small fixes * one more fix in test * one more small tune * Small code refactoring * One more small update removed status from message and fix issue with incorrect requests * One more small update removed status from message and fix issue with incorrect requests * One more part of refactoring * One more part of refactoring * one more promotion * BMP 2.1.15 promotion with final logs version * one more small fix * Remove duplicated call for log stash metrics * Fix host and port according to PR * Fix issue with hardcoded hosts * Update bmp-logging.yaml * Added snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../lightbody/bmp/BrowserMobProxyServer.java | 66 ++-- .../net/lightbody/bmp/core/har/HarLog.java | 4 +- .../lightbody/bmp/core/har/HarRequest.java | 6 +- .../lightbody/bmp/core/har/HarResponse.java | 4 +- .../bmp/filters/BlacklistFilter.java | 14 +- .../filters/BrowserMobHttpFilterChain.java | 13 +- .../bmp/filters/HarCaptureFilter.java | 69 ++-- .../filters/HttpConnectHarCaptureFilter.java | 4 +- .../bmp/filters/HttpsAwareFiltersAdapter.java | 14 +- .../bmp/filters/HttpsHostCaptureFilter.java | 4 +- .../HttpsOriginalHostCaptureFilter.java | 7 +- .../bmp/filters/RewriteUrlFilter.java | 11 +- .../filters/ServerResponseCaptureFilter.java | 21 +- .../bmp/filters/StatsDMetricsFilter.java | 40 +-- .../bmp/filters/WhitelistFilter.java | 13 +- .../bmp/proxy/dns/DnsJavaResolver.java | 2 +- .../bmp/proxy/dns/NativeResolver.java | 3 +- .../lightbody/bmp/util/BeansJsonMapper.java | 39 +++ .../bmp/util/BrowserMobHttpUtil.java | 10 +- .../bmp/util/BrowserMobProxyUtil.java | 11 +- .../bmp/util/HttpMessageContents.java | 6 +- .../lightbody/bmp/util/HttpObjectUtil.java | 23 +- .../bmp/filters/RewriteUrlFilterTest.groovy | 15 +- .../lightbody/bmp/proxy/WhitelistTest.groovy | 4 +- .../lightbody/bmp/proxy/InterceptorTest.java | 296 +++++++----------- browsermob-dist/pom.xml | 36 ++- .../src/main/resources/bmp-logging.yaml | 49 +-- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- .../java/net/lightbody/bmp/util/HttpUtil.java | 11 +- pom.xml | 18 +- 34 files changed, 390 insertions(+), 433 deletions(-) create mode 100644 browsermob-core/src/main/java/net/lightbody/bmp/util/BeansJsonMapper.java diff --git a/README.md b/README.md index 91e504719..a0f2232bf 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.12 + 2.1.18-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index a35e372e2..6cde3686c 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12 + 2.1.18-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java index 39e89bf64..8a85f46a4 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java @@ -4,7 +4,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.MapMaker; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; import net.lightbody.bmp.client.ClientUtil; @@ -18,25 +18,13 @@ import net.lightbody.bmp.mitm.keys.ECKeyGenerator; import net.lightbody.bmp.mitm.keys.RSAKeyGenerator; import net.lightbody.bmp.mitm.manager.ImpersonatingMitmManager; -import net.lightbody.bmp.proxy.ActivityMonitor; -import net.lightbody.bmp.proxy.BlacklistEntry; -import net.lightbody.bmp.proxy.CaptureType; -import net.lightbody.bmp.proxy.RewriteRule; -import net.lightbody.bmp.proxy.Whitelist; +import net.lightbody.bmp.proxy.*; import net.lightbody.bmp.proxy.auth.AuthType; import net.lightbody.bmp.proxy.dns.AdvancedHostResolver; import net.lightbody.bmp.proxy.dns.DelegatingHostResolver; import net.lightbody.bmp.util.BrowserMobHttpUtil; import net.lightbody.bmp.util.BrowserMobProxyUtil; -import org.littleshoot.proxy.ChainedProxy; -import org.littleshoot.proxy.ChainedProxyAdapter; -import org.littleshoot.proxy.ChainedProxyManager; -import org.littleshoot.proxy.HttpFilters; -import org.littleshoot.proxy.HttpFiltersSource; -import org.littleshoot.proxy.HttpFiltersSourceAdapter; -import org.littleshoot.proxy.HttpProxyServer; -import org.littleshoot.proxy.HttpProxyServerBootstrap; -import org.littleshoot.proxy.MitmManager; +import org.littleshoot.proxy.*; import org.littleshoot.proxy.impl.DefaultHttpProxyServer; import org.littleshoot.proxy.impl.ProxyUtils; import org.littleshoot.proxy.impl.ThreadPoolConfiguration; @@ -45,16 +33,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.EnumSet; -import java.util.List; -import java.util.Map; -import java.util.Queue; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; @@ -320,28 +299,25 @@ public int getMaximumResponseBufferSizeInBytes() { // chained proxy after the proxy is started. bootstrappedWithDefaultChainedProxy.set(true); - bootstrap.withChainProxyManager(new ChainedProxyManager() { - @Override - public void lookupChainedProxies(HttpRequest httpRequest, Queue chainedProxies) { - final InetSocketAddress upstreamProxy = upstreamProxyAddress; - if (upstreamProxy != null) { - chainedProxies.add(new ChainedProxyAdapter() { - @Override - public InetSocketAddress getChainedProxyAddress() { - return upstreamProxy; - } - - @Override - public void filterRequest(HttpObject httpObject) { - String chainedProxyAuth = chainedProxyCredentials; - if (chainedProxyAuth != null) { - if (httpObject instanceof HttpRequest) { - HttpHeaders.addHeader((HttpRequest) httpObject, HttpHeaders.Names.PROXY_AUTHORIZATION, "Basic " + chainedProxyAuth); - } + bootstrap.withChainProxyManager((httpRequest, chainedProxies) -> { + final InetSocketAddress upstreamProxy = upstreamProxyAddress; + if (upstreamProxy != null) { + chainedProxies.add(new ChainedProxyAdapter() { + @Override + public InetSocketAddress getChainedProxyAddress() { + return upstreamProxy; + } + + @Override + public void filterRequest(HttpObject httpObject) { + String chainedProxyAuth = chainedProxyCredentials; + if (chainedProxyAuth != null) { + if (httpObject instanceof HttpRequest) { + ((HttpRequest) httpObject).headers().add(HttpHeaderNames.PROXY_AUTHORIZATION, "Basic " + chainedProxyAuth); } } - }); - } + } + }); } }); } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarLog.java b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarLog.java index 879e071f3..c7a6d1ef5 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarLog.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarLog.java @@ -10,8 +10,8 @@ public class HarLog { private final String version = "1.2"; private volatile HarNameVersion creator; private volatile HarNameVersion browser; - private final List pages = new CopyOnWriteArrayList(); - private final List entries = new CopyOnWriteArrayList(); + private final List pages = new CopyOnWriteArrayList<>(); + private final List entries = new CopyOnWriteArrayList<>(); private volatile String comment = ""; public HarLog() { diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java index 2cfe68957..845c75780 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java @@ -10,9 +10,9 @@ public class HarRequest { private volatile String method; private volatile String url; private volatile String httpVersion; - private final List cookies = new CopyOnWriteArrayList(); - private final List headers = new CopyOnWriteArrayList(); - private final List queryString = new CopyOnWriteArrayList(); + private final List cookies = new CopyOnWriteArrayList<>(); + private final List headers = new CopyOnWriteArrayList<>(); + private final List queryString = new CopyOnWriteArrayList<>(); private volatile HarPostData postData; private volatile long headersSize; // Odd grammar in spec private volatile long bodySize; diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarResponse.java b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarResponse.java index f82f248dd..b0e562a3b 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarResponse.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarResponse.java @@ -11,8 +11,8 @@ public class HarResponse { private volatile int status; private volatile String statusText; private volatile String httpVersion; - private final List cookies = new CopyOnWriteArrayList(); - private final List headers = new CopyOnWriteArrayList(); + private final List cookies = new CopyOnWriteArrayList<>(); + private final List headers = new CopyOnWriteArrayList<>(); private final HarContent content = new HarContent(); private volatile String redirectURL = ""; diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java index b267673e1..239179b78 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java @@ -1,13 +1,7 @@ package net.lightbody.bmp.filters; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpMethod; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.proxy.BlacklistEntry; import java.util.Collection; @@ -38,15 +32,15 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { String url = getFullUrl(httpRequest); for (BlacklistEntry entry : blacklistedUrls) { - if (HttpMethod.CONNECT.equals(httpRequest.getMethod()) && entry.getHttpMethodPattern() == null) { + if (HttpMethod.CONNECT.equals(httpRequest.method()) && entry.getHttpMethodPattern() == null) { // do not allow CONNECTs to be blacklisted unless a method pattern is explicitly specified continue; } - if (entry.matches(url, httpRequest.getMethod().name())) { + if (entry.matches(url, httpRequest.method().name())) { HttpResponseStatus status = HttpResponseStatus.valueOf(entry.getStatusCode()); HttpResponse resp = new DefaultFullHttpResponse(httpRequest.getProtocolVersion(), status); - HttpHeaders.setContentLength(resp, 0L); + HttpUtil.setContentLength(resp, 0L); return resp; } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/BrowserMobHttpFilterChain.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/BrowserMobHttpFilterChain.java index 6ddf1331f..b7c11044e 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/BrowserMobHttpFilterChain.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/BrowserMobHttpFilterChain.java @@ -1,12 +1,7 @@ package net.lightbody.bmp.filters; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.BrowserMobProxyServer; import org.littleshoot.proxy.HttpFilters; import org.littleshoot.proxy.HttpFiltersAdapter; @@ -54,9 +49,9 @@ public BrowserMobHttpFilterChain(BrowserMobProxyServer proxyServer, HttpRequest @Override public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (proxyServer.isStopped()) { - log.warn("Aborting request to {} because proxy is stopped", originalRequest.getUri()); - HttpResponse abortedResponse = new DefaultFullHttpResponse(originalRequest.getProtocolVersion(), HttpResponseStatus.SERVICE_UNAVAILABLE); - HttpHeaders.setContentLength(abortedResponse, 0L); + log.warn("Aborting request to {} because proxy is stopped", originalRequest.uri()); + HttpResponse abortedResponse = new DefaultFullHttpResponse(originalRequest.protocolVersion(), HttpResponseStatus.SERVICE_UNAVAILABLE); + HttpUtil.setContentLength(abortedResponse, 0L); return abortedResponse; } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 8d8bb4430..d2e34ca29 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -6,13 +6,7 @@ import com.timgroup.statsd.StatsDClient; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.HttpContent; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.LastHttpContent; -import io.netty.handler.codec.http.QueryStringDecoder; +import io.netty.handler.codec.http.*; import io.netty.handler.codec.http.cookie.ClientCookieDecoder; import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.ServerCookieDecoder; @@ -28,10 +22,12 @@ import net.lightbody.bmp.filters.support.HttpConnectTiming; import net.lightbody.bmp.filters.util.HarCaptureUtil; import net.lightbody.bmp.proxy.CaptureType; +import net.lightbody.bmp.util.BeansJsonMapper; import net.lightbody.bmp.util.BrowserMobHttpUtil; import org.littleshoot.proxy.impl.ProxyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.MDC; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -278,6 +274,8 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { harEntry.getResponse().setBodySize(responseBodySize.get()); } + logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); + return super.serverToProxyResponse(httpObject); } @@ -323,7 +321,7 @@ private HarRequest createHarRequestForHttpRequest(HttpRequest httpRequest) { // the full URL consists of the scheme + host + port (if non-standard) + path + query params + fragment. String url = getFullUrl(httpRequest); - return new HarRequest(httpRequest.getMethod().toString(), url, httpRequest.getProtocolVersion().text()); + return new HarRequest(httpRequest.method().toString(), url, httpRequest.protocolVersion().text()); } //TODO: add unit tests for these utility-like capture() methods @@ -331,7 +329,7 @@ private HarRequest createHarRequestForHttpRequest(HttpRequest httpRequest) { protected void captureQueryParameters(HttpRequest httpRequest) { // capture query parameters. it is safe to assume the query string is UTF-8, since it "should" be in US-ASCII (a subset of UTF-8), // but sometimes does include UTF-8 characters. - QueryStringDecoder queryStringDecoder = new QueryStringDecoder(httpRequest.getUri(), StandardCharsets.UTF_8); + QueryStringDecoder queryStringDecoder = new QueryStringDecoder(httpRequest.uri(), StandardCharsets.UTF_8); try { for (Map.Entry> entry : queryStringDecoder.parameters().entrySet()) { @@ -342,13 +340,13 @@ protected void captureQueryParameters(HttpRequest httpRequest) { } catch (IllegalArgumentException e) { // QueryStringDecoder will throw an IllegalArgumentException if it cannot interpret a query string. rather than cause the entire request to // fail by propagating the exception, simply skip the query parameter capture. - harEntry.setComment("Unable to decode query parameters on URI: " + httpRequest.getUri()); - log.info("Unable to decode query parameters on URI: " + httpRequest.getUri(), e); + harEntry.setComment("Unable to decode query parameters on URI: " + httpRequest.uri()); + log.info("Unable to decode query parameters on URI: " + httpRequest.uri(), e); } } protected void captureRequestHeaderSize(HttpRequest httpRequest) { - String requestLine = httpRequest.getMethod().toString() + ' ' + httpRequest.getUri() + ' ' + httpRequest.getProtocolVersion().toString(); + String requestLine = httpRequest.method().toString() + ' ' + httpRequest.uri() + ' ' + httpRequest.protocolVersion().toString(); // +2 => CRLF after status line, +4 => header/data separation long requestHeadersSize = requestLine.length() + 6; @@ -359,7 +357,7 @@ protected void captureRequestHeaderSize(HttpRequest httpRequest) { } protected void captureRequestCookies(HttpRequest httpRequest) { - String cookieHeader = httpRequest.headers().get(HttpHeaders.Names.COOKIE); + String cookieHeader = httpRequest.headers().get(HttpHeaderNames.COOKIE); if (cookieHeader == null) { return; } @@ -399,9 +397,9 @@ protected void captureRequestContent(HttpRequest httpRequest, byte[] fullMessage return; } - String contentType = HttpHeaders.getHeader(httpRequest, HttpHeaders.Names.CONTENT_TYPE); + String contentType = httpRequest.headers().get(HttpHeaderNames.CONTENT_TYPE); if (contentType == null) { - log.warn("No content type specified in request to {}. Content will be treated as {}", httpRequest.getUri(), BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE); + log.warn("No content type specified in request to {}. Content will be treated as {}", httpRequest.uri(), BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE); contentType = BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE; } @@ -411,24 +409,20 @@ protected void captureRequestContent(HttpRequest httpRequest, byte[] fullMessage postData.setMimeType(contentType); boolean urlEncoded; - if (contentType.startsWith(HttpHeaders.Values.APPLICATION_X_WWW_FORM_URLENCODED)) { - urlEncoded = true; - } else { - urlEncoded = false; - } + urlEncoded = contentType.startsWith(HttpHeaderValues.APPLICATION_X_WWW_FORM_URLENCODED.toString()); Charset charset; try { charset = BrowserMobHttpUtil.readCharsetInContentTypeHeader(contentType); } catch (UnsupportedCharsetException e) { - log.warn("Found unsupported character set in Content-Type header '{}' in HTTP request to {}. Content will not be captured in HAR.", contentType, httpRequest.getUri(), e); + log.warn("Found unsupported character set in Content-Type header '{}' in HTTP request to {}. Content will not be captured in HAR.", contentType, httpRequest.uri(), e); return; } if (charset == null) { // no charset specified, so use the default -- but log a message since this might not encode the data correctly charset = BrowserMobHttpUtil.DEFAULT_HTTP_CHARSET; - log.debug("No charset specified; using charset {} to decode contents to {}", charset, httpRequest.getUri()); + log.debug("No charset specified; using charset {} to decode contents to {}", charset, httpRequest.uri()); } if (urlEncoded) { @@ -458,9 +452,9 @@ protected void captureResponseContent(HttpResponse httpResponse, byte[] fullMess // force binary if the content encoding is not supported boolean forceBinary = false; - String contentType = HttpHeaders.getHeader(httpResponse, HttpHeaders.Names.CONTENT_TYPE); + String contentType = httpResponse.headers().get(HttpHeaderNames.CONTENT_TYPE); if (contentType == null) { - log.warn("No content type specified in response from {}. Content will be treated as {}", originalRequest.getUri(), BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE); + log.warn("No content type specified in response from {}. Content will be treated as {}", originalRequest.uri(), BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE); contentType = BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE; } @@ -474,14 +468,14 @@ protected void captureResponseContent(HttpResponse httpResponse, byte[] fullMess try { charset = BrowserMobHttpUtil.readCharsetInContentTypeHeader(contentType); } catch (UnsupportedCharsetException e) { - log.warn("Found unsupported character set in Content-Type header '{}' in HTTP response from {}. Content will not be captured in HAR.", contentType, originalRequest.getUri(), e); + log.warn("Found unsupported character set in Content-Type header '{}' in HTTP response from {}. Content will not be captured in HAR.", contentType, originalRequest.uri(), e); return; } if (charset == null) { // no charset specified, so use the default -- but log a message since this might not encode the data correctly charset = BrowserMobHttpUtil.DEFAULT_HTTP_CHARSET; - log.debug("No charset specified; using charset {} to decode contents from {}", charset, originalRequest.getUri()); + log.debug("No charset specified; using charset {} to decode contents from {}", charset, originalRequest.uri()); } if (!forceBinary && BrowserMobHttpUtil.hasTextualContent(contentType)) { @@ -496,7 +490,7 @@ protected void captureResponseContent(HttpResponse httpResponse, byte[] fullMess } protected void captureResponse(HttpResponse httpResponse) { - HarResponse response = new HarResponse(httpResponse.getStatus().code(), httpResponse.getStatus().reasonPhrase(), httpResponse.getProtocolVersion().text()); + HarResponse response = new HarResponse(httpResponse.status().code(), httpResponse.status().reasonPhrase(), httpResponse.protocolVersion().text()); harEntry.setResponse(response); captureResponseHeaderSize(httpResponse); @@ -517,7 +511,7 @@ protected void captureResponse(HttpResponse httpResponse) { } protected void captureResponseMimeType(HttpResponse httpResponse) { - String contentType = HttpHeaders.getHeader(httpResponse, HttpHeaders.Names.CONTENT_TYPE); + String contentType = httpResponse.headers().get(HttpHeaderNames.CONTENT_TYPE); // don't set the mimeType to null, since mimeType is a required field if (contentType != null) { harEntry.getResponse().getContent().setMimeType(contentType); @@ -525,7 +519,7 @@ protected void captureResponseMimeType(HttpResponse httpResponse) { } protected void captureResponseCookies(HttpResponse httpResponse) { - List setCookieHeaders = httpResponse.headers().getAll(HttpHeaders.Names.SET_COOKIE); + List setCookieHeaders = httpResponse.headers().getAll(HttpHeaderNames.SET_COOKIE); if (setCookieHeaders == null) { return; } @@ -563,7 +557,7 @@ protected void captureResponseCookies(HttpResponse httpResponse) { } protected void captureResponseHeaderSize(HttpResponse httpResponse) { - String statusLine = httpResponse.getProtocolVersion().toString() + ' ' + httpResponse.getStatus().toString(); + String statusLine = httpResponse.protocolVersion().toString() + ' ' + httpResponse.status().toString(); // +2 => CRLF after status line, +4 => header/data separation long responseHeadersSize = statusLine.length() + 6; HttpHeaders headers = httpResponse.headers(); @@ -580,7 +574,7 @@ protected void captureResponseHeaders(HttpResponse httpResponse) { } protected void captureRedirectUrl(HttpResponse httpResponse) { - String locationHeaderValue = HttpHeaders.getHeader(httpResponse, HttpHeaders.Names.LOCATION); + String locationHeaderValue = httpResponse.headers().get(HttpHeaderNames.LOCATION); if (locationHeaderValue != null) { harEntry.getResponse().setRedirectURL(locationHeaderValue); } @@ -640,7 +634,7 @@ protected void populateAddressFromCache(HttpRequest httpRequest) { log.trace("Unable to find cached IP address for host: {}. IP address in HAR entry will be blank.", serverHost); } } else { - log.warn("Unable to identify host from request uri: {}", httpRequest.getUri()); + log.warn("Unable to identify host from request uri: {}", httpRequest.uri()); } } @@ -781,6 +775,17 @@ public void serverToProxyResponseReceived() { } } + private void logFailedRequestIfRequired(HarRequest request, HarResponse response) { + if (response.getStatus() >= 500 || response.getStatus() == 0) { + MDC.put("caller", "mobproxy"); + MDC.put("http_response_code", String.valueOf(response.getStatus())); + MDC.put("http_host", request.getUrl()); + MDC.put("request_details", BeansJsonMapper.getJsonString(request)); + MDC.put("method", request.getMethod()); + MDC.put("response", BeansJsonMapper.getJsonString(response)); + log.error("received bad status code"); + } + } private void createStatsDClient() { if (statsDClient.get() == null) { diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java index 8e979ff45..ab683df7d 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java @@ -364,7 +364,7 @@ private void populateServerIpAddress(HarEntry harEntry) { log.trace("Unable to find cached IP address for host: {}. IP address in HAR entry will be blank.", serverHost); } } else { - log.warn("Unable to identify host from request uri: {}", modifiedHttpRequest.getUri()); + log.warn("Unable to identify host from request uri: {}", modifiedHttpRequest.uri()); } } } @@ -379,7 +379,7 @@ private void populateServerIpAddress(HarEntry harEntry) { private HarRequest createRequestForFailedConnect(HttpRequest httpConnectRequest) { String url = getFullUrl(httpConnectRequest); - return new HarRequest(httpConnectRequest.getMethod().toString(), url, httpConnectRequest.getProtocolVersion().text()); + return new HarRequest(httpConnectRequest.method().toString(), url, httpConnectRequest.protocolVersion().text()); } /** diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsAwareFiltersAdapter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsAwareFiltersAdapter.java index e727f2b00..aa898e508 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsAwareFiltersAdapter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsAwareFiltersAdapter.java @@ -32,7 +32,7 @@ public HttpsAwareFiltersAdapter(HttpRequest originalRequest, ChannelHandlerConte * @return true if https, false if http */ public boolean isHttps() { - Attribute isHttpsAttr = ctx.attr(AttributeKey.valueOf(IS_HTTPS_ATTRIBUTE_NAME)); + Attribute isHttpsAttr = ctx.attr(AttributeKey.valueOf(IS_HTTPS_ATTRIBUTE_NAME)); Boolean isHttps = isHttpsAttr.get(); if (isHttps == null) { @@ -54,14 +54,14 @@ public String getFullUrl(HttpRequest modifiedRequest) { // special case: for HTTPS requests, the full URL is scheme (https://) + the URI of this request if (ProxyUtils.isCONNECT(modifiedRequest)) { // CONNECT requests contain the default port, even if it isn't specified on the request. - String hostNoDefaultPort = BrowserMobHttpUtil.removeMatchingPort(modifiedRequest.getUri(), 443); + String hostNoDefaultPort = BrowserMobHttpUtil.removeMatchingPort(modifiedRequest.uri(), 443); return "https://" + hostNoDefaultPort; } // To get the full URL, we need to retrieve the Scheme, Host + Port, Path, and Query Params from the request. // If the request URI starts with http:// or https://, it is already a full URL and can be returned directly. - if (HttpUtil.startsWithHttpOrHttps(modifiedRequest.getUri())) { - return modifiedRequest.getUri(); + if (HttpUtil.startsWithHttpOrHttps(modifiedRequest.uri())) { + return modifiedRequest.uri(); } // The URI did not include the scheme and host, so examine the request to obtain them: @@ -70,7 +70,7 @@ public String getFullUrl(HttpRequest modifiedRequest) { // Path + Query Params: since the request URI doesn't start with the scheme, we can safely assume that the URI // contains only the path and query params. String hostAndPort = getHostAndPort(modifiedRequest); - String path = modifiedRequest.getUri(); + String path = modifiedRequest.uri(); String url; if (isHttps()) { url = "https://" + hostAndPort + path; @@ -139,7 +139,7 @@ private String getHttpsRequestHostAndPort() throws IllegalStateException { throw new IllegalStateException("Request is not HTTPS. Cannot get host and port on non-HTTPS request using this method."); } - Attribute hostnameAttr = ctx.attr(AttributeKey.valueOf(HOST_ATTRIBUTE_NAME)); + Attribute hostnameAttr = ctx.attr(AttributeKey.valueOf(HOST_ATTRIBUTE_NAME)); return hostnameAttr.get(); } @@ -156,7 +156,7 @@ private String getHttpsOriginalRequestHostAndPort() throws IllegalStateException throw new IllegalStateException("Request is not HTTPS. Cannot get original host and port on non-HTTPS request using this method."); } - Attribute hostnameAttr = ctx.attr(AttributeKey.valueOf(ORIGINAL_HOST_ATTRIBUTE_NAME)); + Attribute hostnameAttr = ctx.attr(AttributeKey.valueOf(ORIGINAL_HOST_ATTRIBUTE_NAME)); return hostnameAttr.get(); } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsHostCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsHostCaptureFilter.java index f2a52a014..3225ae8ad 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsHostCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsHostCaptureFilter.java @@ -27,8 +27,8 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { HttpRequest httpRequest = (HttpRequest) httpObject; if (ProxyUtils.isCONNECT(httpRequest)) { - Attribute hostname = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.HOST_ATTRIBUTE_NAME)); - String hostAndPort = httpRequest.getUri(); + Attribute hostname = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.HOST_ATTRIBUTE_NAME)); + String hostAndPort = httpRequest.uri(); // CONNECT requests contain the port, even when using the default port. a sensible default is to remove the // default port, since in most cases it is not explicitly specified and its presence (in a HAR file, for example) diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsOriginalHostCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsOriginalHostCaptureFilter.java index 4a6894c4d..85a7b444a 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsOriginalHostCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpsOriginalHostCaptureFilter.java @@ -4,7 +4,6 @@ import io.netty.handler.codec.http.HttpRequest; import io.netty.util.Attribute; import io.netty.util.AttributeKey; -import org.littleshoot.proxy.HttpFiltersAdapter; import org.littleshoot.proxy.impl.ProxyUtils; /** @@ -23,11 +22,11 @@ public HttpsOriginalHostCaptureFilter(HttpRequest originalRequest, ChannelHandle // capturing the original host (and the remapped/modified host in clientToProxyRequest() below) guarantees that we will // have the "true" host, rather than relying on the Host header in subsequent requests (which may be absent or spoofed by malicious clients). if (ProxyUtils.isCONNECT(originalRequest)) { - Attribute originalHostAttr = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.ORIGINAL_HOST_ATTRIBUTE_NAME)); - String hostAndPort = originalRequest.getUri(); + Attribute originalHostAttr = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.ORIGINAL_HOST_ATTRIBUTE_NAME)); + String hostAndPort = originalRequest.uri(); originalHostAttr.set(hostAndPort); - Attribute isHttpsAttr = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.IS_HTTPS_ATTRIBUTE_NAME)); + Attribute isHttpsAttr = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.IS_HTTPS_ATTRIBUTE_NAME)); isHttpsAttr.set(true); } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/RewriteUrlFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/RewriteUrlFilter.java index ef0e223c0..d1fc9f29b 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/RewriteUrlFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/RewriteUrlFilter.java @@ -1,10 +1,7 @@ package net.lightbody.bmp.filters; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.util.HttpUtil; import net.lightbody.bmp.proxy.RewriteRule; import net.lightbody.bmp.util.BrowserMobHttpUtil; @@ -64,7 +61,7 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { // if the URI in the request contains the scheme, host, and port, the request's URI can be replaced // with the rewritten URI. if not (for example, on HTTPS requests), strip the scheme, host, and port from // the rewritten URL before replacing the URI on the request. - String uriFromRequest = httpRequest.getUri(); + String uriFromRequest = httpRequest.uri(); if (HttpUtil.startsWithHttpOrHttps(uriFromRequest)) { httpRequest.setUri(rewrittenUrl); } else { @@ -117,8 +114,8 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { originalHostAndPort, modifiedHostAndPort); } else { // only modify the Host header if it already exists - if (httpRequest.headers().contains(HttpHeaders.Names.HOST)) { - HttpHeaders.setHost(httpRequest, modifiedHostAndPort); + if (httpRequest.headers().contains(HttpHeaderNames.HOST)) { + httpRequest.headers().set(HttpHeaderNames.HOST, modifiedHostAndPort); } } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java index 1bce61ad7..f40c8c6ab 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java @@ -2,12 +2,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.HttpContent; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.util.BrowserMobHttpUtil; import org.littleshoot.proxy.HttpFiltersAdapter; import org.slf4j.Logger; @@ -117,7 +112,7 @@ protected void captureFullResponseContents() { if (decompressEncodedContent) { decompressContents(); - } else { + } else { // will not decompress response } } else { @@ -127,19 +122,19 @@ protected void captureFullResponseContents() { } protected void decompressContents() { - if (contentEncoding.equals(HttpHeaders.Values.GZIP)) { + if (contentEncoding.equals(HttpHeaderValues.GZIP.toString())) { try { fullResponseContents = BrowserMobHttpUtil.decompressContents(getRawResponseContents()); decompressionSuccessful = true; } catch (RuntimeException e) { - log.warn("Failed to decompress response with encoding type " + contentEncoding + " when decoding request from " + originalRequest.getUri(), e); + log.warn("Failed to decompress response with encoding type " + contentEncoding + " when decoding request from " + originalRequest.uri(), e); } - } else if(contentEncoding.equals(BROTLI_COMPRESSION)) { + } else if (contentEncoding.equals(BROTLI_COMPRESSION)) { try { fullResponseContents = BrowserMobHttpUtil.decompressBrotliContents(getRawResponseContents()); decompressionSuccessful = true; } catch (RuntimeException e) { - log.warn("Failed to decompress response with encoding type " + contentEncoding + " when decoding request from " + originalRequest.getUri(), e); + log.warn("Failed to decompress response with encoding type " + contentEncoding + " when decoding request from " + originalRequest.uri(), e); } } else { log.warn("Cannot decode unsupported content encoding type {}", contentEncoding); @@ -147,7 +142,7 @@ protected void decompressContents() { } protected void captureContentEncoding(HttpResponse httpResponse) { - contentEncoding = HttpHeaders.getHeader(httpResponse, HttpHeaders.Names.CONTENT_ENCODING); + contentEncoding = httpResponse.headers().get(HttpHeaderNames.CONTENT_ENCODING); } protected void captureTrailingHeaders(LastHttpContent lastContent) { @@ -155,7 +150,7 @@ protected void captureTrailingHeaders(LastHttpContent lastContent) { // technically, the Content-Encoding header can be in a trailing header, although this is excruciatingly uncommon if (trailingHeaders != null) { - String trailingContentEncoding = trailingHeaders.get(HttpHeaders.Names.CONTENT_ENCODING); + String trailingContentEncoding = trailingHeaders.get(HttpHeaderNames.CONTENT_ENCODING); if (trailingContentEncoding != null) { contentEncoding = trailingContentEncoding; } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 84a72c577..6127a22e4 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -11,12 +11,10 @@ import java.net.URI; import java.net.URISyntaxException; -import java.util.Stack; public class StatsDMetricsFilter extends HttpsAwareFiltersAdapter { private StatsDClient client; - private static Stack HTTP_RESPONSE_STACK = new Stack<>(); - + private static InheritableThreadLocal HTTP_REQUEST_STORAGE = new InheritableThreadLocal<>(); public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ctx) { super(originalRequest, ctx); @@ -27,8 +25,7 @@ public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ct public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (httpObject instanceof HttpRequest) { HttpRequest httpRequest = (HttpRequest) httpObject; - String url = getFullUrl(httpRequest); - HTTP_RESPONSE_STACK.push(url); + HTTP_REQUEST_STORAGE.set(httpRequest); } return null; } @@ -36,27 +33,32 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { @Override public HttpObject serverToProxyResponse(HttpObject httpObject) { - if (httpObject instanceof HttpResponse) { + if (HttpResponse.class.isAssignableFrom(httpObject.getClass())) { HttpResponse httpResponse = (HttpResponse) httpObject; - - int status = httpResponse.getStatus().code(); - if (status > 399 || status == 0) { - String metric; - String url = HTTP_RESPONSE_STACK.pop(); - metric = getProxyPrefix().concat( - prepareMetric(url)).concat(String.format(".%s", status)); - client.increment(metric); - HTTP_RESPONSE_STACK.clear(); - } + int status = httpResponse.status().code(); + prepareStatsDMetrics(status); } return super.serverToProxyResponse(httpObject); } - public static String getStatsDHost() { - return StringUtils.isEmpty(System.getenv("STATSD_HOST")) ? "graphite000.tools.hellofresh.io" : System.getenv("STATSD_HOST"); + private void prepareStatsDMetrics(int status) { + if (status > 399 || status == 0) { + String metric; + HttpRequest request = HTTP_REQUEST_STORAGE.get(); + String url = getFullUrl(request); + metric = getProxyPrefix().concat( + prepareMetric(url)).concat(String.format(".%s", status)); + client.increment(metric); + HTTP_REQUEST_STORAGE.remove(); + } + } + + + static String getStatsDHost() { + return StringUtils.isEmpty(System.getenv("STATSD_HOST")) ? "localhost" : System.getenv("STATSD_HOST"); } - public static int getStatsDPort() { + static int getStatsDPort() { return StringUtils.isEmpty(System.getenv("STATSD_PORT")) ? 8125 : NumberUtils.toInt(System.getenv("STATSD_PORT")); } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/WhitelistFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/WhitelistFilter.java index ad8fbf6f6..247769928 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/WhitelistFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/WhitelistFilter.java @@ -1,12 +1,7 @@ package net.lightbody.bmp.filters; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http.*; import org.littleshoot.proxy.impl.ProxyUtils; import java.util.Collection; @@ -23,7 +18,7 @@ public class WhitelistFilter extends HttpsAwareFiltersAdapter { private final int whitelistResponseCode; private final Collection whitelistUrls; - public WhitelistFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, boolean whitelistEnabled,int whitelistResponseCode, + public WhitelistFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, boolean whitelistEnabled, int whitelistResponseCode, Collection whitelistUrls) { super(originalRequest, ctx); @@ -63,8 +58,8 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (!urlWhitelisted) { HttpResponseStatus status = HttpResponseStatus.valueOf(whitelistResponseCode); - HttpResponse resp = new DefaultFullHttpResponse(httpRequest.getProtocolVersion(), status); - HttpHeaders.setContentLength(resp, 0L); + HttpResponse resp = new DefaultFullHttpResponse(httpRequest.protocolVersion(), status); + HttpUtil.setContentLength(resp, 0L); return resp; } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/DnsJavaResolver.java b/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/DnsJavaResolver.java index 432032ed7..b45adb151 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/DnsJavaResolver.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/DnsJavaResolver.java @@ -108,7 +108,7 @@ protected Collection resolveHostByType(String host, int type) { } // convert the records we found into IPv4/IPv6 InetAddress objects - List addrList = new ArrayList(records.length); + List addrList = new ArrayList<>(records.length); // the InetAddresses returned by dnsjava include the trailing dot, e.g. "www.google.com." -- use the passed-in (or remapped) host value instead for (Record record : records) { diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/NativeResolver.java b/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/NativeResolver.java index c71c61495..00fd62390 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/NativeResolver.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/proxy/dns/NativeResolver.java @@ -38,9 +38,8 @@ public void setNegativeDNSCacheTimeout(int timeout, TimeUnit timeUnit) { @Override public Collection resolveRemapped(String remappedHost) { try { - Collection addresses = Arrays.asList(InetAddress.getAllByName(remappedHost)); + return Arrays.asList(InetAddress.getAllByName(remappedHost)); - return addresses; } catch (UnknownHostException e) { return Collections.emptyList(); } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/BeansJsonMapper.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/BeansJsonMapper.java new file mode 100644 index 000000000..5680b517a --- /dev/null +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/BeansJsonMapper.java @@ -0,0 +1,39 @@ +package net.lightbody.bmp.util; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class BeansJsonMapper { + static final ObjectMapper objectMapper = new ObjectMapper() + .enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .setVisibility(new ObjectMapper().getSerializationConfig().getDefaultVisibilityChecker() + .withFieldVisibility(JsonAutoDetect.Visibility.ANY) + .withGetterVisibility(JsonAutoDetect.Visibility.NONE) + .withSetterVisibility(JsonAutoDetect.Visibility.NONE) + .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); + + private BeansJsonMapper() { + } + + public static T json2Bean(String json, Class classToInit) { + try { + return (T) objectMapper.readValue(json, classToInit); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Failed to instantiate class: " + classToInit.getName()); + } + } + + public static String getJsonString(Object object) { + try { + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + throw new RuntimeException("Failed to serialize object to json: " + object.getClass().getName()); + } + } +} diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java index 264b3a2ee..a9e00c5f8 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java @@ -245,14 +245,14 @@ public static Charset readCharsetInContentTypeHeader(String contentTypeHeader) t */ public static String getRawPathAndParamsFromRequest(HttpRequest httpRequest) throws URISyntaxException { // if this request's URI contains a full URI (including scheme, host, etc.), strip away the non-path components - if (HttpUtil.startsWithHttpOrHttps(httpRequest.getUri())) { - return getRawPathAndParamsFromUri(httpRequest.getUri()); + if (HttpUtil.startsWithHttpOrHttps(httpRequest.uri())) { + return getRawPathAndParamsFromUri(httpRequest.uri()); } else { // to provide consistent validation behavior for URIs that contain a scheme and those that don't, attempt to parse // the URI, even though we discard the parsed URI object - new URI(httpRequest.getUri()); + new URI(httpRequest.uri()); - return httpRequest.getUri(); + return httpRequest.uri(); } } @@ -284,7 +284,7 @@ public static String getRawPathAndParamsFromUri(String uriString) throws URISynt * @return true if the response is a redirect, otherwise false */ public static boolean isRedirect(HttpResponse httpResponse) { - switch (httpResponse.getStatus().code()) { + switch (httpResponse.status().code()) { case 300: case 301: case 302: diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobProxyUtil.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobProxyUtil.java index 62f33cf06..19001df25 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobProxyUtil.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobProxyUtil.java @@ -33,19 +33,14 @@ public class BrowserMobProxyUtil { /** * Singleton version string loader. */ - private static final Supplier version = Suppliers.memoize(new Supplier() { - @Override - public String get() { - return readVersionFileOnClasspath(); - } - }); + private static final Supplier version = Suppliers.memoize(BrowserMobProxyUtil::readVersionFileOnClasspath); /** * Copies {@link HarEntry} and {@link HarPage} references from the specified har to a new har copy, up to and including * the specified pageRef. Does not perform a "deep copy", so any subsequent modification to the entries or pages will * be reflected in the copied har. * - * @param har existing har to copy + * @param har existing har to copy * @param pageRef last page ID to copy * @return copy of a {@link Har} with entries and pages from the original har, or null if the input har is null */ @@ -59,7 +54,7 @@ public static Har copyHarThroughPageRef(Har har, String pageRef) { } // collect the page refs that need to be copied to new har copy. - Set pageRefsToCopy = new HashSet(); + Set pageRefsToCopy = new HashSet<>(); for (HarPage page : har.getLog().getPages()) { pageRefsToCopy.add(page.getId()); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpMessageContents.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpMessageContents.java index 969a4d810..23a3cddcc 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpMessageContents.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpMessageContents.java @@ -1,7 +1,7 @@ package net.lightbody.bmp.util; import io.netty.handler.codec.http.FullHttpMessage; -import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpHeaderNames; import net.lightbody.bmp.exception.UnsupportedCharsetException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,7 +11,7 @@ /** * Helper class to wrap the contents of an {@link io.netty.handler.codec.http.HttpMessage}. Contains convenience methods to extract and * manipulate the contents of the wrapped {@link io.netty.handler.codec.http.HttpMessage}. - * + *

* TODO: Currently this class only wraps FullHttpMessages, since it must modify the Content-Length header; determine if this may be applied to chunked messages as well */ public class HttpMessageContents { @@ -96,7 +96,7 @@ public byte[] getBinaryContents() { * @return the message's content type */ public String getContentType() { - String contentTypeHeader = HttpHeaders.getHeader(httpMessage, HttpHeaders.Names.CONTENT_TYPE); + String contentTypeHeader = httpMessage.headers().get(HttpHeaderNames.CONTENT_TYPE); if (contentTypeHeader == null || contentTypeHeader.isEmpty()) { return BrowserMobHttpUtil.UNKNOWN_CONTENT_TYPE; } else { diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpObjectUtil.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpObjectUtil.java index 169a878f6..945f09d4a 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpObjectUtil.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/HttpObjectUtil.java @@ -1,9 +1,6 @@ package net.lightbody.bmp.util; -import io.netty.handler.codec.http.FullHttpMessage; -import io.netty.handler.codec.http.HttpContent; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpMessage; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.exception.UnsupportedCharsetException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,22 +18,22 @@ public class HttpObjectUtil { * Replaces the entity body of the message with the specified contents. Encodes the message contents according to charset in the message's * Content-Type header, or uses {@link BrowserMobHttpUtil#DEFAULT_HTTP_CHARSET} if none is specified. * Note: If the charset of the message is not supported on this platform, this will throw an {@link java.nio.charset.UnsupportedCharsetException}. - * + *

* TODO: Currently this method only works for FullHttpMessages, since it must modify the Content-Length header; determine if this may be applied to chunked messages as well * - * @param message the HTTP message to manipulate + * @param message the HTTP message to manipulate * @param newContents the new entity body contents * @throws java.nio.charset.UnsupportedCharsetException if the charset in the message is not supported on this platform */ public static void replaceTextHttpEntityBody(FullHttpMessage message, String newContents) { // get the content type for this message so we can encode the newContents into a byte stream appropriately - String contentTypeHeader = message.headers().get(HttpHeaders.Names.CONTENT_TYPE); + String contentTypeHeader = message.headers().get(HttpHeaderNames.CONTENT_TYPE); Charset messageCharset; try { messageCharset = BrowserMobHttpUtil.readCharsetInContentTypeHeader(contentTypeHeader); } catch (UnsupportedCharsetException e) { - java.nio.charset.UnsupportedCharsetException cause = e.getUnsupportedCharsetExceptionCause() ; + java.nio.charset.UnsupportedCharsetException cause = e.getUnsupportedCharsetExceptionCause(); log.error("Found unsupported character set in Content-Type header '{}' while attempting to replace contents of HTTP message.", contentTypeHeader, cause); throw cause; @@ -56,7 +53,7 @@ public static void replaceTextHttpEntityBody(FullHttpMessage message, String new * Replaces an HTTP entity body with the specified binary contents. * TODO: Currently this method only works for FullHttpMessages, since it must modify the Content-Length header; determine if this may be applied to chunked messages as well * - * @param message the HTTP message to manipulate + * @param message the HTTP message to manipulate * @param newBinaryContents the new entity body contents */ public static void replaceBinaryHttpEntityBody(FullHttpMessage message, byte[] newBinaryContents) { @@ -66,7 +63,7 @@ public static void replaceBinaryHttpEntityBody(FullHttpMessage message, byte[] n message.content().writeBytes(newBinaryContents); // update the Content-Length header, since the size may have changed - message.headers().set(HttpHeaders.Names.CONTENT_LENGTH, newBinaryContents.length); + message.headers().set(HttpHeaderNames.CONTENT_LENGTH, newBinaryContents.length); } /** @@ -74,7 +71,7 @@ public static void replaceBinaryHttpEntityBody(FullHttpMessage message, byte[] n * the character set is not specified or is unknown, you still must specify a suitable default charset (see {@link BrowserMobHttpUtil#DEFAULT_HTTP_CHARSET}). * * @param httpContent HTTP content object to extract the entity body from - * @param charset character set of the entity body + * @param charset character set of the entity body * @return String representation of the entity body * @throws IllegalArgumentException if the charset is null */ @@ -105,7 +102,7 @@ public static String extractHttpEntityBody(FullHttpMessage httpMessage) { // to alert the client code. java.nio.charset.UnsupportedCharsetException cause = e.getUnsupportedCharsetExceptionCause(); - String contentTypeHeader = HttpHeaders.getHeader(httpMessage, HttpHeaders.Names.CONTENT_TYPE); + String contentTypeHeader = httpMessage.headers().get(HttpHeaderNames.CONTENT_TYPE); log.error("Cannot retrieve text contents of message because HTTP message declares a character set that is not supported on this platform. Content type header: {}.", contentTypeHeader, cause); throw cause; @@ -124,7 +121,7 @@ public static String extractHttpEntityBody(FullHttpMessage httpMessage) { * @throws UnsupportedCharsetException if there is a charset specified in the content-type header, but it is not supported */ public static Charset getCharsetFromMessage(HttpMessage httpMessage) throws UnsupportedCharsetException { - String contentTypeHeader = HttpHeaders.getHeader(httpMessage, HttpHeaders.Names.CONTENT_TYPE); + String contentTypeHeader = httpMessage.headers().get(HttpHeaderNames.CONTENT_TYPE); Charset charset = BrowserMobHttpUtil.readCharsetInContentTypeHeader(contentTypeHeader); if (charset == null) { diff --git a/browsermob-core/src/test/groovy/net/lightbody/bmp/filters/RewriteUrlFilterTest.groovy b/browsermob-core/src/test/groovy/net/lightbody/bmp/filters/RewriteUrlFilterTest.groovy index 0a6991b3e..d5e4f1a12 100644 --- a/browsermob-core/src/test/groovy/net/lightbody/bmp/filters/RewriteUrlFilterTest.groovy +++ b/browsermob-core/src/test/groovy/net/lightbody/bmp/filters/RewriteUrlFilterTest.groovy @@ -2,6 +2,7 @@ package net.lightbody.bmp.filters import com.google.common.collect.ImmutableList import io.netty.channel.ChannelHandlerContext +import io.netty.handler.codec.http.HttpHeaderNames import io.netty.handler.codec.http.HttpHeaders import io.netty.handler.codec.http.HttpRequest import io.netty.util.Attribute @@ -37,10 +38,10 @@ class RewriteUrlFilterTest extends MockServerTest { @Test void testRewriteWithCaptureGroups() { HttpHeaders mockHeaders = mock(HttpHeaders.class) - when(mockHeaders.contains(HttpHeaders.Names.HOST)).thenReturn(false) + when(mockHeaders.contains(HttpHeaderNames.HOST)).thenReturn(false) HttpRequest request = mock(HttpRequest.class); - when(request.getUri()).thenReturn('http://www.yahoo.com?param=someValue'); + when(request.uri()).thenReturn('http://www.yahoo.com?param=someValue'); when(request.headers()).thenReturn(mockHeaders) Collection rewriteRules = ImmutableList.of(new RewriteRule('http://www\\.(yahoo|bing)\\.com\\?(\\w+)=(\\w+)', 'http://www.google.com?originalDomain=$1&$2=$3')); @@ -50,7 +51,7 @@ class RewriteUrlFilterTest extends MockServerTest { when(mockIsHttpsAttribute.get()).thenReturn(Boolean.FALSE) ChannelHandlerContext mockCtx = mock(ChannelHandlerContext) - when(mockCtx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.IS_HTTPS_ATTRIBUTE_NAME))) + when(mockCtx.attr(AttributeKey. valueOf(HttpsAwareFiltersAdapter.IS_HTTPS_ATTRIBUTE_NAME))) .thenReturn(mockIsHttpsAttribute) RewriteUrlFilter filter = new RewriteUrlFilter(request, mockCtx, rewriteRules); @@ -62,10 +63,10 @@ class RewriteUrlFilterTest extends MockServerTest { @Test void testRewriteMultipleMatches() { HttpHeaders mockHeaders = mock(HttpHeaders.class) - when(mockHeaders.contains(HttpHeaders.Names.HOST)).thenReturn(false) + when(mockHeaders.contains(HttpHeaderNames.HOST)).thenReturn(false) HttpRequest request = mock(HttpRequest.class); - when(request.getUri()).thenReturn('http://www.yahoo.com?param=someValue'); + when(request.uri()).thenReturn('http://www.yahoo.com?param=someValue'); when(request.headers()).thenReturn(mockHeaders) Collection rewriteRules = ImmutableList.of( @@ -78,13 +79,13 @@ class RewriteUrlFilterTest extends MockServerTest { when(mockIsHttpsAttribute.get()).thenReturn(Boolean.FALSE) ChannelHandlerContext mockCtx = mock(ChannelHandlerContext) - when(mockCtx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.IS_HTTPS_ATTRIBUTE_NAME))) + when(mockCtx.attr(AttributeKey. valueOf(HttpsAwareFiltersAdapter.IS_HTTPS_ATTRIBUTE_NAME))) .thenReturn(mockIsHttpsAttribute) RewriteUrlFilter filter = new RewriteUrlFilter(request, mockCtx, rewriteRules); filter.clientToProxyRequest(request); - verify(request).setUri('http://www.google.com?originalDomain=bing&newparam=newsomeValue'); + verify(request).setUri("http://www.google.com?originalDomain=bing&newparam=newsomeValue"); } @Test diff --git a/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy b/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy index 22dd101bb..55fae8ce0 100644 --- a/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy +++ b/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy @@ -38,8 +38,8 @@ class WhitelistTest extends MockServerTest { void testWhitelistCannotShortCircuitCONNECT() { HttpRequest request = mock(HttpRequest.class) when(request.getMethod()).thenReturn(HttpMethod.CONNECT) - when(request.getUri()).thenReturn('somedomain.com:443') - when(request.getProtocolVersion()).thenReturn(HttpVersion.HTTP_1_1) + when(request.uri()).thenReturn('somedomain.com:443') + when(request.protocolVersion()).thenReturn(HttpVersion.HTTP_1_1) // create a whitelist filter that whitelists no requests (i.e., all requests should return the specified HTTP 500 status code) WhitelistFilter filter = new WhitelistFilter(request, null, true, 500, []) diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java index ac1c437cc..64cae3581 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java @@ -1,14 +1,7 @@ package net.lightbody.bmp.proxy; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.DefaultHttpResponse; -import io.netty.handler.codec.http.FullHttpResponse; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpMethod; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.BrowserMobProxy; import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.filters.RequestFilter; @@ -42,12 +35,7 @@ import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; @@ -84,7 +72,7 @@ public void testCanShortCircuitResponse() throws IOException { proxy.start(); final AtomicBoolean interceptorFired = new AtomicBoolean(false); - final AtomicBoolean shortCircuitFired= new AtomicBoolean(false); + final AtomicBoolean shortCircuitFired = new AtomicBoolean(false); proxy.addFirstHttpFilterFactory(new HttpFiltersSourceAdapter() { @Override @@ -160,7 +148,7 @@ public void testCanModifyRequest() throws IOException { Times.exactly(1)) .respond(response() .withStatusCode(200) - .withHeader(new Header(HttpHeaders.Names.CONTENT_TYPE, "text/plain; charset=utf-8")) + .withHeader(new Header(HttpHeaderNames.CONTENT_TYPE.toString(), "text/plain; charset=utf-8")) .withBody("success")); proxy = new BrowserMobProxyServer(); @@ -174,7 +162,7 @@ public HttpFilters filterRequest(HttpRequest originalRequest) { public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (httpObject instanceof HttpRequest) { HttpRequest httpRequest = (HttpRequest) httpObject; - httpRequest.setUri(httpRequest.getUri().replace("/originalrequest", "/modifyrequest")); + httpRequest.setUri(httpRequest.uri().replace("/originalrequest", "/modifyrequest")); } return super.clientToProxyRequest(httpObject); @@ -209,17 +197,14 @@ public void testRequestFilterCanModifyHttpRequestBody() throws IOException { proxy = new BrowserMobProxyServer(); proxy.start(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (contents.isText()) { - if (contents.getTextContents().equals(originalText)) { - contents.setTextContents(newText); - } + proxy.addRequestFilter((request, contents, messageInfo) -> { + if (contents.isText()) { + if (contents.getTextContents().equals(originalText)) { + contents.setTextContents(newText); } - - return null; } + + return null; }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { @@ -251,17 +236,14 @@ public void testRequestFilterCanModifyHttpsRequestBody() throws IOException { proxy.setTrustAllServers(true); proxy.start(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (contents.isText()) { - if (contents.getTextContents().equals(originalText)) { - contents.setTextContents(newText); - } + proxy.addRequestFilter((request, contents, messageInfo) -> { + if (contents.isText()) { + if (contents.getTextContents().equals(originalText)) { + contents.setTextContents(newText); } - - return null; } + + return null; }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { @@ -277,8 +259,8 @@ public HttpResponse filterRequest(HttpRequest request, HttpMessageContents conte @Test public void testResponseFilterCanModifyBinaryContents() throws IOException { - final byte[] originalBytes = new byte[] {1, 2, 3, 4, 5}; - final byte[] newBytes = new byte[] {20, 30, 40, 50, 60}; + final byte[] originalBytes = new byte[]{1, 2, 3, 4, 5}; + final byte[] newBytes = new byte[]{20, 30, 40, 50, 60}; mockServer.when(request() .withMethod("GET") @@ -286,19 +268,16 @@ public void testResponseFilterCanModifyBinaryContents() throws IOException { Times.exactly(1)) .respond(response() .withStatusCode(200) - .withHeader(new Header(HttpHeaders.Names.CONTENT_TYPE, "application/octet-stream")) + .withHeader(new Header(HttpHeaderNames.CONTENT_TYPE.toString(), "application/octet-stream")) .withBody(originalBytes)); proxy = new BrowserMobProxyServer(); proxy.start(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (!contents.isText()) { - if (Arrays.equals(originalBytes, contents.getBinaryContents())) { - contents.setBinaryContents(newBytes); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + if (!contents.isText()) { + if (Arrays.equals(originalBytes, contents.getBinaryContents())) { + contents.setBinaryContents(newBytes); } } }); @@ -324,19 +303,16 @@ public void testResponseFilterCanModifyHttpTextContents() throws IOException { Times.exactly(1)) .respond(response() .withStatusCode(200) - .withHeader(new Header(HttpHeaders.Names.CONTENT_TYPE, "text/plain; charset=utf-8")) + .withHeader(new Header(HttpHeaderNames.CONTENT_TYPE.toString(), "text/plain; charset=utf-8")) .withBody(originalText)); proxy = new BrowserMobProxyServer(); proxy.start(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (contents.isText()) { - if (contents.getTextContents().equals(originalText)) { - contents.setTextContents(newText); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + if (contents.isText()) { + if (contents.getTextContents().equals(originalText)) { + contents.setTextContents(newText); } } }); @@ -363,20 +339,17 @@ public void testResponseFilterCanModifyHttpsTextContents() throws IOException { Times.exactly(1)) .respond(response() .withStatusCode(200) - .withHeader(new Header(HttpHeaders.Names.CONTENT_TYPE, "text/plain; charset=utf-8")) + .withHeader(new Header(HttpHeaderNames.CONTENT_TYPE.toString(), "text/plain; charset=utf-8")) .withBody(originalText)); proxy = new BrowserMobProxyServer(); proxy.setTrustAllServers(true); proxy.start(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (contents.isText()) { - if (contents.getTextContents().equals(originalText)) { - contents.setTextContents(newText); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + if (contents.isText()) { + if (contents.getTextContents().equals(originalText)) { + contents.setTextContents(newText); } } }); @@ -400,19 +373,14 @@ public void testResponseInterceptorWithoutBody() throws IOException { Times.exactly(1)) .respond(response() .withStatusCode(200) - .withHeader(new Header(HttpHeaders.Names.CONTENT_TYPE, "application/octet-stream"))); + .withHeader(new Header(HttpHeaderNames.CONTENT_TYPE.toString(), "application/octet-stream"))); proxy = new BrowserMobProxyServer(); proxy.start(); final AtomicReference responseContents = new AtomicReference<>(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - responseContents.set(contents.getBinaryContents()); - } - }); + proxy.addResponseFilter((response, contents, messageInfo) -> responseContents.set(contents.getBinaryContents())); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { CloseableHttpResponse response = httpClient.execute(new HttpHead("http://localhost:" + mockServerPort + "/interceptortest")); @@ -435,25 +403,17 @@ public void testResponseFilterOriginalRequestNotModified() throws IOException { proxy = new BrowserMobProxyServer(); proxy.start(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (request.getUri().endsWith("/originalendpoint")) { - request.setUri(request.getUri().replaceAll("originalendpoint", "modifiedendpoint")); - } - - return null; + proxy.addRequestFilter((request, contents, messageInfo) -> { + if (request.uri().endsWith("/originalendpoint")) { + request.setUri(request.uri().replaceAll("originalendpoint", "modifiedendpoint")); } + + return null; }); final AtomicReference originalRequestUri = new AtomicReference<>(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - originalRequestUri.set(messageInfo.getOriginalRequest().getUri()); - } - }); + proxy.addResponseFilter((response, contents, messageInfo) -> originalRequestUri.set(messageInfo.getOriginalRequest().uri())); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { CloseableHttpResponse response = httpClient.execute(new HttpGet("http://localhost:" + mockServerPort + "/originalendpoint")); @@ -479,23 +439,17 @@ public void testMessageContentsNotAvailableWithoutAggregation() throws IOExcepti final AtomicBoolean requestContentsNull = new AtomicBoolean(false); final AtomicBoolean responseContentsNull = new AtomicBoolean(false); - proxy.addFirstHttpFilterFactory(new RequestFilterAdapter.FilterSource(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (contents == null) { - requestContentsNull.set(true); - } - - return null; + proxy.addFirstHttpFilterFactory(new RequestFilterAdapter.FilterSource((request, contents, messageInfo) -> { + if (contents == null) { + requestContentsNull.set(true); } + + return null; }, 0)); - proxy.addFirstHttpFilterFactory(new ResponseFilterAdapter.FilterSource(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (contents == null) { - responseContentsNull.set(true); - } + proxy.addFirstHttpFilterFactory(new ResponseFilterAdapter.FilterSource((response, contents, messageInfo) -> { + if (contents == null) { + responseContentsNull.set(true); } }, 0)); @@ -526,16 +480,13 @@ public void testMitmDisabledHttpsRequestFilterNotAvailable() throws IOException final AtomicBoolean connectRequestFilterFired = new AtomicBoolean(false); final AtomicBoolean getRequestFilterFired = new AtomicBoolean(false); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (request.getMethod().equals(HttpMethod.CONNECT)) { - connectRequestFilterFired.set(true); - } else if (request.getMethod().equals(HttpMethod.GET)) { - getRequestFilterFired.set(true); - } - return null; + proxy.addRequestFilter((request, contents, messageInfo) -> { + if (request.method().equals(HttpMethod.CONNECT)) { + connectRequestFilterFired.set(true); + } else if (request.method().equals(HttpMethod.GET)) { + getRequestFilterFired.set(true); } + return null; }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { @@ -569,12 +520,7 @@ public void testMitmDisabledHttpsResponseFilterNotAvailable() throws IOException final AtomicBoolean responseFilterFired = new AtomicBoolean(false); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - responseFilterFired.set(true); - } - }); + proxy.addResponseFilter((response, contents, messageInfo) -> responseFilterFired.set(true)); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { CloseableHttpResponse response = httpClient.execute(new HttpGet("https://localhost:" + mockServerPort + "/mitmdisabled")); @@ -594,7 +540,7 @@ private void testModifiedResponse(final String originalText, final String newTex Times.exactly(1)) .respond(response() .withStatusCode(200) - .withHeader(new Header(HttpHeaders.Names.CONTENT_TYPE, "text/plain; charset=utf-8")) + .withHeader(new Header(HttpHeaderNames.CONTENT_TYPE.toString(), "text/plain; charset=utf-8")) .withBody(originalText)); proxy = new BrowserMobProxyServer(); @@ -718,16 +664,13 @@ public void testHttpResponseFilterMessageInfoPopulated() throws IOException { final AtomicReference requestFilterOriginalUrl = new AtomicReference<>(); final AtomicReference requestFilterUrl = new AtomicReference<>(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - requestCtx.set(messageInfo.getChannelHandlerContext()); - requestOriginalRequest.set(messageInfo.getOriginalRequest()); - requestIsHttps.set(messageInfo.isHttps()); - requestFilterOriginalUrl.set(messageInfo.getOriginalUrl()); - requestFilterUrl.set(messageInfo.getUrl()); - return null; - } + proxy.addRequestFilter((request, contents, messageInfo) -> { + requestCtx.set(messageInfo.getChannelHandlerContext()); + requestOriginalRequest.set(messageInfo.getOriginalRequest()); + requestIsHttps.set(messageInfo.isHttps()); + requestFilterOriginalUrl.set(messageInfo.getOriginalUrl()); + requestFilterUrl.set(messageInfo.getUrl()); + return null; }); final AtomicReference responseCtx = new AtomicReference<>(); @@ -736,15 +679,12 @@ public HttpResponse filterRequest(HttpRequest request, HttpMessageContents conte final AtomicReference responseFilterOriginalUrl = new AtomicReference<>(); final AtomicReference responseFilterUrl = new AtomicReference<>(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - responseCtx.set(messageInfo.getChannelHandlerContext()); - responseOriginalRequest.set(messageInfo.getOriginalRequest()); - responseIsHttps.set(messageInfo.isHttps()); - responseFilterOriginalUrl.set(messageInfo.getOriginalUrl()); - responseFilterUrl.set(messageInfo.getUrl()); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + responseCtx.set(messageInfo.getChannelHandlerContext()); + responseOriginalRequest.set(messageInfo.getOriginalRequest()); + responseIsHttps.set(messageInfo.isHttps()); + responseFilterOriginalUrl.set(messageInfo.getOriginalUrl()); + responseFilterUrl.set(messageInfo.getUrl()); }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { @@ -782,37 +722,28 @@ public void testHttpResponseFilterUrlReflectsModifications() throws IOException final AtomicReference requestFilterOriginalUrl = new AtomicReference<>(); final AtomicReference requestFilterUrl = new AtomicReference<>(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - requestFilterOriginalUrl.set(messageInfo.getOriginalUrl()); - requestFilterUrl.set(messageInfo.getUrl()); - return null; - } + proxy.addRequestFilter((request, contents, messageInfo) -> { + requestFilterOriginalUrl.set(messageInfo.getOriginalUrl()); + requestFilterUrl.set(messageInfo.getUrl()); + return null; }); // request filters get added to the beginning of the filter chain, so add this uri-modifying request filter after // adding the capturing request filter above. - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (request.getUri().endsWith("/originalurl")) { - String newUrl = request.getUri().replaceAll("originalurl", "urlreflectsmodifications"); - request.setUri(newUrl); - } - return null; + proxy.addRequestFilter((request, contents, messageInfo) -> { + if (request.uri().endsWith("/originalurl")) { + String newUrl = request.uri().replaceAll("originalurl", "urlreflectsmodifications"); + request.setUri(newUrl); } + return null; }); final AtomicReference responseFilterOriginalUrl = new AtomicReference<>(); final AtomicReference responseFilterUrl = new AtomicReference<>(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - responseFilterOriginalUrl.set(messageInfo.getOriginalUrl()); - responseFilterUrl.set(messageInfo.getUrl()); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + responseFilterOriginalUrl.set(messageInfo.getOriginalUrl()); + responseFilterUrl.set(messageInfo.getUrl()); }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { @@ -846,37 +777,28 @@ public void testHttpsResponseFilterUrlReflectsModifications() throws IOException final AtomicReference requestFilterOriginalUrl = new AtomicReference<>(); final AtomicReference requestFilterUrl = new AtomicReference<>(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - requestFilterOriginalUrl.set(messageInfo.getOriginalUrl()); - requestFilterUrl.set(messageInfo.getUrl()); - return null; - } + proxy.addRequestFilter((request, contents, messageInfo) -> { + requestFilterOriginalUrl.set(messageInfo.getOriginalUrl()); + requestFilterUrl.set(messageInfo.getUrl()); + return null; }); // request filters get added to the beginning of the filter chain, so add this uri-modifying request filter after // adding the capturing request filter above. - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - if (request.getUri().endsWith("/originalurl")) { - String newUrl = request.getUri().replaceAll("originalurl", "urlreflectsmodifications"); - request.setUri(newUrl); - } - return null; + proxy.addRequestFilter((request, contents, messageInfo) -> { + if (request.uri().endsWith("/originalurl")) { + String newUrl = request.uri().replaceAll("originalurl", "urlreflectsmodifications"); + request.setUri(newUrl); } + return null; }); final AtomicReference responseFilterOriginalUrl = new AtomicReference<>(); final AtomicReference responseFilterUrl = new AtomicReference<>(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - responseFilterOriginalUrl.set(messageInfo.getOriginalUrl()); - responseFilterUrl.set(messageInfo.getUrl()); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + responseFilterOriginalUrl.set(messageInfo.getOriginalUrl()); + responseFilterUrl.set(messageInfo.getUrl()); }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { @@ -913,15 +835,12 @@ public void testHttpsResponseFilterMessageInfoPopulated() throws IOException { final AtomicBoolean requestIsHttps = new AtomicBoolean(false); final AtomicReference requestOriginalUrl = new AtomicReference<>(); - proxy.addRequestFilter(new RequestFilter() { - @Override - public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) { - requestCtx.set(messageInfo.getChannelHandlerContext()); - requestOriginalRequest.set(messageInfo.getOriginalRequest()); - requestIsHttps.set(messageInfo.isHttps()); - requestOriginalUrl.set(messageInfo.getOriginalUrl()); - return null; - } + proxy.addRequestFilter((request, contents, messageInfo) -> { + requestCtx.set(messageInfo.getChannelHandlerContext()); + requestOriginalRequest.set(messageInfo.getOriginalRequest()); + requestIsHttps.set(messageInfo.isHttps()); + requestOriginalUrl.set(messageInfo.getOriginalUrl()); + return null; }); final AtomicReference responseCtx = new AtomicReference<>(); @@ -929,14 +848,11 @@ public HttpResponse filterRequest(HttpRequest request, HttpMessageContents conte final AtomicBoolean responseIsHttps = new AtomicBoolean(false); final AtomicReference responseOriginalUrl = new AtomicReference<>(); - proxy.addResponseFilter(new ResponseFilter() { - @Override - public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { - responseCtx.set(messageInfo.getChannelHandlerContext()); - responseOriginalRequest.set(messageInfo.getOriginalRequest()); - responseIsHttps.set(messageInfo.isHttps()); - responseOriginalUrl.set(messageInfo.getOriginalUrl()); - } + proxy.addResponseFilter((response, contents, messageInfo) -> { + responseCtx.set(messageInfo.getChannelHandlerContext()); + responseOriginalRequest.set(messageInfo.getOriginalRequest()); + responseIsHttps.set(messageInfo.isHttps()); + responseOriginalUrl.set(messageInfo.getOriginalUrl()); }); try (CloseableHttpClient httpClient = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 50dd76636..d206cfba6 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -1,9 +1,10 @@ - + browsermob-proxy net.lightbody.bmp - 2.1.12 + 2.1.18-SNAPSHOT 4.0.0 @@ -39,6 +40,12 @@ org.apache.logging.log4j log4j-api + + + biz.paluch.logging + logstash-gelf + + org.apache.logging.log4j log4j-core @@ -98,7 +105,18 @@ org.apache.maven.plugins maven-shade-plugin - 3.0.0 + 3.2.0 + + false + + + *:* + + **/Log4j2Plugins.dat + + + + package @@ -117,7 +135,10 @@ - + + net.lightbody.bmp.proxy.Main @@ -125,6 +146,13 @@ + + + com.github.edwgiz + maven-shade-plugin.log4j2-cachefile-transformer + 2.8.1 + + maven-assembly-plugin diff --git a/browsermob-dist/src/main/resources/bmp-logging.yaml b/browsermob-dist/src/main/resources/bmp-logging.yaml index 3114ff47f..02b676ce9 100644 --- a/browsermob-dist/src/main/resources/bmp-logging.yaml +++ b/browsermob-dist/src/main/resources/bmp-logging.yaml @@ -8,30 +8,41 @@ configuration: name: console target: SYSTEM_OUT PatternLayout: - pattern: "[%-5level %date{ISO8601} %logger] (%thread) %msg %xThrowable%n" - file: - - - name: file - fileName: bmp.log - PatternLayout: - pattern: "[%-5level %date{ISO8601} %logger] (%thread) %msg %xThrowable%n" - append: false + pattern: "[%-5level %date{ISO8601} %c{1}] %msg %xThrowable%n" + gelf: + - name: gelf + host: tcp:graylog-input.staging.hellofresh.io + port: 12204 + filterStackTrace: true + mdcProfiling: true + includeFullMdc: true + facility: mobproxy + version: 1.1 + originHost: "%host{fqdn}" + maximumMessageSize: "8192" + extractStackTrace: false + Field: + - name: simpleClassName + pattern: "%C{1}" + - name: server + pattern: "%host" + - name: timestamp + pattern: "%date{ISO8601}" + + loggers: logger: - - - name: net.lightbody.bmp.proxy.jetty.util.ThreadedServer - level: warn + - name: net.lightbody.bmp.proxy.jetty.util.ThreadedServer + level: fatal additivity: false - - - name: net.lightbody.bmp + - name: org.littleshoot.proxy # to suppress unwanted BMP logging statements, set the level below for the source logger to WARN or ERROR. # to enable more verbose logging, set the level to DEBUG or TRACE. - level: info + level: fatal + root: # to suppress unwanted logging statements globally, set the level below to WARN or ERROR. - level: info + level: error appender-ref: - - - ref: console - - - ref: file \ No newline at end of file + - ref: console + - ref: gelf \ No newline at end of file diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 01fc10dcf..770422428 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12 + 2.1.18-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index efaedf3bb..6c597b813 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12 + 2.1.18-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 975a25007..bf5609966 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.12 + 2.1.18-SNAPSHOT 4.0.0 diff --git a/mitm/src/main/java/net/lightbody/bmp/util/HttpUtil.java b/mitm/src/main/java/net/lightbody/bmp/util/HttpUtil.java index 2cc2a2158..3e927df0c 100644 --- a/mitm/src/main/java/net/lightbody/bmp/util/HttpUtil.java +++ b/mitm/src/main/java/net/lightbody/bmp/util/HttpUtil.java @@ -1,6 +1,7 @@ package net.lightbody.bmp.util; import com.google.common.net.HostAndPort; +import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; @@ -24,9 +25,9 @@ public static String getHostFromRequest(HttpRequest httpRequest) { // try to use the URI from the request first, if the URI starts with http:// or https://. checking for http/https avoids confusing // java's URI class when the request is for a malformed URL like '//some-resource'. String host = null; - if (startsWithHttpOrHttps(httpRequest.getUri())) { + if (startsWithHttpOrHttps(httpRequest.uri())) { try { - URI uri = new URI(httpRequest.getUri()); + URI uri = new URI(httpRequest.uri()); host = uri.getHost(); } catch (URISyntaxException e) { } @@ -48,9 +49,9 @@ public static String getHostFromRequest(HttpRequest httpRequest) { * @return host and port of the request */ public static String getHostAndPortFromRequest(HttpRequest httpRequest) { - if (startsWithHttpOrHttps(httpRequest.getUri())) { + if (startsWithHttpOrHttps(httpRequest.uri())) { try { - return getHostAndPortFromUri(httpRequest.getUri()); + return getHostAndPortFromUri(httpRequest.uri()); } catch (URISyntaxException e) { // the URI could not be parsed, so return the host and port in the Host header } @@ -106,7 +107,7 @@ public static String getHostAndPortFromUri(String uriString) throws URISyntaxExc */ private static String parseHostHeader(HttpRequest httpRequest, boolean includePort) { // this header parsing logic is adapted from ClientToProxyConnection#identifyHostAndPort. - List hosts = httpRequest.headers().getAll(HttpHeaders.Names.HOST); + List hosts = httpRequest.headers().getAll(HttpHeaderNames.HOST); if (!hosts.isEmpty()) { String hostAndPort = hosts.get(0); diff --git a/pom.xml b/pom.xml index c3853bd5e..33e9159de 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.12 + 2.1.18-SNAPSHOT browsermob-core browsermob-legacy @@ -82,10 +82,11 @@ 3.141.59 2.8.9 + 1.13.0 3.1.1 - 2.9.0 + 2.11.2 2.5.6 2.5.6-01 @@ -245,6 +246,12 @@ ${slf4j.version} + + biz.paluch.logging + logstash-gelf + ${logstash-gelf.version} + + com.google.guava guava @@ -282,7 +289,12 @@ org.mockito mockito-core - 2.8.47 + 2.25.0 + + + net.bytebuddy + byte-buddy + 1.9.10 From d17785041fbf20352e3fa0c1f9d263c2799a8cf0 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Tue, 19 Mar 2019 17:08:54 +0100 Subject: [PATCH 14/41] promote browser mob, and fix logs duplication (#13) * promote browser mob, and fix logs duplication * promote browser mob, and fix logs duplication * Remove all unused code * Snapshot commit --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../bmp/filters/HarCaptureFilter.java | 4 +- browsermob-dist/pom.xml | 2 +- .../src/main/resources/bmp-logging.yaml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 18 +- resources/jar/littleproxy-1.1.3.pom | 720 ------------------ 10 files changed, 12 insertions(+), 744 deletions(-) delete mode 100644 resources/jar/littleproxy-1.1.3.pom diff --git a/README.md b/README.md index a0f2232bf..cbab22ab8 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 6cde3686c..c00c7f15d 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index d2e34ca29..46b62841e 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -48,6 +48,7 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); private static final ThreadLocal statsDClient = new InheritableThreadLocal<>(); + private static final ThreadLocal isAlreadyLoggedIn = InheritableThreadLocal.withInitial(() -> false); /** * The currently active HAR at the time the current request is received. @@ -776,7 +777,7 @@ public void serverToProxyResponseReceived() { } private void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - if (response.getStatus() >= 500 || response.getStatus() == 0) { + if (!isAlreadyLoggedIn.get() && (response.getStatus() >= 500 || response.getStatus() == 0)) { MDC.put("caller", "mobproxy"); MDC.put("http_response_code", String.valueOf(response.getStatus())); MDC.put("http_host", request.getUrl()); @@ -784,6 +785,7 @@ private void logFailedRequestIfRequired(HarRequest request, HarResponse response MDC.put("method", request.getMethod()); MDC.put("response", BeansJsonMapper.getJsonString(response)); log.error("received bad status code"); + isAlreadyLoggedIn.set(true); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index d206cfba6..24e6cc1b3 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT 4.0.0 diff --git a/browsermob-dist/src/main/resources/bmp-logging.yaml b/browsermob-dist/src/main/resources/bmp-logging.yaml index 02b676ce9..1a237ce8b 100644 --- a/browsermob-dist/src/main/resources/bmp-logging.yaml +++ b/browsermob-dist/src/main/resources/bmp-logging.yaml @@ -11,7 +11,7 @@ configuration: pattern: "[%-5level %date{ISO8601} %c{1}] %msg %xThrowable%n" gelf: - name: gelf - host: tcp:graylog-input.staging.hellofresh.io + host: tcp:localhost port: 12204 filterStackTrace: true mdcProfiling: true diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 770422428..a046301c9 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 6c597b813..615658ecf 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index bf5609966..9926a10e6 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 33e9159de..e86ef0cec 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.18-SNAPSHOT + 2.1.19-SNAPSHOT browsermob-core browsermob-legacy @@ -46,20 +46,7 @@ git@github.com:lightbody/browsermob-proxy.git HEAD - - - - central - artifactory-artifactory-0-releases - https://artifactory.tools-k8s.hellofresh.io/artifactory/maven - - - snapshots - artifactory-artifactory-0-snapshots - https://artifactory.tools-k8s.hellofresh.io/artifactory/maven - - - + bintray @@ -195,7 +182,6 @@ littleproxy 1.1.3 jar - ${basedir}/resources/jar/littleproxy-1.1.3.pom install-file diff --git a/resources/jar/littleproxy-1.1.3.pom b/resources/jar/littleproxy-1.1.3.pom deleted file mode 100644 index 2759b9df0..000000000 --- a/resources/jar/littleproxy-1.1.3.pom +++ /dev/null @@ -1,720 +0,0 @@ - - 4.0.0 - org.littleshoot - littleproxy - jar - 1.1.3 - LittleProxy - - LittleProxy is a high performance HTTP proxy written in Java and using the Netty networking framework. - - http://littleproxy.org - - - UTF-8 - UTF-8 - github - 4.1.33.Final - 1.7.24 - 1.8 - - - - LittleShoot - http://littleproxy.org - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0 - - - - - - http://groups.google.com/group/littleproxy - littleproxy - littleproxy@googlegroups.com - http://groups.google.com/group/littleproxy - littleproxy+unsubscribe@googlegroups.com - - - - - github - https://github.com/adamfisk/LittleProxy/issues - - - - scm:git:https://adamfisk@github.com/adamfisk/LittleProxy.git - scm:git:git@github.com:adamfisk/LittleProxy - scm:git:git@github.com:adamfisk/LittleProxy.git - HEAD - - - - - central - artifactory-artifactory-0-releases - https://artifactory.tools-k8s.hellofresh.io/artifactory/maven - - - snapshots - artifactory-artifactory-0-snapshots - https://artifactory.tools-k8s.hellofresh.io/artifactory/maven - - - - 2009 - - - - - doclint-java8-disable - - [1.8,) - - - -Xdoclint:none - - - - doclint-java7-earlier - - [,1.8) - - - - - - - - release - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - true - - - - org.apache.maven.plugins - maven-source-plugin - 3.0.1 - - - attach-sources - package - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.4 - - ${java.version} - - ${javadoc.opts} - - - - attach-javadocs - package - - jar - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - ossrh - https://oss.sonatype.org/ - false - - - - org.apache.maven.plugins - maven-release-plugin - 2.5.3 - - true - false - release - deploy - - - - - - - - netty-4.1 - - 4.1.8.Final - - - - - - - com.google.guava - guava - 27.0.1-jre - - - - commons-cli - commons-cli - 1.4 - - true - - - - org.apache.commons - commons-lang3 - 3.8.1 - - - - junit - junit - 4.12 - test - - - - org.hamcrest - hamcrest-core - 1.3 - test - - - - org.hamcrest - hamcrest-library - 1.3 - test - - - - org.eclipse.jetty - jetty-server - 9.4.15.v20190215 - test - - - - org.mockito - mockito-core - 2.7.12 - test - - - - org.mock-server - mockserver-netty - 5.5.1 - test - - - ch.qos.logback - logback-classic - - - - - - org.seleniumhq.selenium - selenium-java - 3.141.59 - test - - - io.netty - netty - - - - - - log4j - log4j - 1.2.17 - true - - - - org.apache.httpcomponents - httpclient - 4.5.7 - test - - - - io.netty - netty-all - - - - com.barchart.udt - barchart-udt-bundle - 2.3.0 - - - - org.littleshoot - dnssec4j - 0.1.6 - true - - - org.littleshoot - dnsjava - - - - - - dnsjava - dnsjava - 2.1.8 - true - - - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - true - - - - org.slf4j - slf4j-api - ${slf4j.version} - - - - - org.apache.commons - commons-exec - 1.3 - test - - - - - - - - - io.netty - netty-all - ${netty.version} - - - io.netty - netty-buffer - ${netty.version} - - - io.netty - netty-codec - ${netty.version} - - - io.netty - netty-codec-haproxy - ${netty.version} - - - io.netty - netty-codec-http - ${netty.version} - - - io.netty - netty-codec-socks - ${netty.version} - - - io.netty - netty-common - ${netty.version} - - - io.netty - netty-handler - ${netty.version} - - - io.netty - netty-transport - ${netty.version} - - - io.netty - netty-transport-rxtx - ${netty.version} - - - io.netty - netty-transport-sctp - ${netty.version} - - - io.netty - netty-transport-udp - ${netty.version} - - - io.netty - netty-example - ${netty.version} - - - - - - 3.0.4 - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - 1.4.1 - - - - org.apache.maven.plugins - maven-site-plugin - 3.6 - - - - org.apache.maven.plugins - maven-release-plugin - 2.5.3 - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.10 - - - - org.apache.maven.plugins - maven-clean-plugin - 3.0.0 - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.2 - - - - org.apache.maven.plugins - maven-install-plugin - 2.5.2 - - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.2 - - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - -Xmx1g -XX:MaxPermSize=256m - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.0 - - ${java.version} - ${java.version} - UTF-8 - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.4 - - private - ${java.version} - - http://netty.io/4.0/api/ - - - ${javadoc.opts} - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - - package - - shade - - - true - littleproxy-shade - - - org.bouncycastle:* - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - org.littleshoot.proxy.Launcher - - - - log4j.xml - src/main/config/log4j.xml - - - - - - - - - - - - - org.apache.maven.plugins - maven-site-plugin - 3.4 - - - - maven-dependency-plugin - 2.10 - - - - analyze-report - - - - - - org.apache.maven.plugins - maven-project-info-reports-plugin - 2.9 - - true - true - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.3 - - private - ${java.version} - - http://netty.io/4.0/api/ - - - ${javadoc.opts} - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.19.1 - - false - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.17 - - - org.apache.maven.plugins - maven-changelog-plugin - 2.3 - - - org.apache.maven.plugins - maven-changes-plugin - 2.12.1 - - - - github-report - - - - - - org.codehaus.mojo - findbugs-maven-plugin - 3.0.4 - - - - - - org.apache.maven.plugins - maven-jxr-plugin - 2.5 - - - org.apache.maven.plugins - maven-pmd-plugin - 3.7 - - true - utf-8 - 100 - ${java.version} - - - - org.codehaus.mojo - cobertura-maven-plugin - 2.7 - - - org.codehaus.mojo - versions-maven-plugin - 2.3 - - - - dependency-updates-report - plugin-updates-report - property-updates-report - - - - - - - - org.codehaus.mojo - taglist-maven-plugin - 2.4 - - true - - mudo - todo - idea - MUDO - TODO - IDEA - - - - - - - - - afisk - Adam fisk - a@littleshoot.org - LittleShoot - http://www.littleshoot.org/ - - Developer - - -5 - - - - ox.to.a.cart - Ox Cart - ox@getlantern.org - GetLantern - https://www.getlantern.org/ - - Developer - - -5 - - - From b44c839f29b68e0ec54f10e24b85b28f31f919ca Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 25 Mar 2019 12:23:30 +0100 Subject: [PATCH 15/41] BMP and little proxy promote (#14) * BMP and little proxy promote * Pormote snapshot --- README.md | 2 +- browsermob-core/pom.xml | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 20 +++++++++--------- ...eproxy-1.1.3.jar => littleproxy-1.1.4.jar} | Bin 130385 -> 130381 bytes 8 files changed, 16 insertions(+), 16 deletions(-) rename resources/jar/{littleproxy-1.1.3.jar => littleproxy-1.1.4.jar} (85%) diff --git a/README.md b/README.md index cbab22ab8..939d1ceff 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index c00c7f15d..fd600d3e9 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT 4.0.0 diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 24e6cc1b3..25ae96448 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index a046301c9..2b6696cd4 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 615658ecf..f05d352c6 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 9926a10e6..eeef1dcab 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index e86ef0cec..83dc06f58 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.19-SNAPSHOT + 2.1.20-SNAPSHOT browsermob-core browsermob-legacy @@ -65,7 +65,7 @@ UTF-8 UTF-8 - 1.7.25 + 1.7.26 3.141.59 2.8.9 @@ -78,9 +78,9 @@ 2.5.6 2.5.6-01 - 4.1.33.Final + 4.1.34.Final - 4.1.33.Final + 4.1.34.Final 1.61 3.0.1 @@ -169,18 +169,18 @@ org.apache.maven.plugins maven-install-plugin - 2.5.2 + 3.0.0-M1 install-external false install - ${basedir}/resources/jar/littleproxy-1.1.3.jar + ${basedir}/resources/jar/littleproxy-1.1.4.jar default org.littleshoot littleproxy - 1.1.3 + 1.1.4 jar @@ -192,7 +192,7 @@ org.apache.maven.plugins maven-deploy-plugin - 2.8.2 + 3.0.0-M1 org.apache.maven.plugins @@ -202,7 +202,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.0.0 + 3.1.1 @@ -308,7 +308,7 @@ org.littleshoot littleproxy - 1.1.3 + 1.1.4 diff --git a/resources/jar/littleproxy-1.1.3.jar b/resources/jar/littleproxy-1.1.4.jar similarity index 85% rename from resources/jar/littleproxy-1.1.3.jar rename to resources/jar/littleproxy-1.1.4.jar index d581142bd9e13d24aec4aef32d73611a30f983b8..53627e2dadca2a007b4137fcf296649de2297de2 100644 GIT binary patch delta 7418 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 ZLYe~{JR4v><8b!ymsSeigedhM_dkHvFtq>x delta 7381 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 From 22afbd3bfd360e74722a7bfd97a70b45006d7553 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Tue, 2 Apr 2019 11:20:22 +0200 Subject: [PATCH 16/41] initial commit (#15) * initial commit * promote poms * promote poms * promote poms * revert jetty * One more part done * one moe small change * one more small improvement * Snapshot version promotion * small changes in har * pormote snapshot --- README.md | 2 +- browsermob-core/pom.xml | 6 +- .../lightbody/bmp/core/har/HarRequest.java | 39 + .../bmp/filters/AutoBasicAuthFilter.java | 7 +- .../filters/ClientRequestCaptureFilter.java | 9 +- .../bmp/filters/HarCaptureFilter.java | 24 +- .../bmp/util/BrowserMobHttpUtil.java | 20 +- .../proxy/dns/ChainedHostResolverTest.java | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 15 +- .../proxy/http/TrustingSSLSocketFactory.java | 13 +- .../bmp/proxy/jetty/jetty/Server.java | 631 ++++---- .../jetty/jetty/servlet/ServletHandler.java | 1349 +++++++++-------- .../jetty/servlet/ServletHttpRequest.java | 862 ++++++----- .../jetty/servlet/ServletHttpResponse.java | 28 +- .../proxy/jetty/jetty/servlet/ServletIn.java | 68 +- .../proxy/jetty/jetty/servlet/ServletOut.java | 74 +- .../bmp/proxy/jetty/util/Container.java | 302 ++-- .../bmp/util/DeleteDirectoryTask.java | 4 +- .../java/net/lightbody/bmp/proxy/HarTest.java | 612 ++++---- .../bmp/proxy/MailingListIssuesTest.java | 7 +- .../bmp/proxy/test/util/LocalServer.java | 16 +- browsermob-rest/pom.xml | 12 +- .../bmp/proxy/guice/JettyServerProvider.java | 11 +- mitm/pom.xml | 2 +- pom.xml | 6 +- 26 files changed, 2135 insertions(+), 1988 deletions(-) diff --git a/README.md b/README.md index 939d1ceff..429d6e8fb 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index fd600d3e9..943519f11 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT 4.0.0 @@ -14,7 +14,7 @@ BrowserMob Proxy Core (LittleProxy) Module - 7.6.16.v20140903 + 9.4.15.v20190215 @@ -42,7 +42,7 @@ org.apache.maven.plugins maven-surefire-plugin - -Xmx1g -XX:MaxPermSize=256m + -Xmx1g diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java index 845c75780..4e549ad77 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/core/har/HarRequest.java @@ -1,6 +1,8 @@ package net.lightbody.bmp.core.har; import com.fasterxml.jackson.annotation.JsonInclude; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -95,4 +97,41 @@ public void setComment(String comment) { this.comment = comment; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + HarRequest that = (HarRequest) o; + + return new EqualsBuilder() + .append(headersSize, that.headersSize) + .append(bodySize, that.bodySize) + .append(method, that.method) + .append(url, that.url) + .append(httpVersion, that.httpVersion) + .append(cookies, that.cookies) + .append(headers, that.headers) + .append(queryString, that.queryString) + .append(postData, that.postData) + .append(comment, that.comment) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(method) + .append(url) + .append(httpVersion) + .append(cookies) + .append(headers) + .append(queryString) + .append(postData) + .append(headersSize) + .append(bodySize) + .append(comment) + .toHashCode(); + } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/AutoBasicAuthFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/AutoBasicAuthFilter.java index 758f9bfaa..4cc840d97 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/AutoBasicAuthFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/AutoBasicAuthFilter.java @@ -1,10 +1,7 @@ package net.lightbody.bmp.filters; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.*; import org.littleshoot.proxy.impl.ProxyUtils; import java.util.Map; @@ -45,7 +42,7 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { // if there is an entry in the credentials map matching this hostname, add the credentials to the request String base64CredentialsForHostname = credentialsByHostname.get(hostname); if (base64CredentialsForHostname != null) { - httpRequest.headers().add(HttpHeaders.Names.AUTHORIZATION, "Basic " + base64CredentialsForHostname); + httpRequest.headers().add(HttpHeaderNames.AUTHORIZATION, "Basic " + base64CredentialsForHostname); } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ClientRequestCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ClientRequestCaptureFilter.java index d6bd1b58c..3315c0640 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ClientRequestCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ClientRequestCaptureFilter.java @@ -2,12 +2,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.HttpContent; -import io.netty.handler.codec.http.HttpHeaders; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.codec.http.*; import net.lightbody.bmp.util.BrowserMobHttpUtil; import org.littleshoot.proxy.HttpFiltersAdapter; @@ -60,7 +55,7 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (httpContent instanceof LastHttpContent) { LastHttpContent lastHttpContent = (LastHttpContent) httpContent; - trailingHeaders = lastHttpContent .trailingHeaders(); + trailingHeaders = lastHttpContent.trailingHeaders(); } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 46b62841e..684ccb659 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -10,14 +10,7 @@ import io.netty.handler.codec.http.cookie.ClientCookieDecoder; import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.ServerCookieDecoder; -import net.lightbody.bmp.core.har.Har; -import net.lightbody.bmp.core.har.HarCookie; -import net.lightbody.bmp.core.har.HarEntry; -import net.lightbody.bmp.core.har.HarNameValuePair; -import net.lightbody.bmp.core.har.HarPostData; -import net.lightbody.bmp.core.har.HarPostDataParam; -import net.lightbody.bmp.core.har.HarRequest; -import net.lightbody.bmp.core.har.HarResponse; +import net.lightbody.bmp.core.har.*; import net.lightbody.bmp.exception.UnsupportedCharsetException; import net.lightbody.bmp.filters.support.HttpConnectTiming; import net.lightbody.bmp.filters.util.HarCaptureUtil; @@ -33,17 +26,11 @@ import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.Calendar; -import java.util.Date; -import java.util.EnumSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import static net.lightbody.bmp.filters.StatsDMetricsFilter.*; -import static net.lightbody.bmp.filters.StatsDMetricsFilter.getStatsDPort; public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); @@ -273,10 +260,9 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { } harEntry.getResponse().setBodySize(responseBodySize.get()); + logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } - - logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); - + return super.serverToProxyResponse(httpObject); } @@ -307,6 +293,8 @@ else if (sendFinishedNanos > 0L && responseReceiveStartedNanos == 0L) { else if (responseReceiveStartedNanos > 0L) { harEntry.getTimings().setReceive(timeoutTimestampNanos - responseReceiveStartedNanos, TimeUnit.NANOSECONDS); } + + logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } /** diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java index a9e00c5f8..282bf61b4 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java @@ -51,7 +51,7 @@ public class BrowserMobHttpUtil { * Likewise, special treatment of ISO-8859-1 has been removed from the * Accept-Charset header field. * - * + *

* Technically, we would have to determine the charset on a per-content-type basis, but generally speaking, UTF-8 is a * pretty safe default. (NOTE: In the previous HTTP/1.1 spec, section 3.7.1, the default charset was defined as ISO-8859-1.) */ @@ -118,7 +118,7 @@ public static byte[] decompressContents(byte[] fullMessage) throws Decompression * * @param fullMessage brotli byte stream to decompress * @return decompressed bytes - * @throws DecompressionException thrown if the fullMessage cannot be read or decompressed for any reason + * @throws DecompressionException thrown if the fullMessage cannot be read or decompressed for any reason */ public static byte[] decompressBrotliContents(byte[] fullMessage) throws DecompressionException { InputStream brotliReader = null; @@ -167,11 +167,11 @@ public static byte[] decompressBrotliContents(byte[] fullMessage) throws Decompr public static boolean hasTextualContent(String contentType) { return contentType != null && (contentType.startsWith("text/") || - contentType.startsWith("application/x-javascript") || - contentType.startsWith("application/javascript") || - contentType.startsWith("application/json") || - contentType.startsWith("application/xml") || - contentType.startsWith("application/xhtml+xml") + contentType.startsWith("application/x-javascript") || + contentType.startsWith("application/javascript") || + contentType.startsWith("application/json") || + contentType.startsWith("application/xml") || + contentType.startsWith("application/xhtml+xml") ); } @@ -222,8 +222,8 @@ public static Charset readCharsetInContentTypeHeader(String contentTypeHeader) t MediaType mediaType; try { - mediaType = MediaType.parse(contentTypeHeader); - } catch (IllegalArgumentException e) { + mediaType = MediaType.parse(contentTypeHeader); + } catch (java.lang.IllegalArgumentException e) { log.info("Unable to parse Content-Type header: {}. Content-Type header will be ignored.", contentTypeHeader, e); return null; } @@ -307,7 +307,7 @@ public static boolean isRedirect(HttpResponse httpResponse) { * parsing the hostname, but makes no guarantees. In general, it should be validated externally, if necessary. * * @param hostWithPort string containing a hostname and optional port - * @param portNumber port to remove from the string + * @param portNumber port to remove from the string * @return string with the specified port removed, or the original string if it did not contain the portNumber */ public static String removeMatchingPort(String hostWithPort, int portNumber) { diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java index fbf09d63c..9415f8854 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java @@ -24,7 +24,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 25ae96448..9116c0b59 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 2b6696cd4..593e98eca 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -1,11 +1,12 @@ - + jar browsermob-proxy net.lightbody.bmp - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT 4.0.0 @@ -13,7 +14,7 @@ BrowserMob Proxy Legacy (Jetty) Module - 7.6.16.v20140903 + 9.4.15.v20190215 true @@ -23,7 +24,7 @@ org.apache.maven.plugins maven-surefire-plugin - -Xmx1g -XX:MaxPermSize=256m + -Xmx1g ${use.littleproxy} @@ -80,13 +81,13 @@ commons-io commons-io - 2.5 + 2.6 javax.servlet - servlet-api - 2.5 + javax.servlet-api + 4.0.1 diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/TrustingSSLSocketFactory.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/TrustingSSLSocketFactory.java index 3b68802c5..bdf8bfa7a 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/TrustingSSLSocketFactory.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/TrustingSSLSocketFactory.java @@ -34,16 +34,11 @@ public enum SSLAlgorithm { private StreamManager streamManager; static { - sslContext = SSLContexts.createDefault(); + sslContext = org.apache.http.ssl.SSLContexts.createDefault(); try { - sslContext = SSLContexts.custom().loadTrustMaterial(null, - new TrustStrategy() { - @Override - public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { - return true; - } - } - ).build(); + sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, + (TrustStrategy) (chain, authType) -> true + ).build(); sslContext.init(null, new TrustManager[]{new TrustEverythingSSLTrustManager()}, null); } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/Server.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/Server.java index 6b04eafb6..d483f13ef 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/Server.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/Server.java @@ -35,105 +35,104 @@ /* ------------------------------------------------------------ */ -/** The Jetty HttpServer. - * + +/** + * The Jetty HttpServer. + *

* This specialization of org.mortbay.http.HttpServer adds knowledge * about servlets and their specialized contexts. It also included * support for initialization from xml configuration files * that follow the XmlConfiguration dtd. - * + *

* HttpContexts created by Server are of the type * org.mortbay.jetty.servlet.ServletHttpContext unless otherwise * specified. - * + *

* This class also provides a main() method which starts a server for * each config file passed on the command line. If the system * property JETTY_NO_SHUTDOWN_HOOK is not set to true, then a shutdown - * hook is thread is registered to stop these servers. + * hook is thread is registered to stop these servers. * + * @author Greg Wilkins (gregw) + * @version $Revision: 1.40 $ * @see net.lightbody.bmp.proxy.jetty.xml.XmlConfiguration * @see net.lightbody.bmp.proxy.jetty.jetty.servlet.ServletHttpContext - * @version $Revision: 1.40 $ - * @author Greg Wilkins (gregw) */ -public class Server extends HttpServer -{ +public class Server extends HttpServer { static Log log = LogFactory.getLog(Server.class); - private String[] _webAppConfigurationClassNames = - new String[]{"XMLConfiguration", "JettyWebConfiguration"}; + private String[] _webAppConfigurationClassNames = + new String[]{"XMLConfiguration", "JettyWebConfiguration"}; private String _configuration; private String _rootWebApp; private static ShutdownHookThread hookThread = new ShutdownHookThread(); - + /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. */ - public Server() - { + public Server() { } - + /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. + * * @param configuration The filename or URL of the XML - * configuration file. + * configuration file. */ public Server(String configuration) - throws IOException - { + throws IOException { this(Resource.newResource(configuration).getURL()); } - + /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. + * * @param configuration The filename or URL of the XML - * configuration file. + * configuration file. */ public Server(Resource configuration) - throws IOException - { + throws IOException { this(configuration.getURL()); } - + /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. + * * @param configuration The filename or URL of the XML - * configuration file. + * configuration file. */ public Server(URL configuration) - throws IOException - { - _configuration=configuration.toString(); + throws IOException { + _configuration = configuration.toString(); Server.hookThread.add(this); - try - { - XmlConfiguration config=new XmlConfiguration(configuration); + try { + XmlConfiguration config = new XmlConfiguration(configuration); config.configure(this); - } - catch(IOException e) - { + } catch (IOException e) { throw e; - } - catch(InvocationTargetException e) - { - log.warn(LogSupport.EXCEPTION,e.getTargetException()); - throw new IOException("Jetty configuration problem: "+e.getTargetException()); - } - catch(Exception e) - { - log.warn(LogSupport.EXCEPTION,e); - throw new IOException("Jetty configuration problem: "+e); + } catch (InvocationTargetException e) { + log.warn(LogSupport.EXCEPTION, e.getTargetException()); + throw new IOException("Jetty configuration problem: " + e.getTargetException()); + } catch (Exception e) { + log.warn(LogSupport.EXCEPTION, e); + throw new IOException("Jetty configuration problem: " + e); } } /* ------------------------------------------------------------ */ - public boolean getStopAtShutdown() - { + public boolean getStopAtShutdown() { return hookThread.contains(this); } - + /* ------------------------------------------------------------ */ - public void setStopAtShutdown(boolean stop) - { + public void setStopAtShutdown(boolean stop) { if (stop) hookThread.add(this); else @@ -141,268 +140,283 @@ public void setStopAtShutdown(boolean stop) } /* ------------------------------------------------------------ */ - /** Get the root webapp name. - * @return The name of the root webapp (eg. "root" for root.war). + + /** + * Get the root webapp name. + * + * @return The name of the root webapp (eg. "root" for root.war). */ - public String getRootWebApp() - { + public String getRootWebApp() { return _rootWebApp; } - + /* ------------------------------------------------------------ */ - /** Set the root webapp name. - * @param rootWebApp The name of the root webapp (eg. "root" for root.war). + + /** + * Set the root webapp name. + * + * @param rootWebApp The name of the root webapp (eg. "root" for root.war). */ - public void setRootWebApp(String rootWebApp) - { + public void setRootWebApp(String rootWebApp) { _rootWebApp = rootWebApp; } - + /* ------------------------------------------------------------ */ - /** Configure the server from an XML file. + + /** + * Configure the server from an XML file. + * * @param configuration The filename or URL of the XML - * configuration file. + * configuration file. */ public void configure(String configuration) - throws IOException - { + throws IOException { - URL url=Resource.newResource(configuration).getURL(); - if (_configuration!=null && _configuration.equals(url.toString())) + URL url = Resource.newResource(configuration).getURL(); + if (_configuration != null && _configuration.equals(url.toString())) return; - if (_configuration!=null) - throw new IllegalStateException("Already configured with "+_configuration); - try - { - XmlConfiguration config=new XmlConfiguration(url); - _configuration=url.toString(); + if (_configuration != null) + throw new IllegalStateException("Already configured with " + _configuration); + try { + XmlConfiguration config = new XmlConfiguration(url); + _configuration = url.toString(); config.configure(this); - } - catch(IOException e) - { + } catch (IOException e) { throw e; - } - catch(Exception e) - { - log.warn(LogSupport.EXCEPTION,e); - throw new IOException("Jetty configuration problem: "+e); + } catch (Exception e) { + log.warn(LogSupport.EXCEPTION, e); + throw new IOException("Jetty configuration problem: " + e); } } - + /* ------------------------------------------------------------ */ - public String getConfiguration() - { + public String getConfiguration() { return _configuration; } - + /* ------------------------------------------------------------ */ - /** Create a new ServletHttpContext. + + /** + * Create a new ServletHttpContext. * Ths method is called by HttpServer to creat new contexts. Thus * calls to addContext or getContext that result in a new Context * being created will return an * org.mortbay.jetty.servlet.ServletHttpContext instance. + * * @return ServletHttpContext */ - protected HttpContext newHttpContext() - { + protected HttpContext newHttpContext() { return new ServletHttpContext(); } - + /* ------------------------------------------------------------ */ - /** Create a new WebApplicationContext. - * Ths method is called by Server to creat new contexts for web - * applications. Thus calls to addWebApplication that result in + + /** + * Create a new WebApplicationContext. + * Ths method is called by Server to creat new contexts for web + * applications. Thus calls to addWebApplication that result in * a new Context being created will return an correct class instance. * Derived class can override this method to create instance of its * own class derived from WebApplicationContext in case it needs more * functionality. + * * @param webApp The Web application directory or WAR file. * @return WebApplicationContext */ protected WebApplicationContext newWebApplicationContext( - String webApp - ) - { + String webApp + ) { return new WebApplicationContext(webApp); } /* ------------------------------------------------------------ */ - /** Add Web Application. + + /** + * Add Web Application. + * * @param contextPathSpec The context path spec. Which must be of - * the form / or /path/* - * @param webApp The Web application directory or WAR file. + * the form / or /path/* + * @param webApp The Web application directory or WAR file. * @return The WebApplicationContext - * @exception IOException + * @throws IOException */ public WebApplicationContext addWebApplication(String contextPathSpec, String webApp) - throws IOException - { - return addWebApplication(null,contextPathSpec,webApp); + throws IOException { + return addWebApplication(null, contextPathSpec, webApp); } - + /* ------------------------------------------------------------ */ - /** Add Web Application. - * @param virtualHost Virtual host name or null + + /** + * Add Web Application. + * + * @param virtualHost Virtual host name or null * @param contextPathSpec The context path spec. Which must be of - * the form / or /path/* - * @param webApp The Web application directory or WAR file. + * the form / or /path/* + * @param webApp The Web application directory or WAR file. * @return The WebApplicationContext - * @exception IOException + * @throws IOException */ public WebApplicationContext addWebApplication(String virtualHost, String contextPathSpec, String webApp) - throws IOException - { + throws IOException { WebApplicationContext appContext = - newWebApplicationContext(webApp); + newWebApplicationContext(webApp); appContext.setContextPath(contextPathSpec); - addContext(virtualHost,appContext); - if(log.isDebugEnabled())log.debug("Web Application "+appContext+" added"); + addContext(virtualHost, appContext); + if (log.isDebugEnabled()) log.debug("Web Application " + appContext + " added"); return appContext; } - + /* ------------------------------------------------------------ */ - /** Add Web Applications. + + /** + * Add Web Applications. * Add auto webapplications to the server. The name of the * webapp directory or war is used as the context name. If a * webapp is called "root" it is added at "/". + * * @param webapps Directory file name or URL to look for auto webapplication. - * @exception IOException + * @throws IOException */ public WebApplicationContext[] addWebApplications(String webapps) - throws IOException - { - return addWebApplications(null,webapps,null,false); + throws IOException { + return addWebApplications(null, webapps, null, false); } - + /* ------------------------------------------------------------ */ - /** Add Web Applications. + + /** + * Add Web Applications. * Add auto webapplications to the server. The name of the * webapp directory or war is used as the context name. If the * webapp matches the rootWebApp it is added as the "/" context. - * @param host Virtual host name or null + * + * @param host Virtual host name or null * @param webapps Directory file name or URL to look for auto webapplication. - * @exception IOException + * @throws IOException */ public WebApplicationContext[] addWebApplications(String host, String webapps) - throws IOException - { - return addWebApplications(host,webapps,null,false); + throws IOException { + return addWebApplications(host, webapps, null, false); } - + /* ------------------------------------------------------------ */ - /** Add Web Applications. + + /** + * Add Web Applications. * Add auto webapplications to the server. The name of the * webapp directory or war is used as the context name. If the * webapp matches the rootWebApp it is added as the "/" context. - * @param host Virtual host name or null + * + * @param host Virtual host name or null * @param webapps Directory file name or URL to look for auto - * webapplication. + * webapplication. * @param extract If true, extract war files - * @exception IOException + * @throws IOException */ public WebApplicationContext[] addWebApplications(String host, String webapps, boolean extract) - throws IOException - { - return addWebApplications(host,webapps,null,extract); + throws IOException { + return addWebApplications(host, webapps, null, extract); } - + /* ------------------------------------------------------------ */ - /** Add Web Applications. + + /** + * Add Web Applications. * Add auto webapplications to the server. The name of the * webapp directory or war is used as the context name. If the * webapp matches the rootWebApp it is added as the "/" context. - * @param host Virtual host name or null - * @param webapps Directory file name or URL to look for auto - * webapplication. + * + * @param host Virtual host name or null + * @param webapps Directory file name or URL to look for auto + * webapplication. * @param defaults The defaults xml filename or URL which is - * loaded before any in the web app. Must respect the web.dtd. - * If null the default defaults file is used. If the empty string, then - * no defaults file is used. - * @param extract If true, extract war files - * @exception IOException + * loaded before any in the web app. Must respect the web.dtd. + * If null the default defaults file is used. If the empty string, then + * no defaults file is used. + * @param extract If true, extract war files + * @throws IOException */ public WebApplicationContext[] addWebApplications(String host, String webapps, String defaults, boolean extract) - throws IOException - { - return addWebApplications(host,webapps,defaults,extract,true); + throws IOException { + return addWebApplications(host, webapps, defaults, extract, true); } /* ------------------------------------------------------------ */ - /** Add Web Applications. + + /** + * Add Web Applications. * Add auto webapplications to the server. The name of the * webapp directory or war is used as the context name. If the * webapp matches the rootWebApp it is added as the "/" context. - * @param host Virtual host name or null - * @param webapps Directory file name or URL to look for auto - * webapplication. - * @param defaults The defaults xml filename or URL which is - * loaded before any in the web app. Must respect the web.dtd. - * If null the default defaults file is used. If the empty string, then - * no defaults file is used. - * @param extract If true, extract war files + * + * @param host Virtual host name or null + * @param webapps Directory file name or URL to look for auto + * webapplication. + * @param defaults The defaults xml filename or URL which is + * loaded before any in the web app. Must respect the web.dtd. + * If null the default defaults file is used. If the empty string, then + * no defaults file is used. + * @param extract If true, extract war files * @param java2CompliantClassLoader True if java2 compliance is applied to all webapplications - * @exception IOException + * @throws IOException */ public WebApplicationContext[] addWebApplications(String host, String webapps, String defaults, boolean extract, - boolean java2CompliantClassLoader) - throws IOException - { + boolean java2CompliantClassLoader) + throws IOException { ArrayList wacs = new ArrayList(); - Resource r=Resource.newResource(webapps); + Resource r = Resource.newResource(webapps); if (!r.exists()) - throw new IllegalArgumentException("No such webapps resource "+r); - + throw new IllegalArgumentException("No such webapps resource " + r); + if (!r.isDirectory()) - throw new IllegalArgumentException("Not directory webapps resource "+r); - - String[] files=r.list(); - - for (int f=0;files!=null && f + * Thread is hooked first time list of servers is changed. */ - private void createShutdownHook() { - if (!Boolean.getBoolean("JETTY_NO_SHUTDOWN_HOOK") && !hooked) { - try { - Method shutdownHook = java.lang.Runtime.class.getMethod("addShutdownHook", - new Class[] { java.lang.Thread.class }); - shutdownHook.invoke(Runtime.getRuntime(), new Object[] { this }); - this.hooked = true; - } catch (Exception e) { - if (log.isDebugEnabled()) log.debug("No shutdown hook in JVM ", e); + private static class ShutdownHookThread extends Thread { + private boolean hooked = false; + private ArrayList servers = new ArrayList(); + + /** + * Hooks this thread for shutdown. + * + * @see java.lang.Runtime#addShutdownHook(java.lang.Thread) + */ + private void createShutdownHook() { + if (!Boolean.getBoolean("JETTY_NO_SHUTDOWN_HOOK") && !hooked) { + try { + Method shutdownHook = java.lang.Runtime.class.getMethod("addShutdownHook", + new Class[]{java.lang.Thread.class}); + shutdownHook.invoke(Runtime.getRuntime(), new Object[]{this}); + this.hooked = true; + } catch (Exception e) { + if (log.isDebugEnabled()) log.debug("No shutdown hook in JVM ", e); + } + } } - } - } - /** - * Add Server to servers list. - */ - public boolean add(Server server) { - createShutdownHook(); - return this.servers.add(server); - } - - /** - * Contains Server in servers list? - */ - public boolean contains(Server server) { - return this.servers.contains(server); - } + /** + * Add Server to servers list. + */ + public boolean add(Server server) { + createShutdownHook(); + return this.servers.add(server); + } - /** - * Append all Servers from Collection - */ - public boolean addAll(Collection c) { - createShutdownHook(); - return this.servers.addAll(c); - } + /** + * Contains Server in servers list? + */ + public boolean contains(Server server) { + return this.servers.contains(server); + } - /** - * Clear list of Servers. - */ - public void clear() { - createShutdownHook(); - this.servers.clear(); - } + /** + * Append all Servers from Collection + */ + public boolean addAll(Collection c) { + createShutdownHook(); + return this.servers.addAll(c); + } - /** - * Remove Server from list. - */ - public boolean remove(Server server) { - createShutdownHook(); - return this.servers.remove(server); - } + /** + * Clear list of Servers. + */ + public void clear() { + createShutdownHook(); + this.servers.clear(); + } - /** - * Remove all Servers in Collection from list. - */ - public boolean removeAll(Collection c) { - createShutdownHook(); - return this.servers.removeAll(c); - } + /** + * Remove Server from list. + */ + public boolean remove(Server server) { + createShutdownHook(); + return this.servers.remove(server); + } - /** - * Stop all Servers in list. - */ - public void run() { - setName("Shutdown"); - log.info("Shutdown hook executing"); - Iterator it = servers.iterator(); - while (it.hasNext()) { - Server svr = (Server) it.next(); - if (svr == null) continue; - try { - svr.stop(); - } catch (Exception e) { - log.warn(LogSupport.EXCEPTION, e); + /** + * Remove all Servers in Collection from list. + */ + public boolean removeAll(Collection c) { + createShutdownHook(); + return this.servers.removeAll(c); } - log.info("Shutdown hook complete"); - // Try to avoid JVM crash - try { - Thread.sleep(1000); - } catch (Exception e) { - log.warn(LogSupport.EXCEPTION, e); + /** + * Stop all Servers in list. + */ + public void run() { + setName("Shutdown"); + log.info("Shutdown hook executing"); + Iterator it = servers.iterator(); + while (it.hasNext()) { + Server svr = (Server) it.next(); + if (svr == null) continue; + try { + svr.stop(); + } catch (Exception e) { + log.warn(LogSupport.EXCEPTION, e); + } + log.info("Shutdown hook complete"); + + // Try to avoid JVM crash + try { + Thread.sleep(1000); + } catch (Exception e) { + log.warn(LogSupport.EXCEPTION, e); + } + } } - } } - } } diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHandler.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHandler.java index 220af438d..78414813c 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHandler.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHandler.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.Log; import javax.servlet.*; +import javax.servlet.descriptor.JspConfigDescriptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -43,50 +44,52 @@ /* --------------------------------------------------------------------- */ -/** Servlet HttpHandler. + +/** + * Servlet HttpHandler. * This handler maps requests to servlets that implement the * javax.servlet.http.HttpServlet API. - *

+ *

* This handler does not implement the full J2EE features and is intended to * be used when a full web application is not required. Specifically filters * and request wrapping are not supported. - *

+ *

* If a SessionManager is not added to the handler before it is * initialized, then a HashSessionManager with a standard * java.util.Random generator is created. - *

- * @see net.lightbody.bmp.proxy.jetty.jetty.servlet.WebApplicationHandler - * @version $Id: ServletHandler.java,v 1.133 2006/03/15 14:43:00 gregwilkins Exp $ + *

+ * * @author Greg Wilkins + * @version $Id: ServletHandler.java,v 1.133 2006/03/15 14:43:00 gregwilkins Exp $ + * @see net.lightbody.bmp.proxy.jetty.jetty.servlet.WebApplicationHandler */ -public class ServletHandler extends Container implements HttpHandler -{ +public class ServletHandler extends Container implements HttpHandler { private static Log log = LogFactory.getLog(ServletHandler.class); /* ------------------------------------------------------------ */ - public static final String __DEFAULT_SERVLET="default"; - public static final String __J_S_CONTEXT_TEMPDIR="javax.servlet.context.tempdir"; - public static final String __J_S_ERROR_EXCEPTION="javax.servlet.error.exception"; - public static final String __J_S_ERROR_EXCEPTION_TYPE="javax.servlet.error.exception_type"; - public static final String __J_S_ERROR_MESSAGE="javax.servlet.error.message"; - public static final String __J_S_ERROR_REQUEST_URI="javax.servlet.error.request_uri"; - public static final String __J_S_ERROR_SERVLET_NAME="javax.servlet.error.servlet_name"; - public static final String __J_S_ERROR_STATUS_CODE="javax.servlet.error.status_code"; - + public static final String __DEFAULT_SERVLET = "default"; + public static final String __J_S_CONTEXT_TEMPDIR = "javax.servlet.context.tempdir"; + public static final String __J_S_ERROR_EXCEPTION = "javax.servlet.error.exception"; + public static final String __J_S_ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type"; + public static final String __J_S_ERROR_MESSAGE = "javax.servlet.error.message"; + public static final String __J_S_ERROR_REQUEST_URI = "javax.servlet.error.request_uri"; + public static final String __J_S_ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name"; + public static final String __J_S_ERROR_STATUS_CODE = "javax.servlet.error.status_code"; + /* ------------------------------------------------------------ */ - private static final boolean __Slosh2Slash=File.separatorChar=='\\'; - private static String __AllowString="GET, HEAD, POST, OPTIONS, TRACE"; + private static final boolean __Slosh2Slash = File.separatorChar == '\\'; + private static String __AllowString = "GET, HEAD, POST, OPTIONS, TRACE"; + - /* ------------------------------------------------------------ */ - private boolean _usingCookies=true; - private boolean _autoInitializeServlets=true; + private boolean _usingCookies = true; + private boolean _autoInitializeServlets = true; private String _name; - + /* ------------------------------------------------------------ */ - protected PathMap _servletMap=new PathMap(); - protected Map _nameMap=new HashMap(); - protected Map _attributes=new HashMap(3); + protected PathMap _servletMap = new PathMap(); + protected Map _nameMap = new HashMap(); + protected Map _attributes = new HashMap(3); protected String _formLoginPage; protected String _formErrorPage; protected SessionManager _sessionManager; @@ -97,830 +100,791 @@ public class ServletHandler extends Container implements HttpHandler protected transient HttpContext _httpContext; /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. */ - public ServletHandler() - { - _context=new Context(); + public ServletHandler() { + _context = new Context(); } /* ------------------------------------------------------------ */ - public void setName(String name) - { - _name=name; + public void setName(String name) { + _name = name; } - + /* ------------------------------------------------------------ */ - public String getName() - { - if (_name==null) - { - _name=this.getClass().getName(); + public String getName() { + if (_name == null) { + _name = this.getClass().getName(); if (!log.isDebugEnabled()) - _name=_name.substring(_name.lastIndexOf('.')+1); + _name = _name.substring(_name.lastIndexOf('.') + 1); } return _name; } - + /* ------------------------------------------------------------ */ - public HttpContext getHttpContext() - { + public HttpContext getHttpContext() { return _httpContext; } - + /* ------------------------------------------------------------ */ - public void initialize(HttpContext context) - { - SessionManager sessionManager=getSessionManager(); - + public void initialize(HttpContext context) { + SessionManager sessionManager = getSessionManager(); - if (_httpContext!=null&& _httpContext!=context) + + if (_httpContext != null && _httpContext != context) throw new IllegalStateException("Can't initialize handler for different context"); - _httpContext=context; - + _httpContext = context; + sessionManager.initialize(this); } /* ------------------------------------------------------------ */ public void formAuthInit(String formLoginPage, - String formErrorPage) - { - _formLoginPage=formLoginPage; - _formErrorPage=formErrorPage; - } - + String formErrorPage) { + _formLoginPage = formLoginPage; + _formErrorPage = formErrorPage; + } + /* ------------------------------------------------------------ */ - public void setSessionManager(SessionManager sm) - { + public void setSessionManager(SessionManager sm) { if (isStarted()) throw new IllegalStateException("Started"); - int mii=0; - boolean setMii=false; - - if ( _sessionManager!=null) - { - mii=_sessionManager.getMaxInactiveInterval(); - setMii=true; - if (getHttpContext()!=null) + int mii = 0; + boolean setMii = false; + + if (_sessionManager != null) { + mii = _sessionManager.getMaxInactiveInterval(); + setMii = true; + if (getHttpContext() != null) _sessionManager.initialize(null); removeComponent(_sessionManager); } - _sessionManager=sm; + _sessionManager = sm; - if (_sessionManager!=null) - { - if (getHttpContext()!=null) + if (_sessionManager != null) { + if (getHttpContext() != null) _sessionManager.initialize(this); if (setMii) _sessionManager.setMaxInactiveInterval(mii); addComponent(_sessionManager); - } - - _sessionManager=sm; + } + + _sessionManager = sm; } - + /* ------------------------------------------------------------ */ - public SessionManager getSessionManager() - { - if (_sessionManager==null) - { + public SessionManager getSessionManager() { + if (_sessionManager == null) { _sessionManager = new HashSessionManager(); addComponent(_sessionManager); } return _sessionManager; } - + /* ------------------------------------------------------------ */ - public ServletContext getServletContext() { return _context; } + public ServletContext getServletContext() { + return _context; + } /* ------------------------------------------------------------ */ - public PathMap getServletMap() { return _servletMap; } - + public PathMap getServletMap() { + return _servletMap; + } + /* ------------------------------------------------------------ */ - public boolean isUsingCookies() { return _usingCookies; } - + public boolean isUsingCookies() { + return _usingCookies; + } + /* ------------------------------------------------------------ */ - /** Set the dynamic servlet path. + + /** + * Set the dynamic servlet path. + * * @deprecated Use org.mortbay.jetty.servlet.Invoker */ - public void setDynamicServletPathSpec(String dynamicServletPathSpec) - { + public void setDynamicServletPathSpec(String dynamicServletPathSpec) { log.warn("setDynamicServletPathSpec is Deprecated."); } - + /* ------------------------------------------------------------ */ - /** Set dynamic servlet initial parameters. + + /** + * Set dynamic servlet initial parameters. + * * @deprecated Use org.mortbay.jetty.servlet.Invoker */ - public void setDynamicInitParams(Map initParams) - { + public void setDynamicInitParams(Map initParams) { log.warn("setDynamicInitParams is Deprecated."); } /* ------------------------------------------------------------ */ - /** Set serving dynamic system servlets. + + /** + * Set serving dynamic system servlets. + * * @deprecated Use org.mortbay.jetty.servlet.Invoker */ - public void setServeDynamicSystemServlets(boolean b) - { + public void setServeDynamicSystemServlets(boolean b) { log.warn("setServeDynamicSystemServlets is Deprecated."); } - + /* ------------------------------------------------------------ */ - public ClassLoader getClassLoader() - { + public ClassLoader getClassLoader() { return _loader; } /* ------------------------------------------------------------ */ - /** + + /** * @param uc If true, cookies are used for sessions */ - public void setUsingCookies(boolean uc) - { - _usingCookies=uc; + public void setUsingCookies(boolean uc) { + _usingCookies = uc; } /* ------------------------------------------------------------ */ public ServletHolder newServletHolder(String name, String servletClass, - String forcedPath) - { + String forcedPath) { if (_nameMap.containsKey(name)) - throw new IllegalArgumentException("Named servlet already exists: "+name); - - ServletHolder holder = new ServletHolder(this,name,servletClass,forcedPath); + throw new IllegalArgumentException("Named servlet already exists: " + name); + + ServletHolder holder = new ServletHolder(this, name, servletClass, forcedPath); addServletHolder(holder); - + return holder; } /* ------------------------------------------------------------ */ public ServletHolder newServletHolder(String name, - String servletClass) - { - return newServletHolder(name,servletClass,null); - } - + String servletClass) { + return newServletHolder(name, servletClass, null); + } + /* ------------------------------------------------------------ */ - public ServletHolder getServletHolder(String name) - { - return (ServletHolder)_nameMap.get(name); - } + public ServletHolder getServletHolder(String name) { + return (ServletHolder) _nameMap.get(name); + } /* ------------------------------------------------------------ */ - /** + + /** * Map a servlet to a pathSpec - * @param pathSpec The pathspec to map + * + * @param pathSpec The pathspec to map * @param servletName The name of the servlet, which must have already been added. * @return The servlet holder of the mapped servlet. */ public ServletHolder mapPathToServlet(String pathSpec, - String servletName) - { - ServletHolder holder =(ServletHolder)_nameMap.get(servletName); - - if (!pathSpec.startsWith("/") && !pathSpec.startsWith("*")) - { - log.warn("pathSpec should start with '/' or '*' : "+pathSpec); - pathSpec="/"+pathSpec; - } - - if (holder==null) - throw new IllegalArgumentException("Unknown servlet: "+servletName); - _servletMap.put(pathSpec,holder); + String servletName) { + ServletHolder holder = (ServletHolder) _nameMap.get(servletName); + + if (!pathSpec.startsWith("/") && !pathSpec.startsWith("*")) { + log.warn("pathSpec should start with '/' or '*' : " + pathSpec); + pathSpec = "/" + pathSpec; + } + + if (holder == null) + throw new IllegalArgumentException("Unknown servlet: " + servletName); + _servletMap.put(pathSpec, holder); return holder; } - + /* ------------------------------------------------------------ */ - /** Add a servlet. - * @param name The servlet name. - * @param pathSpec A path specification to map this servlet to. + + /** + * Add a servlet. + * + * @param name The servlet name. + * @param pathSpec A path specification to map this servlet to. * @param servletClass The class name of the servlet. - * @param forcedPath If non null, the request attribute - * javax.servlet.include.servlet_path will be set to this path before - * service is called. + * @param forcedPath If non null, the request attribute + * javax.servlet.include.servlet_path will be set to this path before + * service is called. * @return The ServletHolder for the servlet. */ public ServletHolder addServlet(String name, String pathSpec, String servletClass, - String forcedPath) - { + String forcedPath) { ServletHolder holder = getServletHolder(name); - if (holder==null) - holder = newServletHolder(name,servletClass,forcedPath); - mapPathToServlet(pathSpec,name); - if (isStarted() && !holder.isStarted()) - { - try{holder.start();} - catch(Exception e){log.warn(LogSupport.EXCEPTION,e);} + if (holder == null) + holder = newServletHolder(name, servletClass, forcedPath); + mapPathToServlet(pathSpec, name); + if (isStarted() && !holder.isStarted()) { + try { + holder.start(); + } catch (Exception e) { + log.warn(LogSupport.EXCEPTION, e); + } } return holder; } - + /* ------------------------------------------------------------ */ - /** Add a servlet. - * @param name The servlet name. - * @param pathSpec A path specification to map this servlet to. + + /** + * Add a servlet. + * + * @param name The servlet name. + * @param pathSpec A path specification to map this servlet to. * @param servletClass The class name of the servlet. * @return The ServletHolder for the servlet. */ public ServletHolder addServlet(String name, String pathSpec, - String servletClass) - { - return addServlet(name,pathSpec,servletClass,null); + String servletClass) { + return addServlet(name, pathSpec, servletClass, null); } - + /* ------------------------------------------------------------ */ + /** * Add a servlet instance to this handler and map it to a pathspec. - * @param pathSpec The pathmapping + * + * @param pathSpec The pathmapping * @param servletClass The class of the servlet * @return The created ServletHolder */ public ServletHolder addServlet(String pathSpec, - String servletClass) - { - return addServlet(servletClass,pathSpec,servletClass,null); + String servletClass) { + return addServlet(servletClass, pathSpec, servletClass, null); } - + /* ------------------------------------------------------------ */ + /** * Register an existing ServletHolder with this handler. + * * @param holder the ServletHolder to register. */ - public void addServletHolder(ServletHolder holder) - { + public void addServletHolder(ServletHolder holder) { ServletHolder existing = (ServletHolder) - _nameMap.get(holder.getName()); - if (existing==null) - _nameMap.put(holder.getName(),holder); - else if (existing!=holder) - throw new IllegalArgumentException("Holder already exists for name: "+holder.getName()); + _nameMap.get(holder.getName()); + if (existing == null) + _nameMap.put(holder.getName(), holder); + else if (existing != holder) + throw new IllegalArgumentException("Holder already exists for name: " + holder.getName()); addComponent(holder); } - + /* ------------------------------------------------------------ */ - public boolean isAutoInitializeServlets() - { + public boolean isAutoInitializeServlets() { return _autoInitializeServlets; } /* ------------------------------------------------------------ */ - public void setAutoInitializeServlets(boolean b) - { - _autoInitializeServlets=b; + public void setAutoInitializeServlets(boolean b) { + _autoInitializeServlets = b; } - + /* ----------------------------------------------------------------- */ protected synchronized void doStart() - throws Exception - { + throws Exception { if (isStarted()) return; - - _contextLog = LogFactory.getLog("net.lightbody.bmp.proxy.jetty.jetty.context."+getHttpContext().getHttpContextName()); - - if (_contextLog==null) - _contextLog=log; - - if (_sessionManager!=null) + + _contextLog = LogFactory.getLog("net.lightbody.bmp.proxy.jetty.jetty.context." + getHttpContext().getHttpContextName()); + + if (_contextLog == null) + _contextLog = log; + + if (_sessionManager != null) _sessionManager.start(); - + // Initialize classloader - _loader=getHttpContext().getClassLoader(); + _loader = getHttpContext().getClassLoader(); if (_autoInitializeServlets) initializeServlets(); - } - + } + /* ------------------------------------------------------------ */ - /** Get Servlets. + + /** + * Get Servlets. + * * @return Array of defined servlets */ - public ServletHolder[] getServlets() - { + public ServletHolder[] getServlets() { // Sort and Initialize servlets HashSet holder_set = new HashSet(_nameMap.size()); holder_set.addAll(_nameMap.values()); - ServletHolder holders [] = (ServletHolder []) - holder_set.toArray(new ServletHolder [holder_set.size()]); - java.util.Arrays.sort (holders); + ServletHolder[] holders = (ServletHolder[]) + holder_set.toArray(new ServletHolder[holder_set.size()]); + java.util.Arrays.sort(holders); return holders; } - + /* ------------------------------------------------------------ */ - /** Initialize load-on-startup servlets. + + /** + * Initialize load-on-startup servlets. * Called automatically from start if autoInitializeServlet is true. */ public void initializeServlets() - throws Exception - { + throws Exception { MultiException mx = new MultiException(); - + // Sort and Initialize servlets ServletHolder[] holders = getServlets(); - for (int i=0; i0;) - { - try - { + for (int i = holders.length; i-- > 0; ) { + try { if (holders[i].isStarted()) holders[i].stop(); + } catch (Exception e) { + log.warn(LogSupport.EXCEPTION, e); } - catch(Exception e){log.warn(LogSupport.EXCEPTION,e);} } - + // Stop the session manager _sessionManager.stop(); _attributes.clear(); - _loader=null; + _loader = null; } /* ------------------------------------------------------------ */ - public HttpSession getHttpSession(String id) - { + public HttpSession getHttpSession(String id) { return _sessionManager.getHttpSession(id); } - + /* ------------------------------------------------------------ */ - public HttpSession newHttpSession(HttpServletRequest request) - { + public HttpSession newHttpSession(HttpServletRequest request) { return _sessionManager.newHttpSession(request); } /* ------------------------------------------------------------ */ + /** * Set the session timeout interval in seconds. + * * @param seconds the length of the session timeout interval in seconds. */ - public void setSessionInactiveInterval(int seconds) - { + public void setSessionInactiveInterval(int seconds) { _sessionManager.setMaxInactiveInterval(seconds); } /* ----------------------------------------------------------------- */ - /** Handle request. + + /** + * Handle request. + * * @param pathInContext * @param pathParams * @param httpRequest - * @param httpResponse - * @exception IOException + * @param httpResponse + * @throws IOException */ public void handle(String pathInContext, String pathParams, HttpRequest httpRequest, HttpResponse httpResponse) - throws IOException - { + throws IOException { if (!isStarted()) return; - + // Handle TRACE - if (HttpRequest.__TRACE.equals(httpRequest.getMethod())) - { - handleTrace(httpRequest,httpResponse); + if (HttpRequest.__TRACE.equals(httpRequest.getMethod())) { + handleTrace(httpRequest, httpResponse); return; } // Look for existing request/response objects (from enterScope call) ServletHttpRequest request = (ServletHttpRequest) httpRequest.getWrapper(); ServletHttpResponse response = (ServletHttpResponse) httpResponse.getWrapper(); - if (request==null) - { + if (request == null) { // Not in ServletHttpContext, but bumble on anyway - request = new ServletHttpRequest(this,pathInContext,httpRequest); - response = new ServletHttpResponse(request,httpResponse); + request = new ServletHttpRequest(this, pathInContext, httpRequest); + response = new ServletHttpResponse(request, httpResponse); httpRequest.setWrapper(request); httpResponse.setWrapper(response); - } - else - { - request.recycle(this,pathInContext); + } else { + request.recycle(this, pathInContext); response.recycle(); } - + // Look for the servlet - Map.Entry servlet=getHolderEntry(pathInContext); - ServletHolder servletHolder=servlet==null?null:(ServletHolder)servlet.getValue(); - if(log.isDebugEnabled())log.debug("servlet="+servlet); - - try - { + Map.Entry servlet = getHolderEntry(pathInContext); + ServletHolder servletHolder = servlet == null ? null : (ServletHolder) servlet.getValue(); + if (log.isDebugEnabled()) log.debug("servlet=" + servlet); + + try { // Adjust request paths - if (servlet!=null) - { - String servletPathSpec=(String)servlet.getKey(); - request.setServletPaths(PathMap.pathMatch(servletPathSpec,pathInContext), - PathMap.pathInfo(servletPathSpec,pathInContext), - servletHolder); + if (servlet != null) { + String servletPathSpec = (String) servlet.getKey(); + request.setServletPaths(PathMap.pathMatch(servletPathSpec, pathInContext), + PathMap.pathInfo(servletPathSpec, pathInContext), + servletHolder); } - + // Handle the session ID request.setRequestedSessionId(pathParams); - HttpSession session=request.getSession(false); - if (session!=null) - ((SessionManager.Session)session).access(); - if(log.isDebugEnabled())log.debug("session="+session); - + HttpSession session = request.getSession(false); + if (session != null) + ((SessionManager.Session) session).access(); + if (log.isDebugEnabled()) log.debug("session=" + session); + // Do that funky filter and servlet thang! - if (servletHolder!=null) - dispatch(pathInContext,request,response,servletHolder, Dispatcher.__REQUEST); - } - catch(Exception e) - { - log.debug(LogSupport.EXCEPTION,e); - - Throwable th=e; - while (th instanceof ServletException) - { + if (servletHolder != null) + dispatch(pathInContext, request, response, servletHolder, Dispatcher.__REQUEST); + } catch (Exception e) { + log.debug(LogSupport.EXCEPTION, e); + + Throwable th = e; + while (th instanceof ServletException) { log.warn(LogSupport.EXCEPTION, th); - Throwable cause=((ServletException)th).getRootCause(); - if (cause==th || cause==null) + Throwable cause = ((ServletException) th).getRootCause(); + if (cause == th || cause == null) break; - th=cause; + th = cause; } - + if (th instanceof HttpException) - throw (HttpException)th; + throw (HttpException) th; if (th instanceof EOFException) - throw (IOException)th; - else if (log.isDebugEnabled() || !( th instanceof java.io.IOException)) - { - if (_contextLog!=null) - { - if (th instanceof RuntimeException) - _contextLog.error(httpRequest.getURI()+": ",th); + throw (IOException) th; + else if (log.isDebugEnabled() || !(th instanceof java.io.IOException)) { + if (_contextLog != null) { + if (th instanceof RuntimeException) + _contextLog.error(httpRequest.getURI() + ": ", th); else - _contextLog.warn(httpRequest.getURI()+": ",th); + _contextLog.warn(httpRequest.getURI() + ": ", th); } - - if(log.isDebugEnabled()) - { - if (th instanceof RuntimeException) - log.error(httpRequest.getURI()+": ",th); + + if (log.isDebugEnabled()) { + if (th instanceof RuntimeException) + log.error(httpRequest.getURI() + ": ", th); else - log.warn(httpRequest.getURI()+": ",th); + log.warn(httpRequest.getURI() + ": ", th); log.debug(httpRequest); } } - + httpResponse.getHttpConnection().forceClose(); - if (!httpResponse.isCommitted()) - { - request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION_TYPE,th.getClass()); - request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION,th); - if (th instanceof UnavailableException) - { - UnavailableException ue = (UnavailableException)th; + if (!httpResponse.isCommitted()) { + request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION_TYPE, th.getClass()); + request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION, th); + if (th instanceof UnavailableException) { + UnavailableException ue = (UnavailableException) th; if (ue.isPermanent()) - response.sendError(HttpResponse.__404_Not_Found,e.getMessage()); + response.sendError(HttpResponse.__404_Not_Found, e.getMessage()); else - response.sendError(HttpResponse.__503_Service_Unavailable,e.getMessage()); - } - else - response.sendError(HttpResponse.__500_Internal_Server_Error,e.getMessage()); - } - else - if(log.isDebugEnabled())log.debug("Response already committed for handling "+th); - } - catch(Error e) - { - log.warn("Error for "+httpRequest.getURI(),e); - if(log.isDebugEnabled())log.debug(httpRequest); - + response.sendError(HttpResponse.__503_Service_Unavailable, e.getMessage()); + } else + response.sendError(HttpResponse.__500_Internal_Server_Error, e.getMessage()); + } else if (log.isDebugEnabled()) log.debug("Response already committed for handling " + th); + } catch (Error e) { + log.warn("Error for " + httpRequest.getURI(), e); + if (log.isDebugEnabled()) log.debug(httpRequest); + httpResponse.getHttpConnection().forceClose(); - if (!httpResponse.isCommitted()) - { - request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION_TYPE,e.getClass()); - request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION,e); + if (!httpResponse.isCommitted()) { + request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION_TYPE, e.getClass()); + request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION, e); response.sendError(HttpResponse.__500_Internal_Server_Error, - e.getMessage()); - } - else - if(log.isDebugEnabled())log.debug("Response already committed for handling ",e); - } - finally - { - if (servletHolder!=null && response!=null) - { + e.getMessage()); + } else if (log.isDebugEnabled()) log.debug("Response already committed for handling ", e); + } finally { + if (servletHolder != null && response != null) { response.complete(); } } } /* ------------------------------------------------------------ */ - /** Dispatch to a servletHolder. + + /** + * Dispatch to a servletHolder. * This method may be specialized to insert extra handling in the * dispatch of a request to a specific servlet. This is used by * WebApplicatonHandler to implement dispatched filters. * The default implementation simply calls * ServletHolder.handle(request,response) + * * @param pathInContext The path used to select the servlet holder. - * @param request - * @param response - * @param servletHolder - * @param type the type of dispatch as defined in the Dispatcher class. - * @exception ServletException - * @exception UnavailableException - * @exception IOException + * @param request + * @param response + * @param servletHolder + * @param type the type of dispatch as defined in the Dispatcher class. + * @throws ServletException + * @throws IOException */ protected void dispatch(String pathInContext, HttpServletRequest request, HttpServletResponse response, - ServletHolder servletHolder, + ServletHolder servletHolder, int type) - throws ServletException, - UnavailableException, - IOException - { - servletHolder.handle(request,response); + throws ServletException, + IOException { + servletHolder.handle(request, response); } - - + + /* ------------------------------------------------------------ */ - /** ServletHolder matching path. + + /** + * ServletHolder matching path. + * * @param pathInContext Path within context. * @return PathMap Entries pathspec to ServletHolder */ - public Map.Entry getHolderEntry(String pathInContext) - { + public Map.Entry getHolderEntry(String pathInContext) { return _servletMap.getMatch(pathInContext); } - + /* ------------------------------------------------------------ */ - public Set getResourcePaths(String uriInContext) - { - try - { - uriInContext=URI.canonicalPath(uriInContext); - if (uriInContext==null) + public Set getResourcePaths(String uriInContext) { + try { + uriInContext = URI.canonicalPath(uriInContext); + if (uriInContext == null) return Collections.EMPTY_SET; - Resource resource=getHttpContext().getResource(uriInContext); - if (resource==null || !resource.isDirectory()) + Resource resource = getHttpContext().getResource(uriInContext); + if (resource == null || !resource.isDirectory()) return Collections.EMPTY_SET; - String[] contents=resource.list(); - if (contents==null || contents.length==0) + String[] contents = resource.list(); + if (contents == null || contents.length == 0) return Collections.EMPTY_SET; - HashSet set = new HashSet(contents.length*2); - for (int i=0;i0) - { - query=uriInContext.substring(q+1); - uriInContext=uriInContext.substring(0,q); + + try { + String query = null; + int q = 0; + if ((q = uriInContext.indexOf('?')) > 0) { + query = uriInContext.substring(q + 1); + uriInContext = uriInContext.substring(0, q); } - if ((q=uriInContext.indexOf(';'))>0) - uriInContext=uriInContext.substring(0,q); + if ((q = uriInContext.indexOf(';')) > 0) + uriInContext = uriInContext.substring(0, q); - String pathInContext=URI.canonicalPath(URI.decodePath(uriInContext)); - Map.Entry entry=getHolderEntry(pathInContext); - if (entry!=null) + String pathInContext = URI.canonicalPath(URI.decodePath(uriInContext)); + Map.Entry entry = getHolderEntry(pathInContext); + if (entry != null) return new Dispatcher(ServletHandler.this, - uriInContext, - pathInContext, - query, - entry); - } - catch(Exception e) - { - LogSupport.ignore(log,e); + uriInContext, + pathInContext, + query, + entry); + } catch (Exception e) { + LogSupport.ignore(log, e); } return null; } /* ------------------------------------------------------------ */ - /** Get Named dispatcher. + + /** + * Get Named dispatcher. + * * @param name The name of the servlet. If null or empty string, the - * containers default servlet is returned. + * containers default servlet is returned. * @return Request dispatcher for the named servlet. */ - public RequestDispatcher getNamedDispatcher(String name) - { - if (name == null || name.length()==0) - name=__DEFAULT_SERVLET; - - try { return new Dispatcher(ServletHandler.this,name); } - catch(Exception e) {LogSupport.ignore(log,e);} - + public RequestDispatcher getNamedDispatcher(String name) { + if (name == null || name.length() == 0) + name = __DEFAULT_SERVLET; + + try { + return new Dispatcher(ServletHandler.this, name); + } catch (Exception e) { + LogSupport.ignore(log, e); + } + return null; } - /* ------------------------------------------------------------ */ protected void notFound(HttpServletRequest request, - HttpServletResponse response) - throws IOException - { - if(log.isDebugEnabled())log.debug("Not Found "+request.getRequestURI()); - String method=request.getMethod(); - + HttpServletResponse response) + throws IOException { + if (log.isDebugEnabled()) log.debug("Not Found " + request.getRequestURI()); + String method = request.getMethod(); + // Not found special requests. - if (method.equals(HttpRequest.__GET) || - method.equals(HttpRequest.__HEAD) || - method.equals(HttpRequest.__POST)) - { + if (method.equals(HttpRequest.__GET) || + method.equals(HttpRequest.__HEAD) || + method.equals(HttpRequest.__POST)) { response.sendError(HttpResponse.__404_Not_Found); - } - else if (method.equals(HttpRequest.__TRACE)) - handleTrace(request,response); + } else if (method.equals(HttpRequest.__TRACE)) + handleTrace(request, response); else if (method.equals(HttpRequest.__OPTIONS)) - handleOptions(request,response); - else - { + handleOptions(request, response); + else { // Unknown METHOD - response.setHeader(HttpFields.__Allow,__AllowString); + response.setHeader(HttpFields.__Allow, __AllowString); response.sendError(HttpResponse.__405_Method_Not_Allowed); } } - + /* ------------------------------------------------------------ */ protected void handleTrace(HttpServletRequest request, - HttpServletResponse response) - throws IOException - { + HttpServletResponse response) + throws IOException { response.setHeader(HttpFields.__ContentType, - HttpFields.__MessageHttp); - OutputStream out = response.getOutputStream(); - ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(); - writer.write(request.toString()); - writer.flush(); - response.setIntHeader(HttpFields.__ContentLength,writer.size()); - writer.writeTo(out); - out.flush(); + HttpFields.__MessageHttp); + try (ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(); + OutputStream out = response.getOutputStream()) { + writer.write(request.toString()); + writer.flush(); + response.setIntHeader(HttpFields.__ContentLength, writer.size()); + writer.writeTo(out); + out.flush(); + } } - + /* ------------------------------------------------------------ */ protected void handleOptions(HttpServletRequest request, - HttpServletResponse response) - throws IOException - { + HttpServletResponse response) + throws IOException { // Handle OPTIONS request for entire server - if ("*".equals(request.getRequestURI())) - { + if ("*".equals(request.getRequestURI())) { // 9.2 - response.setIntHeader(HttpFields.__ContentLength,0); - response.setHeader(HttpFields.__Allow,__AllowString); + response.setIntHeader(HttpFields.__ContentLength, 0); + response.setHeader(HttpFields.__Allow, __AllowString); response.flushBuffer(); - } - else + } else response.sendError(HttpResponse.__404_Not_Found); } /* ------------------------------------------------------------ */ - public String getErrorPage(int status,ServletHttpRequest request) - { + public String getErrorPage(int status, ServletHttpRequest request) { return null; } - + /* ------------------------------------------------------------ */ - /** Get context attribute. + + /** + * Get context attribute. * Tries ServletHandler attributes and then delegated to HttpContext. + * * @param name attribute name. * @return attribute */ - protected Object getContextAttribute(String name) - { - if (ServletHandler.__J_S_CONTEXT_TEMPDIR.equals(name)) - { + protected Object getContextAttribute(String name) { + if (ServletHandler.__J_S_CONTEXT_TEMPDIR.equals(name)) { // Initialize temporary directory Object t = getHttpContext().getAttribute(ServletHandler.__J_S_CONTEXT_TEMPDIR); if (t instanceof File) - return (File)t; - + return t; + return getHttpContext().getTempDirectory(); } @@ -930,16 +894,17 @@ protected Object getContextAttribute(String name) } /* ------------------------------------------------------------ */ - /** Get context attribute names. + + /** + * Get context attribute names. * Combines ServletHandler and HttpContext attributes. */ - protected Enumeration getContextAttributeNames() - { - if (_attributes.size()==0) + protected Enumeration getContextAttributeNames() { + if (_attributes.size() == 0) return getHttpContext().getAttributeNames(); - HashSet set=new HashSet(_attributes.keySet()); - Enumeration e=getHttpContext().getAttributeNames(); - while(e.hasMoreElements()) + HashSet set = new HashSet(_attributes.keySet()); + Enumeration e = getHttpContext().getAttributeNames(); + while (e.hasMoreElements()) set.add(e.nextElement()); return Collections.enumeration(set); } @@ -948,290 +913,450 @@ protected Enumeration getContextAttributeNames() /* Set a Servlet context attribute. * Servlet Context attributes may hide HttpContext attributes. */ - protected void setContextAttribute(String name, Object value) - { - _attributes.put(name,value); + protected void setContextAttribute(String name, Object value) { + _attributes.put(name, value); } - + /* ------------------------------------------------------------ */ /* Remove a Servlet context attribute. * Servlet Context attributes may hide HttpContext attributes. */ - protected void removeContextAttribute(String name) - { + protected void removeContextAttribute(String name) { _attributes.remove(name); } - + /* ----------------------------------------------------------------- */ public void handleTrace(HttpRequest request, HttpResponse response) - throws IOException - { - boolean trace=getHttpContext().getHttpServer().getTrace(); - + throws IOException { + boolean trace = getHttpContext().getHttpServer().getTrace(); + // Handle TRACE by returning request header response.setField(HttpFields.__ContentType, - HttpFields.__MessageHttp); - if (trace) - { + HttpFields.__MessageHttp); + if (trace) { OutputStream out = response.getOutputStream(); ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(); writer.write(request.toString()); writer.flush(); - response.setIntField(HttpFields.__ContentLength,writer.size()); + response.setIntField(HttpFields.__ContentLength, writer.size()); writer.writeTo(out); out.flush(); } request.setHandled(true); } - + /* ----------------------------------------------------------------- */ - public void destroy() - { + public void destroy() { Iterator iter = _nameMap.values().iterator(); - while (iter.hasNext()) - { - Object sh=iter.next(); + while (iter.hasNext()) { + Object sh = iter.next(); iter.remove(); removeComponent(sh); } - - if (_sessionManager!=null) + + if (_sessionManager != null) removeComponent(_sessionManager); - _sessionManager=null; - _context=null; + _sessionManager = null; + _context = null; super.destroy(); } - + /* ----------------------------------------------------------------- */ - protected void finalize() throws Throwable - { + protected void finalize() throws Throwable { destroy(); } - + /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ - class Context implements ServletContext - { + class Context implements ServletContext { @Override public String getContextPath() { return null; } /* -------------------------------------------------------- */ - ServletHandler getServletHandler() - { + ServletHandler getServletHandler() { return ServletHandler.this; } - + /* -------------------------------------------------------- */ - public ServletContext getContext(String uri) - { - ServletHandler handler= (ServletHandler) - getHttpContext().getHttpServer() - .findHandler(net.lightbody.bmp.proxy.jetty.jetty.servlet.ServletHandler.class, - uri, - getHttpContext().getVirtualHosts()); - if (handler!=null) + public ServletContext getContext(String uri) { + ServletHandler handler = (ServletHandler) + getHttpContext().getHttpServer() + .findHandler(net.lightbody.bmp.proxy.jetty.jetty.servlet.ServletHandler.class, + uri, + getHttpContext().getVirtualHosts()); + if (handler != null) return handler.getServletContext(); return null; } /* ------------------------------------------------------------ */ - public int getMajorVersion() - { + public int getMajorVersion() { return 2; } /* ------------------------------------------------------------ */ - public int getMinorVersion() - { + public int getMinorVersion() { return 4; } + @Override + public int getEffectiveMajorVersion() { + return 0; + } + + @Override + public int getEffectiveMinorVersion() { + return 0; + } + /* ------------------------------------------------------------ */ - public String getMimeType(String file) - { + public String getMimeType(String file) { return getHttpContext().getMimeByExtension(file); } /* ------------------------------------------------------------ */ - public Set getResourcePaths(String uriInContext) - { + public Set getResourcePaths(String uriInContext) { return ServletHandler.this.getResourcePaths(uriInContext); } /* ------------------------------------------------------------ */ public URL getResource(String uriInContext) - throws MalformedURLException - { + throws MalformedURLException { return ServletHandler.this.getResource(uriInContext); } /* ------------------------------------------------------------ */ - public InputStream getResourceAsStream(String uriInContext) - { + public InputStream getResourceAsStream(String uriInContext) { return ServletHandler.this.getResourceAsStream(uriInContext); } /* ------------------------------------------------------------ */ - public String getRealPath(String path) - { + public String getRealPath(String path) { return ServletHandler.this.getRealPath(path); } /* ------------------------------------------------------------ */ - public RequestDispatcher getRequestDispatcher(String uriInContext) - { + public RequestDispatcher getRequestDispatcher(String uriInContext) { return ServletHandler.this.getRequestDispatcher(uriInContext); } /* ------------------------------------------------------------ */ - public RequestDispatcher getNamedDispatcher(String name) - { + public RequestDispatcher getNamedDispatcher(String name) { return ServletHandler.this.getNamedDispatcher(name); } - + /* ------------------------------------------------------------ */ + /** - * @deprecated + * @deprecated */ - public Servlet getServlet(String name) - { + public Servlet getServlet(String name) { return null; } /* ------------------------------------------------------------ */ + /** - * @deprecated + * @deprecated */ - public Enumeration getServlets() - { + public Enumeration getServlets() { return Collections.enumeration(Collections.EMPTY_LIST); } /* ------------------------------------------------------------ */ + /** - * @deprecated + * @deprecated */ - public Enumeration getServletNames() - { + public Enumeration getServletNames() { return Collections.enumeration(Collections.EMPTY_LIST); } - + /* ------------------------------------------------------------ */ - /** Servlet Log. + + /** + * Servlet Log. * Log message to servlet log. Use either the system log or a * LogSinkset via the context attribute * org.mortbay.jetty.servlet.Context.LogSink - * @param msg + * + * @param msg */ - public void log(String msg) - { + public void log(String msg) { _contextLog.info(msg); } /* ------------------------------------------------------------ */ + /** * @deprecated As of Java Servlet API 2.1, use - * {@link #log(String message, Throwable throwable)} - * instead. + * {@link #log(String message, Throwable throwable)} + * instead. */ - public void log(Exception e, String msg) - { - _contextLog.warn(msg,e); + public void log(Exception e, String msg) { + _contextLog.warn(msg, e); } /* ------------------------------------------------------------ */ - public void log(String msg, Throwable th) - { - _contextLog.warn(msg,th); + public void log(String msg, Throwable th) { + _contextLog.warn(msg, th); } /* ------------------------------------------------------------ */ - public String getServerInfo() - { + public String getServerInfo() { return Version.getImplVersion(); } /* ------------------------------------------------------------ */ - /** Get context init parameter. + + /** + * Get context init parameter. * Delegated to HttpContext. + * * @param param param name * @return param value or null */ - public String getInitParameter(String param) - { + public String getInitParameter(String param) { return getHttpContext().getInitParameter(param); } /* ------------------------------------------------------------ */ - /** Get context init parameter names. + + /** + * Get context init parameter names. * Delegated to HttpContext. + * * @return Enumeration of names */ - public Enumeration getInitParameterNames() - { + public Enumeration getInitParameterNames() { return getHttpContext().getInitParameterNames(); } - + @Override + public boolean setInitParameter(String s, String s1) { + return false; + } + + /* ------------------------------------------------------------ */ - /** Get context attribute. + + /** + * Get context attribute. * Tries ServletHandler attributes and then delegated to HttpContext. + * * @param name attribute name. * @return attribute */ - public Object getAttribute(String name) - { + public Object getAttribute(String name) { return getContextAttribute(name); } /* ------------------------------------------------------------ */ - /** Get context attribute names. + + /** + * Get context attribute names. * Combines ServletHandler and HttpContext attributes. */ - public Enumeration getAttributeNames() - { + public Enumeration getAttributeNames() { return getContextAttributeNames(); } /* ------------------------------------------------------------ */ - /** Set context attribute names. + + /** + * Set context attribute names. * Sets the ServletHandler attributes and may hide HttpContext attributes. - * @param name attribute name. + * + * @param name attribute name. * @param value attribute value */ - public void setAttribute(String name, Object value) - { + public void setAttribute(String name, Object value) { setContextAttribute(name, value); } /* ------------------------------------------------------------ */ - /** Remove context attribute. + + /** + * Remove context attribute. * Puts a null into the ServletHandler attributes and may hide a HttpContext attribute. + * * @param name attribute name. */ - public void removeAttribute(String name) - { + public void removeAttribute(String name) { removeContextAttribute(name); } - + /* ------------------------------------------------------------ */ - public String getServletContextName() - { + public String getServletContextName() { if (getHttpContext() instanceof WebApplicationContext) - return ((WebApplicationContext)getHttpContext()).getDisplayName(); + return ((WebApplicationContext) getHttpContext()).getDisplayName(); + return null; + } + + @Override + public ServletRegistration.Dynamic addServlet(String s, String s1) { + return null; + } + + @Override + public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) { + return null; + } + + @Override + public ServletRegistration.Dynamic addServlet(String s, Class aClass) { + return null; + } + + @Override + public ServletRegistration.Dynamic addJspFile(String s, String s1) { + return null; + } + + @Override + public T createServlet(Class aClass) throws ServletException { + return null; + } + + @Override + public ServletRegistration getServletRegistration(String s) { + return null; + } + + @Override + public Map getServletRegistrations() { + return null; + } + + @Override + public FilterRegistration.Dynamic addFilter(String s, String s1) { + return null; + } + + @Override + public FilterRegistration.Dynamic addFilter(String s, Filter filter) { + return null; + } + + @Override + public FilterRegistration.Dynamic addFilter(String s, Class aClass) { return null; } + @Override + public T createFilter(Class aClass) throws ServletException { + return null; + } + + @Override + public FilterRegistration getFilterRegistration(String s) { + return null; + } + + @Override + public Map getFilterRegistrations() { + return null; + } + + @Override + public SessionCookieConfig getSessionCookieConfig() { + return null; + } + + @Override + public void setSessionTrackingModes(Set set) { + + } + + @Override + public Set getDefaultSessionTrackingModes() { + return null; + } + + @Override + public Set getEffectiveSessionTrackingModes() { + return null; + } + + @Override + public void addListener(String s) { + + } + + @Override + public void addListener(T t) { + + } + + @Override + public void addListener(Class aClass) { + + } + + @Override + public T createListener(Class aClass) throws ServletException { + return null; + } + + @Override + public JspConfigDescriptor getJspConfigDescriptor() { + return null; + } + + @Override + public ClassLoader getClassLoader() { + return null; + } + + @Override + public void declareRoles(String... strings) { + + } + + @Override + public String getVirtualServerName() { + return null; + } + + @Override + public int getSessionTimeout() { + return 0; + } + + @Override + public void setSessionTimeout(int i) { + + } + + @Override + public String getRequestCharacterEncoding() { + return null; + } + + @Override + public void setRequestCharacterEncoding(String s) { + + } + + @Override + public String getResponseCharacterEncoding() { + return null; + } + + @Override + public void setResponseCharacterEncoding(String s) { + + } + /* ------------------------------------------------------------ */ - public String toString() - { - return "ServletContext["+getHttpContext()+"]"; + public String toString() { + return "ServletContext[" + getHttpContext() + "]"; } - } + } } diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpRequest.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpRequest.java index 97b2f45aa..9a6cc4f02 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpRequest.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpRequest.java @@ -25,491 +25,437 @@ import net.lightbody.bmp.proxy.jetty.util.*; import org.apache.commons.logging.Log; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletRequest; -import javax.servlet.ServletRequestWrapper; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import javax.servlet.*; +import javax.servlet.http.*; +import java.io.*; import java.security.Principal; import java.util.*; /* ------------------------------------------------------------ */ -/** Servlet Request Wrapper. + +/** + * Servlet Request Wrapper. * This class wraps a Jetty HTTP request as a 2.2 Servlet * request. - *

+ *

* Note that this wrapper is not synchronized and if a request is to * be operated on by multiple threads, then higher level * synchronizations may be required. - * - * @version $Id: ServletHttpRequest.java,v 1.65 2005/08/13 00:01:27 gregwilkins Exp $ + * * @author Greg Wilkins (gregw) + * @version $Id: ServletHttpRequest.java,v 1.65 2005/08/13 00:01:27 gregwilkins Exp $ */ public class ServletHttpRequest - implements HttpServletRequest -{ + implements HttpServletRequest { private static Log log = LogFactory.getLog(ServletHttpRequest.class); /* -------------------------------------------------------------- */ public static final String - __SESSIONID_NOT_CHECKED = "not checked", - __SESSIONID_URL = "url", - __SESSIONID_COOKIE = "cookie", - __SESSIONID_NONE = "none"; + __SESSIONID_NOT_CHECKED = "not checked", + __SESSIONID_URL = "url", + __SESSIONID_COOKIE = "cookie", + __SESSIONID_NONE = "none"; - private static final Enumeration __emptyEnum = - Collections.enumeration(Collections.EMPTY_LIST); + private static final Enumeration __emptyEnum = + Collections.enumeration(Collections.EMPTY_LIST); private static final Collection __defaultLocale = - Collections.singleton(Locale.getDefault()); + Collections.singleton(Locale.getDefault()); - private ServletHandler _servletHandler; + private ServletHandler _servletHandler; private HttpRequest _httpRequest; private ServletHttpResponse _servletHttpResponse; - private String _contextPath=null; - private String _servletPath=null; - private String _pathInfo=null; - private String _query=null; - private String _pathTranslated=null; - private String _requestedSessionId=null; - private HttpSession _session=null; - private String _sessionIdState=__SESSIONID_NOT_CHECKED; - private ServletIn _in =null; - private BufferedReader _reader=null; - private int _inputState=0; + private String _contextPath = null; + private String _servletPath = null; + private String _pathInfo = null; + private String _query = null; + private String _pathTranslated = null; + private String _requestedSessionId = null; + private HttpSession _session = null; + private String _sessionIdState = __SESSIONID_NOT_CHECKED; + private ServletIn _in = null; + private BufferedReader _reader = null; + private int _inputState = 0; private ServletHolder _servletHolder; private String _pathInContext; - + /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. */ public ServletHttpRequest(ServletHandler servletHandler, - String pathInContext, - HttpRequest request) - { - _servletHandler=servletHandler; - _pathInContext=pathInContext; - _contextPath=_servletHandler.getHttpContext().getContextPath(); - if (_contextPath.length()<=1) - _contextPath=""; - - _httpRequest=request; - } - - /* ------------------------------------------------------------ */ - void recycle(ServletHandler servletHandler,String pathInContext) - { - _servletHandler=servletHandler; - _pathInContext=pathInContext; - _servletPath=null; - _pathInfo=null; - _query=null; - _pathTranslated=null; - _requestedSessionId=null; - _session=null; - _sessionIdState=__SESSIONID_NOT_CHECKED; - _in=null; - _reader=null; - _inputState=0; - _servletHolder=null; - - if (servletHandler!=null) - _contextPath=_servletHandler.getHttpContext().getContextPath(); - if (_contextPath!=null&&_contextPath.length()<=1) - _contextPath=""; - } - - - /* ------------------------------------------------------------ */ - ServletHandler getServletHandler() - { + String pathInContext, + HttpRequest request) { + _servletHandler = servletHandler; + _pathInContext = pathInContext; + _contextPath = _servletHandler.getHttpContext().getContextPath(); + if (_contextPath.length() <= 1) + _contextPath = ""; + + _httpRequest = request; + } + + /* ------------------------------------------------------------ */ + void recycle(ServletHandler servletHandler, String pathInContext) { + _servletHandler = servletHandler; + _pathInContext = pathInContext; + _servletPath = null; + _pathInfo = null; + _query = null; + _pathTranslated = null; + _requestedSessionId = null; + _session = null; + _sessionIdState = __SESSIONID_NOT_CHECKED; + _in = null; + _reader = null; + _inputState = 0; + _servletHolder = null; + + if (servletHandler != null) + _contextPath = _servletHandler.getHttpContext().getContextPath(); + if (_contextPath != null && _contextPath.length() <= 1) + _contextPath = ""; + } + + + /* ------------------------------------------------------------ */ + ServletHandler getServletHandler() { return _servletHandler; } /* ------------------------------------------------------------ */ - void setServletHandler(ServletHandler servletHandler) - { - _servletHandler=servletHandler; + void setServletHandler(ServletHandler servletHandler) { + _servletHandler = servletHandler; } - + /* ------------------------------------------------------------ */ - /** Set servletpath and pathInfo. + + /** + * Set servletpath and pathInfo. * Called by the Handler before passing a request to a particular * holder to split the context path into a servlet path and path info. - * @param servletPath - * @param pathInfo + * + * @param servletPath + * @param pathInfo */ void setServletPaths(String servletPath, String pathInfo, - ServletHolder holder) - { - _servletPath=servletPath; - _pathInfo=pathInfo; - _servletHolder=holder; + ServletHolder holder) { + _servletPath = servletPath; + _pathInfo = pathInfo; + _servletHolder = holder; } - + /* ------------------------------------------------------------ */ - ServletHolder getServletHolder() - { + ServletHolder getServletHolder() { return _servletHolder; } - + /* ------------------------------------------------------------ */ - String getPathInContext() - { + String getPathInContext() { return _pathInContext; } - + /* ------------------------------------------------------------ */ - HttpRequest getHttpRequest() - { + HttpRequest getHttpRequest() { return _httpRequest; } - + /* ------------------------------------------------------------ */ - public ServletHttpResponse getServletHttpResponse() - { + public ServletHttpResponse getServletHttpResponse() { return _servletHttpResponse; } - + /* ------------------------------------------------------------ */ - void setServletHttpResponse(ServletHttpResponse response) - { + void setServletHttpResponse(ServletHttpResponse response) { _servletHttpResponse = response; } /* ------------------------------------------------------------ */ - public Locale getLocale() - { + public Locale getLocale() { Enumeration enm = _httpRequest.getFieldValues(HttpFields.__AcceptLanguage, - HttpFields.__separators); + HttpFields.__separators); // handle no locale if (enm == null || !enm.hasMoreElements()) return Locale.getDefault(); - + // sort the list in quality order List acceptLanguage = HttpFields.qualityList(enm); - if (acceptLanguage.size()==0) - return Locale.getDefault(); + if (acceptLanguage.size() == 0) + return Locale.getDefault(); + + int size = acceptLanguage.size(); - int size=acceptLanguage.size(); - // convert to locals - for (int i=0; i -1) - { + if (dash > -1) { country = language.substring(dash + 1).trim(); - language = language.substring(0,dash).trim(); + language = language.substring(0, dash).trim(); } - return new Locale(language,country); + return new Locale(language, country); } - return Locale.getDefault(); + return Locale.getDefault(); } - + /* ------------------------------------------------------------ */ - public Enumeration getLocales() - { + public Enumeration getLocales() { Enumeration enm = _httpRequest.getFieldValues(HttpFields.__AcceptLanguage, - HttpFields.__separators); + HttpFields.__separators); // handle no locale if (enm == null || !enm.hasMoreElements()) return Collections.enumeration(__defaultLocale); - + // sort the list in quality order List acceptLanguage = HttpFields.qualityList(enm); - - if (acceptLanguage.size()==0) + + if (acceptLanguage.size() == 0) return - Collections.enumeration(__defaultLocale); + Collections.enumeration(__defaultLocale); Object langs = null; - int size=acceptLanguage.size(); - + int size = acceptLanguage.size(); + // convert to locals - for (int i=0; i -1) - { + if (dash > -1) { country = language.substring(dash + 1).trim(); - language = language.substring(0,dash).trim(); + language = language.substring(0, dash).trim(); } - langs=LazyList.ensureSize(langs,size); - langs=LazyList.add(langs,new Locale(language,country)); + langs = LazyList.ensureSize(langs, size); + langs = LazyList.add(langs, new Locale(language, country)); } - if (LazyList.size(langs)==0) + if (LazyList.size(langs) == 0) return Collections.enumeration(__defaultLocale); - + return Collections.enumeration(LazyList.getList(langs)); } - + /* ------------------------------------------------------------ */ - public boolean isSecure() - { + public boolean isSecure() { return _httpRequest.isConfidential(); } - + /* ------------------------------------------------------------ */ - public Cookie[] getCookies() - { + public Cookie[] getCookies() { Cookie[] cookies = _httpRequest.getCookies(); - if (cookies.length==0) + if (cookies.length == 0) return null; return cookies; } - + /* ------------------------------------------------------------ */ - public long getDateHeader(String name) - { + public long getDateHeader(String name) { return _httpRequest.getDateField(name); } - + /* ------------------------------------------------------------ */ - public Enumeration getHeaderNames() - { + public Enumeration getHeaderNames() { return _httpRequest.getFieldNames(); } - + /* ------------------------------------------------------------ */ - public String getHeader(String name) - { + public String getHeader(String name) { return _httpRequest.getField(name); } - + /* ------------------------------------------------------------ */ - public Enumeration getHeaders(String s) - { - Enumeration enm=_httpRequest.getFieldValues(s); - if (enm==null) + public Enumeration getHeaders(String s) { + Enumeration enm = _httpRequest.getFieldValues(s); + if (enm == null) return __emptyEnum; return enm; } - + /* ------------------------------------------------------------ */ public int getIntHeader(String name) - throws NumberFormatException - { + throws NumberFormatException { return _httpRequest.getIntField(name); } - + /* ------------------------------------------------------------ */ - public String getMethod() - { + public String getMethod() { return _httpRequest.getMethod(); } - + /* ------------------------------------------------------------ */ - public String getContextPath() - { + public String getContextPath() { return _contextPath; } - + /* ------------------------------------------------------------ */ - public String getPathInfo() - { - if (_servletPath==null) - return null; + public String getPathInfo() { + if (_servletPath == null) + return null; return _pathInfo; } - + /* ------------------------------------------------------------ */ - public String getPathTranslated() - { - if (_pathInfo==null || _pathInfo.length()==0) + public String getPathTranslated() { + if (_pathInfo == null || _pathInfo.length() == 0) return null; - if (_pathTranslated==null) - { + if (_pathTranslated == null) { Resource resource = - _servletHandler.getHttpContext().getBaseResource(); + _servletHandler.getHttpContext().getBaseResource(); - if (resource==null) + if (resource == null) return null; - try - { - resource=resource.addPath(_pathInfo); + try { + resource = resource.addPath(_pathInfo); File file = resource.getFile(); - if (file==null) + if (file == null) return null; - _pathTranslated=file.getAbsolutePath(); - } - catch(Exception e) - { - log.debug(LogSupport.EXCEPTION,e); + _pathTranslated = file.getAbsolutePath(); + } catch (Exception e) { + log.debug(LogSupport.EXCEPTION, e); } } - + return _pathTranslated; } - + /* ------------------------------------------------------------ */ - public String getQueryString() - { - if (_query==null) - _query =_httpRequest.getQuery(); + public String getQueryString() { + if (_query == null) + _query = _httpRequest.getQuery(); return _query; } - + /* ------------------------------------------------------------ */ - public String getAuthType() - { - String at= _httpRequest.getAuthType(); - if (at== SecurityConstraint.__BASIC_AUTH) + public String getAuthType() { + String at = _httpRequest.getAuthType(); + if (at == SecurityConstraint.__BASIC_AUTH) return HttpServletRequest.BASIC_AUTH; - if (at==SecurityConstraint.__FORM_AUTH) + if (at == SecurityConstraint.__FORM_AUTH) return HttpServletRequest.FORM_AUTH; - if (at==SecurityConstraint.__DIGEST_AUTH) + if (at == SecurityConstraint.__DIGEST_AUTH) return HttpServletRequest.DIGEST_AUTH; - if (at==SecurityConstraint.__CERT_AUTH) + if (at == SecurityConstraint.__CERT_AUTH) return HttpServletRequest.CLIENT_CERT_AUTH; - if (at==SecurityConstraint.__CERT_AUTH2) + if (at == SecurityConstraint.__CERT_AUTH2) return HttpServletRequest.CLIENT_CERT_AUTH; return at; } /* ------------------------------------------------------------ */ - public String getRemoteUser() - { + public String getRemoteUser() { return _httpRequest.getAuthUser(); } /* ------------------------------------------------------------ */ - public boolean isUserInRole(String role) - { - if (_servletHolder!=null) - role=_servletHolder.getUserRoleLink(role); + public boolean isUserInRole(String role) { + if (_servletHolder != null) + role = _servletHolder.getUserRoleLink(role); return _httpRequest.isUserInRole(role); } /* ------------------------------------------------------------ */ - public Principal getUserPrincipal() - { + public Principal getUserPrincipal() { return _httpRequest.getUserPrincipal(); } - + /* ------------------------------------------------------------ */ - void setRequestedSessionId(String pathParams) - { - _requestedSessionId=null; - + void setRequestedSessionId(String pathParams) { + _requestedSessionId = null; + // try cookies first - if (_servletHandler.isUsingCookies()) - { - Cookie[] cookies=_httpRequest.getCookies(); - if (cookies!=null && cookies.length>0) - { - for (int i=0;i 0) { + for (int i = 0; i < cookies.length; i++) { + if (SessionManager.__SessionCookie.equalsIgnoreCase(cookies[i].getName())) { + if (_requestedSessionId != null) { // Multiple jsessionid cookies. Probably due to // multiple paths and/or domains. Pick the first // known session or the last defined cookie. SessionManager manager = _servletHandler.getSessionManager(); - if (manager!=null && manager.getHttpSession(_requestedSessionId)!=null) + if (manager != null && manager.getHttpSession(_requestedSessionId) != null) break; log.debug("multiple session cookies"); } - - _requestedSessionId=cookies[i].getValue(); + + _requestedSessionId = cookies[i].getValue(); _sessionIdState = __SESSIONID_COOKIE; - if(log.isDebugEnabled())log.debug("Got Session "+_requestedSessionId+" from cookie"); + if (log.isDebugEnabled()) log.debug("Got Session " + _requestedSessionId + " from cookie"); } } } } - + // check if there is a url encoded session param. - if (pathParams!=null && pathParams.startsWith(SessionManager.__SessionURL)) - { + if (pathParams != null && pathParams.startsWith(SessionManager.__SessionURL)) { String id = - pathParams.substring(SessionManager.__SessionURL.length()+1); - if(log.isDebugEnabled())log.debug("Got Session "+id+" from URL"); - - if (_requestedSessionId==null) - { - _requestedSessionId=id; + pathParams.substring(SessionManager.__SessionURL.length() + 1); + if (log.isDebugEnabled()) log.debug("Got Session " + id + " from URL"); + + if (_requestedSessionId == null) { + _requestedSessionId = id; _sessionIdState = __SESSIONID_URL; - } - else if (!id.equals(_requestedSessionId)) + } else if (!id.equals(_requestedSessionId)) log.debug("Mismatched session IDs"); } - + if (_requestedSessionId == null) - _sessionIdState = __SESSIONID_NONE; + _sessionIdState = __SESSIONID_NONE; } - + /* ------------------------------------------------------------ */ - public String getRequestedSessionId() - { + public String getRequestedSessionId() { return _requestedSessionId; } - + /* ------------------------------------------------------------ */ - public String getRequestURI() - { + public String getRequestURI() { return _httpRequest.getEncodedPath(); } - + /* ------------------------------------------------------------ */ - public StringBuffer getRequestURL() - { + public StringBuffer getRequestURL() { StringBuffer buf = _httpRequest.getRootURL(); buf.append(getRequestURI()); return buf; } - + /* ------------------------------------------------------------ */ - public String getServletPath() - { - if (_servletPath==null) + public String getServletPath() { + if (_servletPath == null) return _pathInContext; return _servletPath; } - + /* ------------------------------------------------------------ */ - public HttpSession getSession(boolean create) - { - if (_session != null && ((SessionManager.Session)_session).isValid()) + public HttpSession getSession(boolean create) { + if (_session != null && ((SessionManager.Session) _session).isValid()) return _session; - - _session=null; - + + _session = null; + String id = getRequestedSessionId(); - - if (id != null) - { - _session=_servletHandler.getHttpSession(id); + + if (id != null) { + _session = _servletHandler.getHttpSession(id); if (_session == null && !create) return null; } - - if (_session == null && create) - { - _session=newSession(); + + if (_session == null && create) { + _session = newSession(); } - + return _session; } @@ -517,169 +463,187 @@ public HttpSession getSession(boolean create) /* Create a new HttpSession. * If cookies are being used a set cookie is added to the response. */ - HttpSession newSession() - { - HttpSession session=_servletHandler.newHttpSession(this); - Cookie cookie=_servletHandler.getSessionManager().getSessionCookie(session,isSecure()); - if (cookie!=null) + HttpSession newSession() { + HttpSession session = _servletHandler.newHttpSession(this); + Cookie cookie = _servletHandler.getSessionManager().getSessionCookie(session, isSecure()); + if (cookie != null) _servletHttpResponse.getHttpResponse().addSetCookie(cookie); return session; } - + /* ------------------------------------------------------------ */ - public HttpSession getSession() - { + public HttpSession getSession() { HttpSession session = getSession(true); return session; } - + + @Override + public String changeSessionId() { + return null; + } + /* ------------------------------------------------------------ */ - public boolean isRequestedSessionIdValid() - { + public boolean isRequestedSessionIdValid() { return _requestedSessionId != null && getSession(false) != null; } - + /* -------------------------------------------------------------- */ - public boolean isRequestedSessionIdFromCookie() - { + public boolean isRequestedSessionIdFromCookie() { return _sessionIdState == __SESSIONID_COOKIE; } - + /* -------------------------------------------------------------- */ - public boolean isRequestedSessionIdFromURL() - { + public boolean isRequestedSessionIdFromURL() { return _sessionIdState == __SESSIONID_URL; } - + /* -------------------------------------------------------------- */ + /** * @deprecated */ - public boolean isRequestedSessionIdFromUrl() - { + public boolean isRequestedSessionIdFromUrl() { return isRequestedSessionIdFromURL(); } - + + @Override + public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { + return false; + } + + @Override + public void login(String s, String s1) throws ServletException { + + } + + @Override + public void logout() throws ServletException { + + } + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String s) throws IOException, ServletException { + return null; + } + + @Override + public T upgrade(Class aClass) throws IOException, ServletException { + return null; + } + /* -------------------------------------------------------------- */ - public Enumeration getAttributeNames() - { + public Enumeration getAttributeNames() { return _httpRequest.getAttributeNames(); } - + /* -------------------------------------------------------------- */ - public Object getAttribute(String name) - { + public Object getAttribute(String name) { return _httpRequest.getAttribute(name); } - + /* -------------------------------------------------------------- */ - public void setAttribute(String name, Object value) - { - _httpRequest.setAttribute(name,value); + public void setAttribute(String name, Object value) { + _httpRequest.setAttribute(name, value); } - + /* -------------------------------------------------------------- */ - public void removeAttribute(String name) - { + public void removeAttribute(String name) { _httpRequest.removeAttribute(name); } - + /* -------------------------------------------------------------- */ public void setCharacterEncoding(String encoding) - throws UnsupportedEncodingException - { - if (_inputState!=0) + throws UnsupportedEncodingException { + if (_inputState != 0) throw new IllegalStateException("getReader() or getInputStream() called"); "".getBytes(encoding); - _httpRequest.setCharacterEncoding(encoding,false); + _httpRequest.setCharacterEncoding(encoding, false); } - + /* -------------------------------------------------------------- */ - public String getCharacterEncoding() - { + public String getCharacterEncoding() { return _httpRequest.getCharacterEncoding(); } - + /* -------------------------------------------------------------- */ - public int getContentLength() - { + public int getContentLength() { return _httpRequest.getContentLength(); } - + + @Override + public long getContentLengthLong() { + return 0; + } + /* -------------------------------------------------------------- */ - public String getContentType() - { + public String getContentType() { return _httpRequest.getContentType(); } - + /* -------------------------------------------------------------- */ - public ServletInputStream getInputStream() - { - if (_inputState!=0 && _inputState!=1) + public ServletInputStream getInputStream() { + if (_inputState != 0 && _inputState != 1) throw new IllegalStateException(); - if (_in==null) - _in = new ServletIn((HttpInputStream)_httpRequest.getInputStream()); - _inputState=1; - _reader=null; - return _in; + if (_in == null) + _in = new ServletIn((HttpInputStream) _httpRequest.getInputStream()); + _inputState = 1; + _reader = null; + return (ServletInputStream) _in.getInputStream(); } - + /* -------------------------------------------------------------- */ + /** * This method is not recommended as it forces the generation of a * non-optimal data structure. */ - public Map getParameterMap() - { + public Map getParameterMap() { return Collections.unmodifiableMap(_httpRequest.getParameterStringArrayMap()); } - + /* -------------------------------------------------------------- */ - public String getParameter(String name) - { + public String getParameter(String name) { return _httpRequest.getParameter(name); } - + /* -------------------------------------------------------------- */ - public Enumeration getParameterNames() - { + public Enumeration getParameterNames() { return Collections.enumeration(_httpRequest.getParameterNames()); } - + /* -------------------------------------------------------------- */ - public String[] getParameterValues(String name) - { - List v=_httpRequest.getParameterValues(name); - if (v==null) + public String[] getParameterValues(String name) { + List v = _httpRequest.getParameterValues(name); + if (v == null) return null; - String[]a=new String[v.size()]; - return (String[])v.toArray(a); + String[] a = new String[v.size()]; + return (String[]) v.toArray(a); } - + /* -------------------------------------------------------------- */ - public String getProtocol() - { + public String getProtocol() { return _httpRequest.getVersion(); } - + /* -------------------------------------------------------------- */ - public String getScheme() - { + public String getScheme() { return _httpRequest.getScheme(); } - + /* -------------------------------------------------------------- */ - public String getServerName() - { + public String getServerName() { return _httpRequest.getHost(); } - + /* -------------------------------------------------------------- */ - public int getServerPort() - { + public int getServerPort() { int port = _httpRequest.getPort(); - if (port==0) - { + if (port == 0) { if (getScheme().equalsIgnoreCase("https")) return 443; return 80; @@ -688,136 +652,158 @@ public int getServerPort() } /* -------------------------------------------------------------- */ - public int getRemotePort() - { - HttpConnection connection= _httpRequest.getHttpConnection(); - if (connection!=null) + public int getRemotePort() { + HttpConnection connection = _httpRequest.getHttpConnection(); + if (connection != null) return connection.getRemotePort(); return 0; } - + /* -------------------------------------------------------------- */ - public String getLocalName() - { - HttpConnection connection= _httpRequest.getHttpConnection(); - if (connection!=null) + public String getLocalName() { + HttpConnection connection = _httpRequest.getHttpConnection(); + if (connection != null) return connection.getServerName(); return null; } - + /* -------------------------------------------------------------- */ - public String getLocalAddr() - { - HttpConnection connection= _httpRequest.getHttpConnection(); - if (connection!=null) + public String getLocalAddr() { + HttpConnection connection = _httpRequest.getHttpConnection(); + if (connection != null) return connection.getServerAddr(); return null; } - + /* -------------------------------------------------------------- */ - public int getLocalPort() - { - HttpConnection connection= _httpRequest.getHttpConnection(); - if (connection!=null) + public int getLocalPort() { + HttpConnection connection = _httpRequest.getHttpConnection(); + if (connection != null) return connection.getServerPort(); return 0; } - + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } + /* -------------------------------------------------------------- */ public BufferedReader getReader() - throws UnsupportedEncodingException - { - if (_inputState!=0 && _inputState!=2) + throws UnsupportedEncodingException { + if (_inputState != 0 && _inputState != 2) throw new IllegalStateException(); - if (_reader==null) - { - String encoding=getCharacterEncoding(); - if (encoding==null) - encoding=StringUtil.__ISO_8859_1; - _reader=new BufferedReader(new InputStreamReader(getInputStream(),encoding)); - + if (_reader == null) { + String encoding = getCharacterEncoding(); + if (encoding == null) + encoding = StringUtil.__ISO_8859_1; + _reader = new BufferedReader(new InputStreamReader(getInputStream(), encoding)); + } - _inputState=2; + _inputState = 2; return _reader; } - + /* -------------------------------------------------------------- */ - public String getRemoteAddr() - { + public String getRemoteAddr() { return _httpRequest.getRemoteAddr(); } - + /* -------------------------------------------------------------- */ - public String getRemoteHost() - { - if (_httpRequest.getHttpConnection()==null) + public String getRemoteHost() { + if (_httpRequest.getHttpConnection() == null) return null; return _httpRequest.getRemoteHost(); } /* -------------------------------------------------------------- */ + /** - * @deprecated As of Version 2.1 of the Java Servlet API, - * use {@link javax.servlet.ServletContext#getRealPath} instead. + * @deprecated As of Version 2.1 of the Java Servlet API, + * use {@link javax.servlet.ServletException#getRealPath(String)} instead. */ - public String getRealPath(String path) - { + public String getRealPath(String path) { return _servletHandler.getServletContext().getRealPath(path); } /* ------------------------------------------------------------ */ - public RequestDispatcher getRequestDispatcher(String url) - { + public RequestDispatcher getRequestDispatcher(String url) { if (url == null) return null; - if (!url.startsWith("/")) - { - String relTo=URI.addPaths(_servletPath,_pathInfo); - int slash=relTo.lastIndexOf("/"); - if (slash>1) - relTo=relTo.substring(0,slash+1); + if (!url.startsWith("/")) { + String relTo = URI.addPaths(_servletPath, _pathInfo); + int slash = relTo.lastIndexOf("/"); + if (slash > 1) + relTo = relTo.substring(0, slash + 1); else - relTo="/"; - url=URI.addPaths(relTo,url); + relTo = "/"; + url = URI.addPaths(relTo, url); } - + return _servletHandler.getServletContext().getRequestDispatcher(url); } /* ------------------------------------------------------------ */ - public String toString() - { + public String toString() { return - getContextPath()+"+"+getServletPath()+"+"+getPathInfo()+"\n"+ - _httpRequest.toString(); + getContextPath() + "+" + getServletPath() + "+" + getPathInfo() + "\n" + + _httpRequest.toString(); } - + /* ------------------------------------------------------------ */ - /** Unwrap a ServletRequest. + + /** + * Unwrap a ServletRequest. * + * @param request + * @return The core ServletHttpRequest which must be the + * underlying request object * @see javax.servlet.ServletRequestWrapper * @see javax.servlet.http.HttpServletRequestWrapper - * @param request - * @return The core ServletHttpRequest which must be the - * underlying request object */ - public static ServletHttpRequest unwrap(ServletRequest request) - { - while (!(request instanceof ServletHttpRequest)) - { - if (request instanceof ServletRequestWrapper) - { + public static ServletHttpRequest unwrap(ServletRequest request) { + while (!(request instanceof ServletHttpRequest)) { + if (request instanceof ServletRequestWrapper) { ServletRequestWrapper wrapper = - (ServletRequestWrapper)request; - request=wrapper.getRequest(); - } - else + (ServletRequestWrapper) request; + request = wrapper.getRequest(); + } else throw new IllegalArgumentException("Does not wrap ServletHttpRequest"); } - return (ServletHttpRequest)request; + return (ServletHttpRequest) request; } } diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpResponse.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpResponse.java index 2acb69aeb..864a4802e 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpResponse.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletHttpResponse.java @@ -29,6 +29,7 @@ import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; +import java.util.Collection; import java.util.Locale; /* ------------------------------------------------------------ */ @@ -520,6 +521,26 @@ public void setStatus(int status, String message) _httpResponse.setReason(message); } + @Override + public int getStatus() { + return 0; + } + + @Override + public String getHeader(String s) { + return null; + } + + @Override + public Collection getHeaders(String s) { + return null; + } + + @Override + public Collection getHeaderNames() { + return null; + } + /* ------------------------------------------------------------ */ public ServletOutputStream getOutputStream() @@ -594,7 +615,12 @@ public void setContentLength(int len) if (!isCommitted()) setIntHeader(HttpFields.__ContentLength,len); } - + + @Override + public void setContentLengthLong(long l) { + + } + /* ------------------------------------------------------------ */ public String getContentType() { diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletIn.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletIn.java index a475eb2ae..010dfb5ea 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletIn.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletIn.java @@ -17,78 +17,76 @@ import net.lightbody.bmp.proxy.jetty.http.HttpInputStream; -import javax.servlet.ServletInputStream; import java.io.IOException; -class ServletIn extends ServletInputStream -{ +class ServletIn extends HttpInputStream { HttpInputStream _in; /* ------------------------------------------------------------ */ - ServletIn(HttpInputStream in) - { - _in=in; + ServletIn(HttpInputStream in) { + super(in); + _in = in; } - + /* ------------------------------------------------------------ */ + @Override public int read() - throws IOException - { + throws IOException { return _in.read(); } - + /* ------------------------------------------------------------ */ - public int read(byte b[]) throws IOException - { + @Override + public int read(byte b[]) throws IOException { return _in.read(b); } - + /* ------------------------------------------------------------ */ - public int read(byte b[], int off, int len) throws IOException - { - return _in.read(b,off,len); + @Override + public int read(byte b[], int off, int len) throws IOException { + return _in.read(b, off, len); } - + /* ------------------------------------------------------------ */ - public long skip(long len) throws IOException - { + @Override + public long skip(long len) throws IOException { return _in.skip(len); } - + /* ------------------------------------------------------------ */ + @Override public int available() - throws IOException - { + throws IOException { return _in.available(); } - + /* ------------------------------------------------------------ */ + @Override public void close() - throws IOException - { + throws IOException { _in.close(); } - + /* ------------------------------------------------------------ */ - public boolean markSupported() - { + @Override + public boolean markSupported() { return _in.markSupported(); } - + /* ------------------------------------------------------------ */ + @Override public void reset() - throws IOException - { + throws IOException { _in.reset(); } - + /* ------------------------------------------------------------ */ - public void mark(int readlimit) - { + @Override + public void mark(int readlimit) { _in.mark(readlimit); } - + } diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletOut.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletOut.java index 277b233c9..591db2e47 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletOut.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/jetty/servlet/ServletOut.java @@ -18,73 +18,79 @@ import net.lightbody.bmp.proxy.jetty.util.IO; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import java.io.IOException; import java.io.OutputStream; -class ServletOut extends ServletOutputStream -{ +class ServletOut extends ServletOutputStream { OutputStream _out; /* ------------------------------------------------------------ */ - ServletOut(OutputStream out) - { - _out=out; + ServletOut(OutputStream out) { + _out = out; } - + /* ------------------------------------------------------------ */ public void write(int ch) - throws IOException - { + throws IOException { _out.write(ch); } - + /* ------------------------------------------------------------ */ - public void write(byte[]b) - throws IOException - { + @Override + public void write(byte[] b) + throws IOException { _out.write(b); } - + /* ------------------------------------------------------------ */ - public void write(byte[]b,int o,int l) - throws IOException - { - _out.write(b,o,l); + @Override + public void write(byte[] b, int o, int l) + throws IOException { + _out.write(b, o, l); } /* ------------------------------------------------------------ */ + @Override public void flush() - throws IOException - { + throws IOException { _out.flush(); } - + /* ------------------------------------------------------------ */ + @Override public void close() - throws IOException - { + throws IOException { super.close(); _out.close(); } - + /* ------------------------------------------------------------ */ - public void disable() - throws IOException - { - _out=IO.getNullStream(); + public void disable() { + _out = IO.getNullStream(); } /* ------------------------------------------------------------ */ - public void print(String s) throws IOException - { - if (s!=null) write(s.getBytes()); + @Override + public void print(String s) throws IOException { + if (s != null) write(s.getBytes()); } /* ------------------------------------------------------------ */ - public void println(String s) throws IOException - { - if (s!=null) write(s.getBytes()); - write(IO.CRLF_BYTES); + @Override + public void println(String s) throws IOException { + if (s != null) write(s.getBytes()); + write(IO.CRLF_BYTES); + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + } } diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/util/Container.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/util/Container.java index 1c2782f22..251caa7af 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/util/Container.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/util/Container.java @@ -28,283 +28,259 @@ /* ------------------------------------------------------------ */ -/** Abstract Container. + +/** + * Abstract Container. * Provides base handling for LifeCycle and Component events. * - * @version $Id: Container.java,v 1.4 2005/08/13 08:49:59 gregwilkins Exp $ * @author Greg Wilkins (gregw) + * @version $Id: Container.java,v 1.4 2005/08/13 08:49:59 gregwilkins Exp $ */ -public abstract class Container implements LifeCycle,EventProvider,Serializable -{ +public abstract class Container implements LifeCycle, EventProvider, Serializable { private static Log log = LogFactory.getLog(Container.class); - + private Object _eventListeners; private Object _components; - + private transient boolean _started; private transient boolean _starting; private transient boolean _stopping; - + /* ------------------------------------------------------------ */ - /** Start the server. + + /** + * Start the server. * Generate LifeCycleEvents for starting and started either side of a call to doStart */ public synchronized final void start() - throws Exception - { + throws Exception { if (_started || _starting) return; - - _starting=true; - - if (log.isDebugEnabled()) log.debug("Starting "+this); + + _starting = true; + + if (log.isDebugEnabled()) log.debug("Starting " + this); LifeCycleEvent event = new LifeCycleEvent(this); - for(int i=0;i() { @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { try { Files.delete(file); } catch (IOException e) { @@ -43,7 +43,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO } @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + public FileVisitResult postVisitDirectory(Path dir, IOException exc) { try { Files.delete(dir); } catch (IOException e) { diff --git a/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/HarTest.java b/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/HarTest.java index 346273133..d1e5901bd 100644 --- a/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/HarTest.java +++ b/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/HarTest.java @@ -80,252 +80,252 @@ public void testRequestAndResponseSizesAreSet() throws Exception { assertEquals(13, entry.getResponse().getBodySize()); } - @Test - public void testThatProxyCanCaptureBodyInHar() throws IOException, InterruptedException { - proxy.setCaptureContent(true); - proxy.newHar("Test"); + @Test + public void testThatProxyCanCaptureBodyInHar() throws IOException, InterruptedException { + proxy.setCaptureContent(true); + proxy.newHar("Test"); - String body = IOUtils.toStringAndClose(client.execute(new HttpGet(getLocalServerHostnameAndPort() + "/a.txt")).getEntity().getContent()); + String body = IOUtils.toStringAndClose(client.execute(new HttpGet(getLocalServerHostnameAndPort() + "/a.txt")).getEntity().getContent()); - assertThat(body, containsString("this is a.txt")); + assertThat(body, containsString("this is a.txt")); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - HarEntry entry = entries.get(0); - assertNotNull("No entry found", entry); - HarResponse response = entry.getResponse(); - assertNotNull("Response is null", response); - HarContent content = response.getContent(); - assertNotNull("Content is null", content); - String mime = content.getMimeType(); - assertEquals("Mime not matched", "text/plain", mime); - String encoding = content.getEncoding(); - assertEquals("Encoding not matched", null, encoding); - String text = content.getText(); - assertEquals("Text not matched", "this is a.txt", text); - } - - @Test - public void testThatProxyCanCaptureJsonRpc() throws IOException, InterruptedException { - proxy.setCaptureContent(true); - proxy.newHar("Test"); - - HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/jsonrpc"); - HttpEntity entity = new StringEntity("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}"); - post.setEntity(entity); - post.addHeader("Accept", "application/json-rpc"); - post.addHeader("Content-Type", "application/json; charset=UTF-8"); - - String body = IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); - - assertThat(body, containsString("{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{}}")); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + HarEntry entry = entries.get(0); + assertNotNull("No entry found", entry); + HarResponse response = entry.getResponse(); + assertNotNull("Response is null", response); + HarContent content = response.getContent(); + assertNotNull("Content is null", content); + String mime = content.getMimeType(); + assertEquals("Mime not matched", "text/plain", mime); + String encoding = content.getEncoding(); + assertEquals("Encoding not matched", null, encoding); + String text = content.getText(); + assertEquals("Text not matched", "this is a.txt", text); + } + + @Test + public void testThatProxyCanCaptureJsonRpc() throws IOException, InterruptedException { + proxy.setCaptureContent(true); + proxy.newHar("Test"); + + HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/jsonrpc"); + HttpEntity entity = new StringEntity("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}"); + post.setEntity(entity); + post.addHeader("Accept", "application/json-rpc"); + post.addHeader("Content-Type", "application/json; charset=UTF-8"); + + String body = IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); + + assertThat(body, containsString("{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{}}")); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - HarEntry entry = entries.get(0); - assertNotNull("No entry found", entry); - HarResponse response = entry.getResponse(); - assertNotNull("Response is null", response); - HarRequest request = entry.getRequest(); - assertNotNull("Request is null", request); - HarPostData postdata = request.getPostData(); - assertNotNull("PostData is null", postdata); - assertThat(postdata.getText(), containsString("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}")); - } - - @Test - public void testThatTraditionalPostParamsAreCaptured() throws IOException, InterruptedException { - proxy.setCaptureContent(true); - proxy.newHar("Test"); - - HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/jsonrpc"); - post.setEntity(new UrlEncodedFormEntity(Collections.singletonList(new BasicNameValuePair("foo", "bar")))); - - IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + HarEntry entry = entries.get(0); + assertNotNull("No entry found", entry); + HarResponse response = entry.getResponse(); + assertNotNull("Response is null", response); + HarRequest request = entry.getRequest(); + assertNotNull("Request is null", request); + HarPostData postdata = request.getPostData(); + assertNotNull("PostData is null", postdata); + assertThat(postdata.getText(), containsString("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}")); + } + + @Test + public void testThatTraditionalPostParamsAreCaptured() throws IOException, InterruptedException { + proxy.setCaptureContent(true); + proxy.newHar("Test"); + + HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/jsonrpc"); + post.setEntity(new UrlEncodedFormEntity(Collections.singletonList(new BasicNameValuePair("foo", "bar")))); + + IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - HarEntry entry = entries.get(0); - assertNotNull("No entry found", entry); - HarResponse response = entry.getResponse(); - assertNotNull("Response is null", response); - HarRequest request = entry.getRequest(); - assertNotNull("Request is null", request); - HarPostData postdata = request.getPostData(); - assertNotNull("PostData is null", postdata); - assertEquals("application/x-www-form-urlencoded", postdata.getMimeType()); - assertEquals(1, postdata.getParams().size()); - assertEquals("foo", postdata.getParams().get(0).getName()); - assertEquals("bar", postdata.getParams().get(0).getValue()); - } - - @Test - public void testThatImagesAreCapturedAsBase64EncodedContent() throws IOException, InterruptedException { - proxy.setCaptureContent(true); - proxy.newHar("Test"); - - InputStream is1 = client.execute(new HttpGet(getLocalServerHostnameAndPort() + "/c.png")).getEntity().getContent(); - ByteArrayOutputStream o1 = new ByteArrayOutputStream(); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + HarEntry entry = entries.get(0); + assertNotNull("No entry found", entry); + HarResponse response = entry.getResponse(); + assertNotNull("Response is null", response); + HarRequest request = entry.getRequest(); + assertNotNull("Request is null", request); + HarPostData postdata = request.getPostData(); + assertNotNull("PostData is null", postdata); + assertEquals("application/x-www-form-urlencoded", postdata.getMimeType()); + assertEquals(1, postdata.getParams().size()); + assertEquals("foo", postdata.getParams().get(0).getName()); + assertEquals("bar", postdata.getParams().get(0).getValue()); + } + + @Test + public void testThatImagesAreCapturedAsBase64EncodedContent() throws IOException, InterruptedException { + proxy.setCaptureContent(true); + proxy.newHar("Test"); + + InputStream is1 = client.execute(new HttpGet(getLocalServerHostnameAndPort() + "/c.png")).getEntity().getContent(); + ByteArrayOutputStream o1 = new ByteArrayOutputStream(); IOUtils.copyAndClose(is1, o1); - ByteArrayOutputStream o2 = new ByteArrayOutputStream(); + ByteArrayOutputStream o2 = new ByteArrayOutputStream(); IOUtils.copyAndClose(HarTest.class.getResourceAsStream("/local-server/c.png"), o2); - assertTrue("Image does not match file system", Arrays.equals(o1.toByteArray(), o2.toByteArray())); + assertTrue("Image does not match file system", Arrays.equals(o1.toByteArray(), o2.toByteArray())); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - HarEntry entry = entries.get(0); - assertNotNull("No entry found", entry); - HarResponse response = entry.getResponse(); - assertNotNull("Response is null", response); - HarContent content = response.getContent(); - assertNotNull("Content is null", content); - String mime = content.getMimeType(); - assertEquals("Mime not matched", "image/png", mime); - String encoding = content.getEncoding(); - assertEquals("Encoding not matched", "base64", encoding); - String text = content.getText(); - String base64 = "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"; - assertEquals("Base64 not correct", base64, text); - } - - @Test - public void testThatUrlEncodedQueryStringIsParsedCorrecty() throws IOException, InterruptedException { - proxy.setCaptureContent(true); - proxy.newHar("Test"); - - HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt?foo=bar&a=1%262"); - client.execute(get); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + HarEntry entry = entries.get(0); + assertNotNull("No entry found", entry); + HarResponse response = entry.getResponse(); + assertNotNull("Response is null", response); + HarContent content = response.getContent(); + assertNotNull("Content is null", content); + String mime = content.getMimeType(); + assertEquals("Mime not matched", "image/png", mime); + String encoding = content.getEncoding(); + assertEquals("Encoding not matched", "base64", encoding); + String text = content.getText(); + String base64 = "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"; + assertEquals("Base64 not correct", base64, text); + } + + @Test + public void testThatUrlEncodedQueryStringIsParsedCorrecty() throws IOException, InterruptedException { + proxy.setCaptureContent(true); + proxy.newHar("Test"); + + HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt?foo=bar&a=1%262"); + client.execute(get); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - HarEntry entry = entries.get(0); - assertNotNull("No entry found", entry); - HarRequest req = entry.getRequest(); - assertNotNull("No request found", req); - // the HAR spec is not clear on what order the parameters should show up in. intuitively, since getQueryString() - // returns a List, the order should match the query string itself, but this is not technically required. - boolean sawFoo = false; - boolean sawA = false; - for (HarNameValuePair queryStringParam : req.getQueryString()) { - if (queryStringParam.getName().equals("foo")) { - assertEquals("expected 'foo' query param's value to be 'bar'", "bar", queryStringParam.getValue()); - sawFoo = true; - } else if (queryStringParam.getName().equals("a")) { - assertEquals("expected 'a' query param's value to be '1&2'", "1&2", queryStringParam.getValue()); - sawA = true; - } else { - fail("Unexpected query param: " + queryStringParam.getName() + ", value: " + queryStringParam.getValue()); - } - } - - assertTrue("did not find query param 'foo'", sawFoo); - assertTrue("did not find query param 'a'", sawA); - } - - @Test - public void testThatGzippedContentIsProperlyCapturedInHar() throws IOException, InterruptedException { - proxy.setCaptureContent(true); - proxy.newHar("Test"); - - // gzip all requests - server.forceGzip(); - - HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt"); - get.addHeader("Accept-Encoding", "gzip"); - String body = IOUtils.toStringAndClose(new GZIPInputStream(client.execute(get).getEntity().getContent())); - - assertThat(body, containsString("this is a.txt")); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + HarEntry entry = entries.get(0); + assertNotNull("No entry found", entry); + HarRequest req = entry.getRequest(); + assertNotNull("No request found", req); + // the HAR spec is not clear on what order the parameters should show up in. intuitively, since getQueryString() + // returns a List, the order should match the query string itself, but this is not technically required. + boolean sawFoo = false; + boolean sawA = false; + for (HarNameValuePair queryStringParam : req.getQueryString()) { + if (queryStringParam.getName().equals("foo")) { + assertEquals("expected 'foo' query param's value to be 'bar'", "bar", queryStringParam.getValue()); + sawFoo = true; + } else if (queryStringParam.getName().equals("a")) { + assertEquals("expected 'a' query param's value to be '1&2'", "1&2", queryStringParam.getValue()); + sawA = true; + } else { + fail("Unexpected query param: " + queryStringParam.getName() + ", value: " + queryStringParam.getValue()); + } + } + + assertTrue("did not find query param 'foo'", sawFoo); + assertTrue("did not find query param 'a'", sawA); + } + + @Test + public void testThatGzippedContentIsProperlyCapturedInHar() throws IOException, InterruptedException { + proxy.setCaptureContent(true); + proxy.newHar("Test"); + + // gzip all requests + server.forceGzip(); + + HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt"); + get.addHeader("Accept-Encoding", "gzip"); + String body = IOUtils.toStringAndClose(new GZIPInputStream(client.execute(get).getEntity().getContent())); + + assertThat(body, containsString("this is a.txt")); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - HarEntry entry = entries.get(0); - assertNotNull("No entry found", entry); - HarResponse response = entry.getResponse(); - assertNotNull("Response is null", response); - HarContent content = response.getContent(); - assertNotNull("Content is null", content); - String mime = content.getMimeType(); - assertEquals("Mime not matched", "text/plain", mime); - String text = content.getText(); - assertEquals("Text not matched", "this is a.txt", text); - } - - @Test - public void testHarPagesPopulated() throws IOException, InterruptedException { - proxy.newHar("testpage1"); - - HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt"); - IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); - - proxy.endPage(); - - proxy.newPage("testpage2"); - - IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); - IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); - - proxy.endPage(); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + HarEntry entry = entries.get(0); + assertNotNull("No entry found", entry); + HarResponse response = entry.getResponse(); + assertNotNull("Response is null", response); + HarContent content = response.getContent(); + assertNotNull("Content is null", content); + String mime = content.getMimeType(); + assertEquals("Mime not matched", "text/plain", mime); + String text = content.getText(); + assertEquals("Text not matched", "this is a.txt", text); + } + + @Test + public void testHarPagesPopulated() throws IOException, InterruptedException { + proxy.newHar("testpage1"); + + HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt"); + IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); + + proxy.endPage(); + + proxy.newPage("testpage2"); + + IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); + IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); + + proxy.endPage(); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); - - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - - assertNotNull("har pages are null", log.getPages()); - assertEquals("expected 2 har pages", 2, log.getPages().size()); - - HarPage page1 = log.getPages().get(0); - assertEquals("incorrect har page id", "testpage1", page1.getId()); - assertEquals("incorrect har page title", page1.getId(), page1.getTitle()); - assertNotNull("har page timings are null", page1.getPageTimings()); - - HarPageTimings timings1 = page1.getPageTimings(); - assertNotNull("har page onLoad timing is null", timings1.getOnLoad()); - assertNotEquals("har page onLoad timing should be greater than 0", 0L, timings1.getOnLoad().longValue()); - - HarPage page2 = log.getPages().get(1); - assertEquals("incorrect har page id", "testpage2", page2.getId()); - assertEquals("incorrect har page id", page2.getId(), page2.getTitle()); - assertNotNull("har page timings are null", page2.getPageTimings()); - HarPageTimings timings2 = page2.getPageTimings(); - assertNotNull("har page onLoad timing is null", timings2.getOnLoad()); - assertNotEquals("har page onLoad timing should be greater than 0", 0L, timings2.getOnLoad().longValue()); - } + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); + + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + + assertNotNull("har pages are null", log.getPages()); + assertEquals("expected 2 har pages", 2, log.getPages().size()); + + HarPage page1 = log.getPages().get(0); + assertEquals("incorrect har page id", "testpage1", page1.getId()); + assertEquals("incorrect har page title", page1.getId(), page1.getTitle()); + assertNotNull("har page timings are null", page1.getPageTimings()); + + HarPageTimings timings1 = page1.getPageTimings(); + assertNotNull("har page onLoad timing is null", timings1.getOnLoad()); + assertNotEquals("har page onLoad timing should be greater than 0", 0L, timings1.getOnLoad().longValue()); + + HarPage page2 = log.getPages().get(1); + assertEquals("incorrect har page id", "testpage2", page2.getId()); + assertEquals("incorrect har page id", page2.getId(), page2.getTitle()); + assertNotNull("har page timings are null", page2.getPageTimings()); + HarPageTimings timings2 = page2.getPageTimings(); + assertNotNull("har page onLoad timing is null", timings2.getOnLoad()); + assertNotEquals("har page onLoad timing should be greater than 0", 0L, timings2.getOnLoad().longValue()); + } @Test public void testHarPageTitlePopulated() throws Exception { @@ -359,79 +359,79 @@ public void testHarPageTitlePopulated() throws Exception { assertEquals("incorrect har page title", "Test Page 2", page2.getTitle()); } - @Test - public void testIpAddressPopulatedForLocalhost() throws IOException, InterruptedException { - proxy.newHar("testIpAddressPopulated"); + @Test + public void testIpAddressPopulatedForLocalhost() throws IOException, InterruptedException { + proxy.newHar("testIpAddressPopulated"); - HttpGet get = new HttpGet("http://localhost:8080/a.txt"); - IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); + HttpGet get = new HttpGet("http://localhost:8080/a.txt"); + IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); - proxy.endPage(); + proxy.endPage(); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - assertThat("Entries are empty", entries, not(empty())); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + assertThat("Entries are empty", entries, not(empty())); - HarEntry entry = log.getEntries().get(0); - assertNotNull("entry startedDateTime is null", entry.getStartedDateTime()); + HarEntry entry = log.getEntries().get(0); + assertNotNull("entry startedDateTime is null", entry.getStartedDateTime()); - assertEquals("entry pageref is incorrect", "testIpAddressPopulated", entry.getPageref()); + assertEquals("entry pageref is incorrect", "testIpAddressPopulated", entry.getPageref()); - assertEquals("entry ip address is not correct", "127.0.0.1", entry.getServerIPAddress()); + assertEquals("entry ip address is not correct", "127.0.0.1", entry.getServerIPAddress()); } - @Test - public void testIpAddressPopulatedForIpAddressUrl() throws IOException, InterruptedException { - proxy.newHar("testIpAddressPopulatedForIpAddressUrl"); + @Test + public void testIpAddressPopulatedForIpAddressUrl() throws IOException, InterruptedException { + proxy.newHar("testIpAddressPopulatedForIpAddressUrl"); HttpGet get = new HttpGet(getLocalServerHostnameAndPort() + "/a.txt"); - IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); + IOUtils.toStringAndClose(client.execute(get).getEntity().getContent()); - proxy.endPage(); + proxy.endPage(); Thread.sleep(500); - Har har = proxy.getHar(); - assertNotNull("Har is null", har); - HarLog log = har.getLog(); - assertNotNull("Log is null", log); + Har har = proxy.getHar(); + assertNotNull("Har is null", har); + HarLog log = har.getLog(); + assertNotNull("Log is null", log); - List entries = log.getEntries(); - assertNotNull("Entries are null", entries); - assertThat("Entries are empty", entries, not(empty())); + List entries = log.getEntries(); + assertNotNull("Entries are null", entries); + assertThat("Entries are empty", entries, not(empty())); - HarEntry entry = log.getEntries().get(0); - assertNotNull("entry startedDateTime is null", entry.getStartedDateTime()); + HarEntry entry = log.getEntries().get(0); + assertNotNull("entry startedDateTime is null", entry.getStartedDateTime()); - assertEquals("entry pageref is incorrect", "testIpAddressPopulatedForIpAddressUrl", entry.getPageref()); + assertEquals("entry pageref is incorrect", "testIpAddressPopulatedForIpAddressUrl", entry.getPageref()); - assertEquals("entry ip address is not correct", "127.0.0.1", entry.getServerIPAddress()); - } + assertEquals("entry ip address is not correct", "127.0.0.1", entry.getServerIPAddress()); + } - @Test - public void testNonChunkedRequestPayloadSizesAreSet() throws Exception { - proxy.setCaptureContent(true); - proxy.newHar("test"); + @Test + public void testNonChunkedRequestPayloadSizesAreSet() throws Exception { + proxy.setCaptureContent(true); + proxy.newHar("test"); - HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/jsonrpc"); - String jsonRpcString = "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}"; - HttpEntity entity = new StringEntity(jsonRpcString); - post.setEntity(entity); - post.addHeader("Accept", "application/json-rpc"); - post.addHeader("Content-Type", "application/json; charset=UTF-8"); + HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/jsonrpc"); + String jsonRpcString = "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}"; + HttpEntity entity = new StringEntity(jsonRpcString); + post.setEntity(entity); + post.addHeader("Accept", "application/json-rpc"); + post.addHeader("Content-Type", "application/json; charset=UTF-8"); - String body = IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); + String body = IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); Thread.sleep(500); - Har har = proxy.getHar(); - HarLog log = har.getLog(); - List entries = log.getEntries(); - HarEntry entry = entries.get(0); + Har har = proxy.getHar(); + HarLog log = har.getLog(); + List entries = log.getEntries(); + HarEntry entry = entries.get(0); /* Request headers should be something like this: @@ -439,40 +439,40 @@ public void testNonChunkedRequestPayloadSizesAreSet() throws Exception { Host: 127.0.0.1:8080 User-Agent: bmp.lightbody.net/2.0-beta-10-SNAPSHOT */ - assertThat("Minimum header size not seen", entry.getRequest().getHeadersSize(), greaterThan(70L)); - assertEquals("Body size does not match POST data size", jsonRpcString.length(), entry.getRequest().getBodySize()); - } + assertThat("Minimum header size not seen", entry.getRequest().getHeadersSize(), greaterThan(70L)); + assertEquals("Body size does not match POST data size", jsonRpcString.length(), entry.getRequest().getBodySize()); + } - @Test - public void testChunkedResponseBodySizeSet() throws Exception { - proxy.setCaptureContent(true); - proxy.newHar("test"); + @Test + public void testChunkedResponseBodySizeSet() throws Exception { + proxy.setCaptureContent(true); + proxy.newHar("test"); - HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/echopayload"); - String lengthyPost = createRandomString(100000); + HttpPost post = new HttpPost(getLocalServerHostnameAndPort() + "/echopayload"); + String lengthyPost = createRandomString(100000); - HttpEntity entity = new StringEntity(lengthyPost); - post.setEntity(entity); - post.addHeader("Content-Type", "text/unknown; charset=UTF-8"); + HttpEntity entity = new StringEntity(lengthyPost); + post.setEntity(entity); + post.addHeader("Content-Type", "text/unknown; charset=UTF-8"); - String body = IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); + String body = IOUtils.toStringAndClose(client.execute(post).getEntity().getContent()); Thread.sleep(500); - Har har = proxy.getHar(); - HarLog log = har.getLog(); - List entries = log.getEntries(); - HarEntry entry = entries.get(0); - - assertEquals("Expected response size to equal the size of the echoed POST request", lengthyPost.length(), entry.getResponse().getBodySize()); - } - - private String createRandomString(int length) { - Random random = new Random(); - StringBuilder lengthyPost = new StringBuilder(length); - for (int i = 0; i < length; i++) { - lengthyPost.append((char)(random.nextInt(94) + 32)); - } - - return lengthyPost.toString(); - } + Har har = proxy.getHar(); + HarLog log = har.getLog(); + List entries = log.getEntries(); + HarEntry entry = entries.get(0); + + assertEquals("Expected response size to equal the size of the echoed POST request", lengthyPost.length(), entry.getResponse().getBodySize()); + } + + private String createRandomString(int length) { + Random random = new Random(); + StringBuilder lengthyPost = new StringBuilder(length); + for (int i = 0; i < length; i++) { + lengthyPost.append((char) (random.nextInt(94) + 32)); + } + + return lengthyPost.toString(); + } } diff --git a/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/MailingListIssuesTest.java b/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/MailingListIssuesTest.java index d99c5c07f..d9b4850d7 100644 --- a/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/MailingListIssuesTest.java +++ b/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/MailingListIssuesTest.java @@ -35,12 +35,7 @@ public void testThatInterceptorIsCalled() throws IOException, InterruptedExcepti assumeFalse(Boolean.getBoolean("bmp.use.littleproxy")); final boolean[] interceptorHit = {false}; - proxy.addRequestInterceptor(new RequestInterceptor() { - @Override - public void process(BrowserMobHttpRequest request, Har har) { - interceptorHit[0] = true; - } - }); + proxy.addRequestInterceptor((RequestInterceptor) (request, har) -> interceptorHit[0] = true); String body = IOUtils.toStringAndClose(client.execute(new HttpGet(getLocalServerHostnameAndPort() + "/a.txt")).getEntity().getContent()); diff --git a/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/test/util/LocalServer.java b/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/test/util/LocalServer.java index 58f93b8f4..30494f884 100644 --- a/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/test/util/LocalServer.java +++ b/browsermob-legacy/src/test/java/net/lightbody/bmp/proxy/test/util/LocalServer.java @@ -4,15 +4,21 @@ import net.lightbody.bmp.proxy.test.servlet.EchoServlet; import net.lightbody.bmp.proxy.test.servlet.JsonServlet; import net.lightbody.bmp.proxy.test.servlet.SetCookieServlet; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.GzipHandler; +import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.nio.file.Paths; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -42,17 +48,17 @@ public void start() { servletHandler.addServletWithMapping(EchoServlet.class, "/echo"); servletHandler.addServletWithMapping(EchoPayloadServlet.class, "/echopayload"); - handlers.addHandler(servletHandler); // create a ResourceHandler to serve up static resources from the classpath at /local-server ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setBaseResource(Resource.newClassPathResource("/local-server")); - handlers.addHandler(resourceHandler); // wrap the other handlers in a GzipHandler that does not gzip anything by default GzipHandler gzipHandler = new GzipHandler(); gzipHandler.setMinGzipSize(Integer.MAX_VALUE); + handlers.addHandler(resourceHandler); + handlers.addHandler(servletHandler); gzipHandler.setHandler(handlers); server.setHandler(gzipHandler); @@ -63,7 +69,7 @@ public void start() { throw new RuntimeException("Could not start local Jetty server for tests", e); } - this.port = server.getConnectors()[0].getLocalPort(); + this.port = server.getURI().getPort(); started.set(true); } @@ -78,7 +84,7 @@ public int getPort() { } /** - * Forces the server to gzip all responses (see {@link org.eclipse.jetty.server.handler.GzipHandler} for response codes that will + * Forces the server to gzip all responses (see {@link org.eclipse.jetty.server.handler.gzip.GzipHandler} for response codes that will * be gzipped). */ public void forceGzip() { diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index f05d352c6..6f75ea6ff 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT 4.0.0 @@ -40,19 +40,19 @@ com.google.inject guice - 3.0 + 4.2.2 com.google.inject.extensions guice-servlet - 3.0 + 4.2.2 com.google.inject.extensions guice-multibindings - 3.0 + 4.2.2 @@ -63,13 +63,13 @@ org.eclipse.jetty jetty-server - 7.3.0.v20110203 + 9.4.15.v20190215 org.eclipse.jetty jetty-servlet - 7.3.0.v20110203 + 9.4.15.v20190215 diff --git a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/JettyServerProvider.java b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/JettyServerProvider.java index 4584620ca..2fca0da09 100644 --- a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/JettyServerProvider.java +++ b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/JettyServerProvider.java @@ -4,13 +4,16 @@ import com.google.inject.Provider; import com.google.inject.name.Named; import com.google.inject.servlet.GuiceFilter; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.UnknownHostException; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; +import javax.servlet.DispatcherType; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.UnknownHostException; +import java.util.EnumSet; + public class JettyServerProvider implements Provider { private Server server; @@ -22,7 +25,7 @@ public JettyServerProvider(@Named("port") int port, @Named("address") String add ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); - context.addFilter(GuiceFilter.class, "/*", 0); + context.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class)); context.addServlet(DefaultServlet.class, "/"); server.setHandler(context); diff --git a/mitm/pom.xml b/mitm/pom.xml index eeef1dcab..125fc87e0 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 83dc06f58..bbd259c8e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.20-SNAPSHOT + 2.1.22-SNAPSHOT browsermob-core browsermob-legacy @@ -146,7 +146,7 @@ maven-surefire-plugin 2.19.1 - -Xmx1g -XX:MaxPermSize=256m + -Xmx1g @@ -241,7 +241,7 @@ com.google.guava guava - 27.0.1-jre + 27.1-jre From 68b38423dc27bebc8c9148dee6f9e0f07ca15a72 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Wed, 3 Apr 2019 11:10:59 +0200 Subject: [PATCH 17/41] added proxy 0 responses logged in (#16) * added proxy 0 responses logged in * Snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../java/net/lightbody/bmp/filters/HarCaptureFilter.java | 5 ++--- .../lightbody/bmp/filters/HttpConnectHarCaptureFilter.java | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 429d6e8fb..73ab65cdc 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 943519f11..f014e04f8 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 684ccb659..e349cf93c 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -262,7 +262,6 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { harEntry.getResponse().setBodySize(responseBodySize.get()); logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } - return super.serverToProxyResponse(httpObject); } @@ -293,7 +292,6 @@ else if (sendFinishedNanos > 0L && responseReceiveStartedNanos == 0L) { else if (responseReceiveStartedNanos > 0L) { harEntry.getTimings().setReceive(timeoutTimestampNanos - responseReceiveStartedNanos, TimeUnit.NANOSECONDS); } - logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } @@ -764,7 +762,8 @@ public void serverToProxyResponseReceived() { } } - private void logFailedRequestIfRequired(HarRequest request, HarResponse response) { + protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { + System.out.println("TEST"); if (!isAlreadyLoggedIn.get() && (response.getStatus() >= 500 || response.getStatus() == 0)) { MDC.put("caller", "mobproxy"); MDC.put("http_response_code", String.valueOf(response.getStatus())); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java index ab683df7d..7619ca595 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java @@ -343,7 +343,7 @@ private HarEntry createHarEntryForFailedCONNECT(String errorMessage) { populateServerIpAddress(harEntry); - + HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); return harEntry; } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 9116c0b59..89ae83d5b 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 593e98eca..7d79f2866 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 6f75ea6ff..bc5cf6ff5 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 125fc87e0..ba27b42cc 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index bbd259c8e..68d36a5cb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.22-SNAPSHOT + 2.1.23-SNAPSHOT browsermob-core browsermob-legacy From 6191a41776c9760c9ec4b035d39fc0c218de9c72 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Thu, 4 Apr 2019 11:16:07 +0200 Subject: [PATCH 18/41] Memory consumption fix (#17) * Memory consumption fix * Fix stats d metric filter * small fix * SNAPSHOT version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../bmp/filters/HarCaptureFilter.java | 1 - .../bmp/filters/StatsDMetricsFilter.java | 32 ++++++------------- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 16 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 73ab65cdc..c83761823 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index f014e04f8..b6f77501b 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index e349cf93c..26b386b53 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -763,7 +763,6 @@ public void serverToProxyResponseReceived() { } protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - System.out.println("TEST"); if (!isAlreadyLoggedIn.get() && (response.getStatus() >= 500 || response.getStatus() == 0)) { MDC.put("caller", "mobproxy"); MDC.put("http_response_code", String.valueOf(response.getStatus())); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 6127a22e4..7f5575bb2 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -8,29 +8,16 @@ import io.netty.handler.codec.http.HttpResponse; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import org.littleshoot.proxy.HttpFiltersAdapter; import java.net.URI; import java.net.URISyntaxException; public class StatsDMetricsFilter extends HttpsAwareFiltersAdapter { - private StatsDClient client; - private static InheritableThreadLocal HTTP_REQUEST_STORAGE = new InheritableThreadLocal<>(); - public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ctx) { super(originalRequest, ctx); - this.client = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); - } - - @Override - public HttpResponse clientToProxyRequest(HttpObject httpObject) { - if (httpObject instanceof HttpRequest) { - HttpRequest httpRequest = (HttpRequest) httpObject; - HTTP_REQUEST_STORAGE.set(httpRequest); - } - return null; } - @Override public HttpObject serverToProxyResponse(HttpObject httpObject) { if (HttpResponse.class.isAssignableFrom(httpObject.getClass())) { @@ -43,30 +30,29 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { private void prepareStatsDMetrics(int status) { if (status > 399 || status == 0) { - String metric; - HttpRequest request = HTTP_REQUEST_STORAGE.get(); - String url = getFullUrl(request); - metric = getProxyPrefix().concat( + String url = getFullUrl(originalRequest); + String metric = getProxyPrefix().concat( prepareMetric(url)).concat(String.format(".%s", status)); + StatsDClient client = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); client.increment(metric); - HTTP_REQUEST_STORAGE.remove(); + client.stop(); } } - static String getStatsDHost() { + protected static String getStatsDHost() { return StringUtils.isEmpty(System.getenv("STATSD_HOST")) ? "localhost" : System.getenv("STATSD_HOST"); } - static int getStatsDPort() { + protected static int getStatsDPort() { return StringUtils.isEmpty(System.getenv("STATSD_PORT")) ? 8125 : NumberUtils.toInt(System.getenv("STATSD_PORT")); } - public static String getProxyPrefix() { + protected static String getProxyPrefix() { return "proxy."; } - public static String prepareMetric(String initialUrl) { + protected static String prepareMetric(String initialUrl) { URI uri = null; try { uri = new URI(initialUrl); diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 89ae83d5b..93abb9b47 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 7d79f2866..a154b0d0c 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index bc5cf6ff5..144405a84 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index ba27b42cc..7aa96b2af 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 68d36a5cb..7fc8df66d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.23-SNAPSHOT + 2.1.24-SNAPSHOT browsermob-core browsermob-legacy From 3362a388de33bb708e64f39b317e481e0ac7bfbe Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Fri, 5 Apr 2019 13:09:09 +0200 Subject: [PATCH 19/41] BMP_2.1.24 release (#18) * BMP_2.1.24 release change the order of logging the failed connect request * Fix versions --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../lightbody/bmp/filters/HttpConnectHarCaptureFilter.java | 4 +++- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c83761823..08aaf6ce7 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.24-SNAPSHOT + 2.1.24 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index b6f77501b..cee4a5114 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24-SNAPSHOT + 2.1.24 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java index 7619ca595..6533d06ad 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java @@ -163,6 +163,7 @@ public void proxyToServerResolutionFailed(String hostAndPort) { harEntry.getTimings().setDns(System.nanoTime() - dnsResolutionStartedNanos, TimeUnit.NANOSECONDS); } + HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); httpConnectTimes.remove(clientAddress); } @@ -178,6 +179,7 @@ public void proxyToServerConnectionFailed() { harEntry.getTimings().setConnect(System.nanoTime() - connectionStartedNanos, TimeUnit.NANOSECONDS); } + HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); httpConnectTimes.remove(clientAddress); } @@ -223,6 +225,7 @@ else if (sendFinishedNanos > 0L && responseReceiveStartedNanos == 0L) { else if (responseReceiveStartedNanos > 0L) { harEntry.getTimings().setReceive(timeoutTimestampNanos - responseReceiveStartedNanos, TimeUnit.NANOSECONDS); } + HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } @Override @@ -343,7 +346,6 @@ private HarEntry createHarEntryForFailedCONNECT(String errorMessage) { populateServerIpAddress(harEntry); - HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); return harEntry; } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 93abb9b47..548ef65ae 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24-SNAPSHOT + 2.1.24 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index a154b0d0c..69c8dc8de 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24-SNAPSHOT + 2.1.24 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 144405a84..079f1a189 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24-SNAPSHOT + 2.1.24 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 7aa96b2af..3abdbd544 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24-SNAPSHOT + 2.1.24 4.0.0 diff --git a/pom.xml b/pom.xml index 7fc8df66d..8e726d2cb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.24-SNAPSHOT + 2.1.24 browsermob-core browsermob-legacy From a811befdd7cc53e7e94d08fd20a50cd37f629967 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 8 Apr 2019 10:30:10 +0200 Subject: [PATCH 20/41] BMP_2.1.27 promotion (#19) * BMP_2.1.25 promotion * Snapshot * one more small fix * BMP 2.1.26 remove unused 0 codes logs * one more update * promote versions * Snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../net/lightbody/bmp/filters/HarCaptureFilter.java | 13 +++++++++++-- .../bmp/filters/HttpConnectHarCaptureFilter.java | 1 - browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 18 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 08aaf6ce7..29144c3b8 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.24 + 2.1.28-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index cee4a5114..f28c31717 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24 + 2.1.28-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 26b386b53..e87a0c6c7 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -158,8 +158,6 @@ public HarCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, responseCaptureFilter = null; } - createStatsDClient(); - this.har = har; this.harEntry = new HarEntry(currentPageRef); @@ -273,6 +271,7 @@ public void serverToProxyResponseTimedOut() { createStatsDClient(); statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".response_timeout")); + stopStatsDClient(); response.setError(HarCaptureUtil.getResponseTimedOutErrorMessage()); @@ -646,6 +645,7 @@ public void proxyToServerResolutionFailed(String hostAndPort) { createStatsDClient(); statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".server_resolution_fail")); + stopStatsDClient(); response.setError(HarCaptureUtil.getResolutionFailedErrorMessage(hostAndPort)); @@ -653,6 +653,7 @@ public void proxyToServerResolutionFailed(String hostAndPort) { if (dnsResolutionStartedNanos > 0L) { harEntry.getTimings().setDns(System.nanoTime() - dnsResolutionStartedNanos, TimeUnit.NANOSECONDS); } + logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } @Override @@ -690,6 +691,7 @@ public void proxyToServerConnectionFailed() { createStatsDClient(); statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".server_connection_fail")); + stopStatsDClient(); harEntry.setResponse(response); response.setError(HarCaptureUtil.getConnectionFailedErrorMessage()); @@ -780,4 +782,11 @@ private void createStatsDClient() { statsDClient.set(new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort())); } } + + private void stopStatsDClient() { + if (Objects.nonNull(statsDClient.get())) { + statsDClient.get().stop(); + statsDClient.remove(); + } + } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java index 6533d06ad..e3d9a1d54 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java @@ -179,7 +179,6 @@ public void proxyToServerConnectionFailed() { harEntry.getTimings().setConnect(System.nanoTime() - connectionStartedNanos, TimeUnit.NANOSECONDS); } - HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); httpConnectTimes.remove(clientAddress); } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 548ef65ae..159509b81 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24 + 2.1.28-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 69c8dc8de..36ff0d817 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24 + 2.1.28-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 079f1a189..635c2a9c4 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24 + 2.1.28-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 3abdbd544..239377c31 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.24 + 2.1.28-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 8e726d2cb..8b60f486f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.24 + 2.1.28-SNAPSHOT browsermob-core browsermob-legacy From 5b601c26f12c68a382e52f3e2739b86f90293021 Mon Sep 17 00:00:00 2001 From: "kyrylo.bilchenko" Date: Mon, 8 Apr 2019 16:21:59 +0200 Subject: [PATCH 21/41] minor change --- .../java/net/lightbody/bmp/filters/HarCaptureFilter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index e87a0c6c7..59a864640 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -35,7 +35,7 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); private static final ThreadLocal statsDClient = new InheritableThreadLocal<>(); - private static final ThreadLocal isAlreadyLoggedIn = InheritableThreadLocal.withInitial(() -> false); + private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); /** * The currently active HAR at the time the current request is received. @@ -258,8 +258,8 @@ public HttpObject serverToProxyResponse(HttpObject httpObject) { } harEntry.getResponse().setBodySize(responseBodySize.get()); - logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } + logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); return super.serverToProxyResponse(httpObject); } @@ -765,7 +765,8 @@ public void serverToProxyResponseReceived() { } protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - if (!isAlreadyLoggedIn.get() && (response.getStatus() >= 500 || response.getStatus() == 0)) { + if ((Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) + && (response.getStatus() >= 500 || response.getStatus() == 0)) { MDC.put("caller", "mobproxy"); MDC.put("http_response_code", String.valueOf(response.getStatus())); MDC.put("http_host", request.getUrl()); @@ -773,7 +774,7 @@ protected static void logFailedRequestIfRequired(HarRequest request, HarResponse MDC.put("method", request.getMethod()); MDC.put("response", BeansJsonMapper.getJsonString(response)); log.error("received bad status code"); - isAlreadyLoggedIn.set(true); + isAlreadyLoggedIn.set(request); } } From 42c7cf303ba15cfa1fd1aa5104af034bc938521d Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Fri, 3 May 2019 13:40:29 +0200 Subject: [PATCH 22/41] BMP 2.1.28 promotion (#20) * BMP 2.1.28 promotion * small fix in the test * added snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../bmp/filters/HarCaptureFilter.java | 16 ++++++++++++++++ .../filters/HttpConnectHarCaptureFilter.java | 13 +------------ .../lightbody/bmp/proxy/WhitelistTest.groovy | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 8 ++++---- resources/jar/littleproxy-1.1.4.jar | Bin 130381 -> 0 bytes resources/jar/littleproxy-1.1.5.jar | Bin 0 -> 126970 bytes 12 files changed, 28 insertions(+), 23 deletions(-) delete mode 100644 resources/jar/littleproxy-1.1.4.jar create mode 100644 resources/jar/littleproxy-1.1.5.jar diff --git a/README.md b/README.md index 29144c3b8..5cace265f 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index f28c31717..f0f20862d 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 59a864640..1be4b6f12 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -163,6 +163,22 @@ public HarCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, this.harEntry = new HarEntry(currentPageRef); } + @Override + public HttpObject proxyToClientResponse(HttpObject httpObject) { + if (httpObject instanceof LastHttpContent) { + if (harEntry.getResponse().getStatus() == 0) { + HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); + createStatsDClient(); + statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".request_timeout")); + stopStatsDClient(); + + } + } + + return super.proxyToClientResponse(httpObject); + } + @Override public HttpResponse clientToProxyRequest(HttpObject httpObject) { // if a ServerResponseCaptureFilter is configured, delegate to it to collect the client request. if it is not diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java index e3d9a1d54..de4829a67 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java @@ -1,17 +1,11 @@ package net.lightbody.bmp.filters; import com.google.common.cache.CacheBuilder; -import com.timgroup.statsd.NonBlockingStatsDClient; -import com.timgroup.statsd.StatsDClient; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; -import net.lightbody.bmp.core.har.Har; -import net.lightbody.bmp.core.har.HarEntry; -import net.lightbody.bmp.core.har.HarRequest; -import net.lightbody.bmp.core.har.HarResponse; -import net.lightbody.bmp.core.har.HarTimings; +import net.lightbody.bmp.core.har.*; import net.lightbody.bmp.filters.support.HttpConnectTiming; import net.lightbody.bmp.filters.util.HarCaptureUtil; import net.lightbody.bmp.util.HttpUtil; @@ -25,8 +19,6 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; -import static net.lightbody.bmp.filters.StatsDMetricsFilter.*; - /** * This filter captures HAR data for HTTP CONNECT requests. CONNECTs are "meta" requests that must be made before HTTPS * requests, but are not populated as separate requests in the HAR. Most information from HTTP CONNECTs (such as SSL @@ -38,7 +30,6 @@ */ public class HttpConnectHarCaptureFilter extends HttpsAwareFiltersAdapter implements ModifiedRequestAwareFilter { private static final Logger log = LoggerFactory.getLogger(HttpConnectHarCaptureFilter.class); - private static final StatsDClient statsDClient = new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); /** * The currently active HAR at the time the current request is received. @@ -336,8 +327,6 @@ private HarEntry createHarEntryForFailedCONNECT(String errorMessage) { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); - statsDClient.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) - .concat("." + harEntry.getResponse().getStatus()).concat(".failed_connect_request")); response.setError(errorMessage); diff --git a/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy b/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy index 55fae8ce0..aa2d40b59 100644 --- a/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy +++ b/browsermob-core/src/test/groovy/net/lightbody/bmp/proxy/WhitelistTest.groovy @@ -37,7 +37,7 @@ class WhitelistTest extends MockServerTest { @Test void testWhitelistCannotShortCircuitCONNECT() { HttpRequest request = mock(HttpRequest.class) - when(request.getMethod()).thenReturn(HttpMethod.CONNECT) + when(request.method()).thenReturn(HttpMethod.CONNECT) when(request.uri()).thenReturn('somedomain.com:443') when(request.protocolVersion()).thenReturn(HttpVersion.HTTP_1_1) diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 159509b81..32e80f85d 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 36ff0d817..37b2b5635 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 635c2a9c4..a425e6343 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 239377c31..dc5519677 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 8b60f486f..4389eb4d3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.28-SNAPSHOT + 2.1.29-SNAPSHOT browsermob-core browsermob-legacy @@ -176,11 +176,11 @@ false install - ${basedir}/resources/jar/littleproxy-1.1.4.jar + ${basedir}/resources/jar/littleproxy-1.1.5.jar default org.littleshoot littleproxy - 1.1.4 + 1.1.5 jar @@ -308,7 +308,7 @@ org.littleshoot littleproxy - 1.1.4 + 1.1.5 diff --git a/resources/jar/littleproxy-1.1.4.jar b/resources/jar/littleproxy-1.1.4.jar deleted file mode 100644 index 53627e2dadca2a007b4137fcf296649de2297de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130381 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 X-ov-n)2uc00` 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 Oe~{#W(|;Ly0sB8DwmR7W diff --git a/resources/jar/littleproxy-1.1.5.jar b/resources/jar/littleproxy-1.1.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..2f5a9198f4d45aa7652ceec4673e81332015f0c5 GIT binary patch literal 126970 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

>PTB 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%0A&7+7l9_bnRzWX}A`@(c1iwzAw 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 literal 0 HcmV?d00001 From 226f2713874fac91c4a782b6541684b2cc72c8e9 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Wed, 8 May 2019 12:18:29 +0200 Subject: [PATCH 23/41] Update logs handling and statsd (#21) * Update logs handling and statsd * Small update * Snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../net/lightbody/bmp/filters/BlacklistFilter.java | 2 +- .../lightbody/bmp/filters/StatsDMetricsFilter.java | 11 +++++------ browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 13 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5cace265f..d046e01fc 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index f0f20862d..72fecc3a8 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java index 239179b78..0eef83d36 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java @@ -39,7 +39,7 @@ public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (entry.matches(url, httpRequest.method().name())) { HttpResponseStatus status = HttpResponseStatus.valueOf(entry.getStatusCode()); - HttpResponse resp = new DefaultFullHttpResponse(httpRequest.getProtocolVersion(), status); + HttpResponse resp = new DefaultFullHttpResponse(httpRequest.protocolVersion(), status); HttpUtil.setContentLength(resp, 0L); return resp; diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 7f5575bb2..8ee5967c2 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -3,12 +3,12 @@ import com.timgroup.statsd.NonBlockingStatsDClient; import com.timgroup.statsd.StatsDClient; import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; -import org.littleshoot.proxy.HttpFiltersAdapter; import java.net.URI; import java.net.URISyntaxException; @@ -19,11 +19,10 @@ public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ct } @Override - public HttpObject serverToProxyResponse(HttpObject httpObject) { - if (HttpResponse.class.isAssignableFrom(httpObject.getClass())) { - HttpResponse httpResponse = (HttpResponse) httpObject; - int status = httpResponse.status().code(); - prepareStatsDMetrics(status); + public HttpObject proxyToClientResponse(HttpObject httpObject) { + if (FullHttpResponse.class.isAssignableFrom(httpObject.getClass())) { + HttpResponse httpResponse = (FullHttpResponse) httpObject; + prepareStatsDMetrics(httpResponse.status().code()); } return super.serverToProxyResponse(httpObject); } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 32e80f85d..5ef9ed488 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 37b2b5635..b4270a895 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index a425e6343..b21b28e1c 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index dc5519677..db3b95bc7 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 4389eb4d3..ee2035012 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.29-SNAPSHOT + 2.1.30-SNAPSHOT browsermob-core browsermob-legacy From 99992b49fad59cd7a3f66ea30a337ad1dab0660d Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Fri, 10 May 2019 17:30:04 +0200 Subject: [PATCH 24/41] Bmp 2.1.30 (#22) * Added proxy pool size to be exposed * fix properties * Snapshot version promotion --- README.md | 2 +- browsermob-core/pom.xml | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- .../bmp/proxy/bricks/ProxyResource.java | 24 ++++++++++--------- mitm/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d046e01fc..db5d6f485 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 72fecc3a8..a26765e79 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT 4.0.0 diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 5ef9ed488..1a050954e 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index b4270a895..ccef94eeb 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index b21b28e1c..6fdf3f486 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java index 07654db32..6aca98f6f 100644 --- a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java +++ b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java @@ -32,22 +32,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.script.Bindings; -import javax.script.Compilable; -import javax.script.CompiledScript; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; +import javax.script.*; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; +import java.util.*; @At("/proxy") @Service @@ -684,12 +675,14 @@ public void setPort(int port) { public static class ProxyListDescriptor { private Collection proxyList; + private int numberOfProxies; public ProxyListDescriptor() { } public ProxyListDescriptor(Collection proxyList) { this.proxyList = proxyList; + this.numberOfProxies = proxyList.size(); } public Collection getProxyList() { @@ -699,6 +692,15 @@ public Collection getProxyList() { public void setProxyList(Collection proxyList) { this.proxyList = proxyList; } + + public int getNumberOfProxies() { + return numberOfProxies; + } + + public ProxyListDescriptor setNumberOfProxies(int numberOfProxies) { + this.numberOfProxies = numberOfProxies; + return this; + } } public static class BandwidthLimitDescriptor { diff --git a/mitm/pom.xml b/mitm/pom.xml index db3b95bc7..7c5683965 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index ee2035012..227252954 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.30-SNAPSHOT + 2.1.31-SNAPSHOT browsermob-core browsermob-legacy From 3558f1232cd114fd7d3aef34db87a803b2df0c7f Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Tue, 21 May 2019 13:41:33 +0200 Subject: [PATCH 25/41] Update statsD client creation process and filtering (#23) * Update statsD client creation process and filtering * Update snapshot --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../bmp/filters/HarCaptureFilter.java | 50 +++++++++---------- .../lightbody/bmp/proxy/QuiescenceTest.java | 35 ++++++------- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 44 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index db5d6f485..0580494cf 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index a26765e79..06fb7aab8 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 1be4b6f12..02d4bbfef 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -165,13 +165,13 @@ public HarCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, @Override public HttpObject proxyToClientResponse(HttpObject httpObject) { - if (httpObject instanceof LastHttpContent) { + if (httpObject instanceof HttpResponse) { if (harEntry.getResponse().getStatus() == 0) { HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); - createStatsDClient(); - statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + StatsDClient client = createStatsDClient(); + client.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) .concat("." + harEntry.getResponse().getStatus()).concat(".request_timeout")); - stopStatsDClient(); + client.stop(); } } @@ -284,10 +284,6 @@ public void serverToProxyResponseTimedOut() { // replace any existing HarResponse that was created if the server sent a partial response HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); - createStatsDClient(); - statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) - .concat("." + harEntry.getResponse().getStatus()).concat(".response_timeout")); - stopStatsDClient(); response.setError(HarCaptureUtil.getResponseTimedOutErrorMessage()); @@ -307,6 +303,12 @@ else if (sendFinishedNanos > 0L && responseReceiveStartedNanos == 0L) { else if (responseReceiveStartedNanos > 0L) { harEntry.getTimings().setReceive(timeoutTimestampNanos - responseReceiveStartedNanos, TimeUnit.NANOSECONDS); } + + StatsDClient client = createStatsDClient(); + client.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".response_timeout")); + client.stop(); + logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } @@ -658,10 +660,6 @@ public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHo public void proxyToServerResolutionFailed(String hostAndPort) { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); harEntry.setResponse(response); - createStatsDClient(); - statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) - .concat("." + harEntry.getResponse().getStatus()).concat(".server_resolution_fail")); - stopStatsDClient(); response.setError(HarCaptureUtil.getResolutionFailedErrorMessage(hostAndPort)); @@ -669,6 +667,11 @@ public void proxyToServerResolutionFailed(String hostAndPort) { if (dnsResolutionStartedNanos > 0L) { harEntry.getTimings().setDns(System.nanoTime() - dnsResolutionStartedNanos, TimeUnit.NANOSECONDS); } + + StatsDClient client = createStatsDClient(); + client.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".server_resolution_fail")); + client.stop(); logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); } @@ -704,10 +707,7 @@ public void proxyToServerConnectionStarted() { @Override public void proxyToServerConnectionFailed() { HarResponse response = HarCaptureUtil.createHarResponseForFailure(); - createStatsDClient(); - statsDClient.get().increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) - .concat("." + harEntry.getResponse().getStatus()).concat(".server_connection_fail")); - stopStatsDClient(); + harEntry.setResponse(response); response.setError(HarCaptureUtil.getConnectionFailedErrorMessage()); @@ -716,6 +716,11 @@ public void proxyToServerConnectionFailed() { if (connectionStartedNanos > 0L) { harEntry.getTimings().setConnect(System.nanoTime() - connectionStartedNanos, TimeUnit.NANOSECONDS); } + + StatsDClient client = createStatsDClient(); + client.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) + .concat("." + harEntry.getResponse().getStatus()).concat(".server_connection_fail")); + client.stop(); } @Override @@ -794,16 +799,7 @@ protected static void logFailedRequestIfRequired(HarRequest request, HarResponse } } - private void createStatsDClient() { - if (statsDClient.get() == null) { - statsDClient.set(new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort())); - } - } - - private void stopStatsDClient() { - if (Objects.nonNull(statsDClient.get())) { - statsDClient.get().stop(); - statsDClient.remove(); - } + private StatsDClient createStatsDClient() { + return new NonBlockingStatsDClient("automated_tests", getStatsDHost(), getStatsDPort()); } } diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/QuiescenceTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/QuiescenceTest.java index 60842b0be..cbbe669df 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/QuiescenceTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/QuiescenceTest.java @@ -19,10 +19,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; @@ -218,7 +215,6 @@ public void testWaitForQuiescenceTimeoutLessThanQuietPeriodUnuccessful() throws } @Test - @Ignore //TODO: ignoring this test because it seems to fail on Java 8 under travis-ci. determine if there is an actual code defect, or just a test/environment defect. public void testWaitForQuiescenceInterruptedBySecondRequestSuccessful() throws InterruptedException { mockServer.when( request().withMethod("GET") @@ -235,27 +231,24 @@ public void testWaitForQuiescenceInterruptedBySecondRequestSuccessful() throws I final AtomicBoolean exceptionOccurred = new AtomicBoolean(); - new Thread(new Runnable() { - @Override - public void run() { - try (CloseableHttpClient client = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { - HttpResponse response = client.execute(new HttpGet("http://127.0.0.1:" + mockServerPort + "/successquiesence2s")); - EntityUtils.consumeQuietly(response.getEntity()); - firstRequestStatusCode.set(response.getStatusLine().getStatusCode()); + new Thread(() -> { + try (CloseableHttpClient client = NewProxyServerTestUtil.getNewHttpClient(proxy.getPort())) { + HttpResponse response = client.execute(new HttpGet("http://127.0.0.1:" + mockServerPort + "/successquiesence2s")); + EntityUtils.consumeQuietly(response.getEntity()); + firstRequestStatusCode.set(response.getStatusLine().getStatusCode()); - Thread.sleep(1000); + Thread.sleep(1000); - response = client.execute(new HttpGet("http://127.0.0.1:" + mockServerPort + "/successquiesence2s")); - EntityUtils.consumeQuietly(response.getEntity()); + response = client.execute(new HttpGet("http://127.0.0.1:" + mockServerPort + "/successquiesence2s")); + EntityUtils.consumeQuietly(response.getEntity()); - secondRequestFinished.set(System.nanoTime()); + secondRequestFinished.set(System.nanoTime()); - secondRequestStatusCode.set(response.getStatusLine().getStatusCode()); - } catch (IOException | InterruptedException e) { - exceptionOccurred.set(true); + secondRequestStatusCode.set(response.getStatusLine().getStatusCode()); + } catch (IOException | InterruptedException e) { + exceptionOccurred.set(true); - log.error("Exception occurred while making HTTP request", e); - } + log.error("Exception occurred while making HTTP request", e); } }).start(); diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 1a050954e..49a51910f 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index ccef94eeb..92f5ee190 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 6fdf3f486..ee8cbf484 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 7c5683965..26befaf58 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 227252954..7963fe5fe 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.31-SNAPSHOT + 2.1.32-SNAPSHOT browsermob-core browsermob-legacy From 2337f7f23af49d441102fe4a345c2c27e1d40f1a Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Fri, 7 Jun 2019 10:45:50 +0200 Subject: [PATCH 26/41] small restructuring of stats d (#24) * small restructuring of stats d * BMP update max file size and dependant tests * Update readme * Promote snapshot --- README.md | 3 +- browsermob-core/pom.xml | 2 +- .../lightbody/bmp/BrowserMobProxyServer.java | 12 ++-- .../bmp/filters/HarCaptureFilter.java | 17 ----- .../bmp/filters/ResponseFilterAdapter.java | 4 +- .../bmp/filters/StatsDMetricsFilter.java | 7 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- .../net/lightbody/bmp/proxy/ProxyManager.java | 22 +++--- .../bmp/proxy/guice/ConfigModule.java | 67 ++++++++++--------- .../bmp/proxy/ExpiringProxyTest.java | 5 +- mitm/pom.xml | 2 +- pom.xml | 2 +- 14 files changed, 69 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 0580494cf..eb05e4ee4 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,7 @@ system properties will be used to specify the upstream proxy. - -proxyPortRange \-\ - Range of ports reserved for proxies. Only applies if *port* parameter is not supplied in the POST request. Default values are \+1 to \+500+1. - -ttl \ + - -maxResponseSizeBytes max size of response in bytes by default 2097152 (2 MB) - Proxy will be automatically deleted after a specified time period. Off by default. ### Embedded Mode @@ -395,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 06fb7aab8..a5b6d64ae 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java index 8a85f46a4..bed58cef2 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java @@ -893,7 +893,7 @@ public void addLastHttpFilterFactory(HttpFiltersSource filterFactory) { */ @Override public void addResponseFilter(ResponseFilter filter) { - addLastHttpFilterFactory(new ResponseFilterAdapter.FilterSource(filter)); + addLastHttpFilterFactory(new ResponseFilterAdapter.FilterSource(filter, Integer.parseInt(System.getProperty("maxResponseSizeBytes", String.valueOf(ResponseFilterAdapter.FilterSource.DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE))))); } /** @@ -1059,22 +1059,22 @@ public HttpFilters filterRequest(HttpRequest originalRequest) { addHttpFilterFactory(new HttpFiltersSourceAdapter() { @Override - public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) { - return new StatsDMetricsFilter(originalRequest, ctx); + public HttpFilters filterRequest(HttpRequest originalRequest) { + return new LatencyFilter(originalRequest, latencyMs); } }); addHttpFilterFactory(new HttpFiltersSourceAdapter() { @Override - public HttpFilters filterRequest(HttpRequest originalRequest) { - return new LatencyFilter(originalRequest, latencyMs); + public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) { + return new UnregisterRequestFilter(originalRequest, ctx, activityMonitor); } }); addHttpFilterFactory(new HttpFiltersSourceAdapter() { @Override public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) { - return new UnregisterRequestFilter(originalRequest, ctx, activityMonitor); + return new StatsDMetricsFilter(originalRequest, ctx); } }); } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 02d4bbfef..6b2ae86fb 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -34,7 +34,6 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); - private static final ThreadLocal statsDClient = new InheritableThreadLocal<>(); private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); /** @@ -163,22 +162,6 @@ public HarCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, this.harEntry = new HarEntry(currentPageRef); } - @Override - public HttpObject proxyToClientResponse(HttpObject httpObject) { - if (httpObject instanceof HttpResponse) { - if (harEntry.getResponse().getStatus() == 0) { - HarCaptureFilter.logFailedRequestIfRequired(harEntry.getRequest(), harEntry.getResponse()); - StatsDClient client = createStatsDClient(); - client.increment(getProxyPrefix().concat(prepareMetric(harEntry.getRequest().getUrl())) - .concat("." + harEntry.getResponse().getStatus()).concat(".request_timeout")); - client.stop(); - - } - } - - return super.proxyToClientResponse(httpObject); - } - @Override public HttpResponse clientToProxyRequest(HttpObject httpObject) { // if a ServerResponseCaptureFilter is configured, delegate to it to collect the client request. if it is not diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ResponseFilterAdapter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ResponseFilterAdapter.java index 7edc34dd1..7097d07bd 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/ResponseFilterAdapter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/ResponseFilterAdapter.java @@ -62,7 +62,7 @@ public void setModifiedHttpRequest(HttpRequest modifiedHttpRequest) { * and sets a maximum response buffer size of 2 MiB. */ public static class FilterSource extends HttpFiltersSourceAdapter { - private static final int DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE = 2097152; + public static final int DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE = 2097152; private final ResponseFilter filter; private final int maximumResponseBufferSizeInBytes; @@ -100,7 +100,7 @@ public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerCont @Override public int getMaximumResponseBufferSizeInBytes() { - return maximumResponseBufferSizeInBytes; + return Math.toIntExact(maximumResponseBufferSizeInBytes); } } } diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java index 8ee5967c2..c5ff20642 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/StatsDMetricsFilter.java @@ -3,7 +3,6 @@ import com.timgroup.statsd.NonBlockingStatsDClient; import com.timgroup.statsd.StatsDClient; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; @@ -19,9 +18,9 @@ public StatsDMetricsFilter(HttpRequest originalRequest, ChannelHandlerContext ct } @Override - public HttpObject proxyToClientResponse(HttpObject httpObject) { - if (FullHttpResponse.class.isAssignableFrom(httpObject.getClass())) { - HttpResponse httpResponse = (FullHttpResponse) httpObject; + public HttpObject serverToProxyResponse(HttpObject httpObject) { + if (httpObject instanceof HttpResponse) { + HttpResponse httpResponse = (HttpResponse) httpObject; prepareStatsDMetrics(httpResponse.status().code()); } return super.serverToProxyResponse(httpObject); diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 49a51910f..f0d04f745 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 92f5ee190..cc2d8976d 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index ee8cbf484..91a102d8f 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/ProxyManager.java b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/ProxyManager.java index 6830f8196..5cb31fe18 100644 --- a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/ProxyManager.java +++ b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/ProxyManager.java @@ -35,6 +35,7 @@ public class ProxyManager { private int lastPort; private final int minPort; private final int maxPort; + private final int maxResponseSizeBytes; private final Provider proxyServerProvider; // retain a reference to the Cache to allow the ProxyCleanupTask to .cleanUp(), since asMap() is just a view into the cache. // it would seem to make sense to pass the newly-built Cache directly to the ProxyCleanupTask and have it retain a WeakReference to it, and @@ -93,24 +94,23 @@ public void run() { } @Inject - public ProxyManager(Provider proxyServerProvider, @Named("minPort") Integer minPort, @Named("maxPort") Integer maxPort, final @Named("ttl") Integer ttl) { + public ProxyManager(Provider proxyServerProvider, @Named("minPort") Integer minPort, @Named("maxPort") Integer maxPort, final @Named("ttl") Integer ttl, final @Named("maxResponseSizeBytes") Integer maxResponseSizeBytes) { this.proxyServerProvider = proxyServerProvider; this.minPort = minPort; this.maxPort = maxPort; this.lastPort = maxPort; + this.maxResponseSizeBytes = maxResponseSizeBytes; if (ttl > 0) { // proxies should be evicted after the specified ttl, so set up an evicting cache and a listener to stop the proxies when they're evicted - RemovalListener removalListener = new RemovalListener() { - public void onRemoval(RemovalNotification removal) { - try { - LegacyProxyServer proxy = removal.getValue(); - if (proxy != null) { - LOG.info("Expiring ProxyServer on port {} after {} seconds without activity", proxy.getPort(), ttl); - proxy.stop(); - } - } catch (Exception ex) { - LOG.warn("Error while stopping an expired proxy on port " + removal.getKey(), ex); + RemovalListener removalListener = removal -> { + try { + LegacyProxyServer proxy = removal.getValue(); + if (proxy != null) { + LOG.info("Expiring ProxyServer on port {} after {} seconds without activity", proxy.getPort(), ttl); + proxy.stop(); } + } catch (Exception ex) { + LOG.warn("Error while stopping an expired proxy on port " + removal.getKey(), ex); } }; diff --git a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/ConfigModule.java b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/ConfigModule.java index bf20e31b2..b988acf50 100644 --- a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/ConfigModule.java +++ b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/guice/ConfigModule.java @@ -4,7 +4,6 @@ import com.google.inject.Binder; import com.google.inject.Key; import com.google.inject.Module; -import com.google.inject.Provider; import joptsimple.ArgumentAcceptingOptionSpec; import joptsimple.OptionParser; import joptsimple.OptionSet; @@ -29,31 +28,37 @@ public void configure(Binder binder) { ArgumentAcceptingOptionSpec portSpec = parser.accepts("port", "The port to listen on") .withOptionalArg().ofType(Integer.class).defaultsTo(8080); - + ArgumentAcceptingOptionSpec addressSpec = parser.accepts("address", "The address to bind to") - .withOptionalArg() - .ofType(String.class) - .defaultsTo("0.0.0.0"); - + .withOptionalArg() + .ofType(String.class) + .defaultsTo("0.0.0.0"); + ArgumentAcceptingOptionSpec proxyPortRange = parser.accepts("proxyPortRange", "The range of ports to use for proxies") - .withOptionalArg() - .ofType(Integer.class) - .defaultsTo(8081, 8581) - .withValuesSeparatedBy('-'); + .withOptionalArg() + .ofType(Integer.class) + .defaultsTo(8081, 8581) + .withValuesSeparatedBy('-'); ArgumentAcceptingOptionSpec ttlSpec = parser.accepts("ttl", "Time in seconds until an unused proxy is deleted") - .withOptionalArg() - .ofType(Integer.class) - .defaultsTo(0); + .withOptionalArg() + .ofType(Integer.class) + .defaultsTo(0); + + ArgumentAcceptingOptionSpec maxResponseSizeSpec = + parser.accepts("maxResponseSizeBytes", "Max response size") + .withOptionalArg() + .ofType(Integer.class) + .defaultsTo(2097152); ArgumentAcceptingOptionSpec useLittleProxy = parser.accepts("use-littleproxy", "Use the littleproxy backend instead of the legacy Jetty 5-based implementation") - .withOptionalArg() - .ofType(Boolean.class) - .defaultsTo(true); + .withOptionalArg() + .ofType(Boolean.class) + .defaultsTo(true); parser.acceptsAll(Arrays.asList("help", "?"), "This help text"); @@ -78,44 +83,44 @@ public void configure(Binder binder) { System.out.println("Running BrowserMob Proxy using legacy implementation."); } - List ports = options.valuesOf(proxyPortRange); - if(ports.size() < 2){ + List ports = options.valuesOf(proxyPortRange); + if (ports.size() < 2) { throw new IllegalArgumentException(); } Integer minPort; - Integer maxPort; - if(ports.get(1) > ports.get(0)){ + Integer maxPort; + if (ports.get(1) > ports.get(0)) { minPort = ports.get(0); maxPort = ports.get(1); - }else{ + } else { minPort = ports.get(1); maxPort = ports.get(0); - } + } Integer port = portSpec.value(options); - if(port >= minPort && port <= maxPort){ + if (port >= minPort && port <= maxPort) { int num = maxPort - minPort; minPort = port + 1; maxPort = minPort + num; } + System.setProperty("maxResponseSizeBytes", String.valueOf(maxResponseSizeSpec.value(options))); + binder.bind(Key.get(Integer.class, new NamedImpl("port"))).toInstance(port); binder.bind(Key.get(String.class, new NamedImpl("address"))).toInstance(addressSpec.value(options)); binder.bind(Key.get(Integer.class, new NamedImpl("minPort"))).toInstance(minPort); - binder.bind(Key.get(Integer.class, new NamedImpl("maxPort"))).toInstance(maxPort); + binder.bind(Key.get(Integer.class, new NamedImpl("maxPort"))).toInstance(maxPort); binder.bind(Key.get(Integer.class, new NamedImpl("ttl"))).toInstance(ttlSpec.value(options)); + binder.bind(Key.get(Integer.class, new NamedImpl("maxResponseSizeBytes"))).toInstance(maxResponseSizeSpec.value(options)); binder.bind(LegacyProxyServer.class).toProvider(LegacyProxyServerProvider.class); // bind an ObjectMapper provider that uses the system time zone instead of UTC by default - binder.bind(ObjectMapper.class).toProvider(new Provider() { - @Override - public ObjectMapper get() { - ObjectMapper objectMapper = new ObjectMapper(); + binder.bind(ObjectMapper.class).toProvider(() -> { + ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setTimeZone(TimeZone.getDefault()); + objectMapper.setTimeZone(TimeZone.getDefault()); - return objectMapper; - } + return objectMapper; }); } } diff --git a/browsermob-rest/src/test/java/net/lightbody/bmp/proxy/ExpiringProxyTest.java b/browsermob-rest/src/test/java/net/lightbody/bmp/proxy/ExpiringProxyTest.java index 85eacc06c..e7cafe652 100644 --- a/browsermob-rest/src/test/java/net/lightbody/bmp/proxy/ExpiringProxyTest.java +++ b/browsermob-rest/src/test/java/net/lightbody/bmp/proxy/ExpiringProxyTest.java @@ -1,5 +1,6 @@ package net.lightbody.bmp.proxy; +import net.lightbody.bmp.filters.ResponseFilterAdapter; import net.lightbody.bmp.proxy.guice.LegacyProxyServerProvider; import org.junit.Test; @@ -17,7 +18,7 @@ public void testExpiredProxyStops() throws InterruptedException { ProxyManager proxyManager = new ProxyManager(new LegacyProxyServerProvider(), minPort, minPort + 100, - 2); + 2, ResponseFilterAdapter.FilterSource.DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE); LegacyProxyServer proxy = proxyManager.create(Collections.emptyMap()); int port = proxy.getPort(); @@ -44,7 +45,7 @@ public void testZeroTtlProxyDoesNotExpire() throws InterruptedException { ProxyManager proxyManager = new ProxyManager(new LegacyProxyServerProvider(), minPort, minPort + 100, - 0); + 0, ResponseFilterAdapter.FilterSource.DEFAULT_MAXIMUM_RESPONSE_BUFFER_SIZE); LegacyProxyServer proxy = proxyManager.create(Collections.emptyMap()); int port = proxy.getPort(); diff --git a/mitm/pom.xml b/mitm/pom.xml index 26befaf58..7c2af724f 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 7963fe5fe..fece2d2bb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.32-SNAPSHOT + 2.1.33-SNAPSHOT browsermob-core browsermob-legacy From 195c44a90cfd4b3dbfa942cac42568a5b6905669 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 26 Aug 2019 11:26:54 +0200 Subject: [PATCH 27/41] BMP 2.1.33 (#25) * Extend browsermob proxy add headers with additional field in json `headersFilterRegexp` which allows you to add headers only to specific domain * update to openjdk8 * update to oraclejdk8 * Update litle proxy * Update little proxy * Update snapshot version --- .travis.yml | 1 + README.md | 4 +- browsermob-core/pom.xml | 2 +- .../net/lightbody/bmp/BrowserMobProxy.java | 45 +++--- .../lightbody/bmp/BrowserMobProxyServer.java | 14 +- .../bmp/filters/AddHeadersFilter.java | 34 +++- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- .../bmp/proxy/LegacyProxyServer.java | 4 +- .../net/lightbody/bmp/proxy/ProxyServer.java | 41 ++--- .../bmp/proxy/http/BrowserMobHttpClient.java | 151 ++++++++++-------- browsermob-rest/pom.xml | 2 +- .../bmp/proxy/bricks/ProxyResource.java | 15 +- mitm/pom.xml | 3 +- pom.xml | 6 +- 15 files changed, 193 insertions(+), 133 deletions(-) diff --git a/.travis.yml b/.travis.yml index 016ceb70b..df1624cee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ sudo: false language: java +dist: trusty jdk: # Not running tests against openjdk7, since the SunEC is not included in travis-ci's version of openjdk7. # Not running tests against oraclejdk7, since travis-ci no longer provides it. diff --git a/README.md b/README.md index eb05e4ee4..4f5498196 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ Set a URL to blacklist | PUT | */proxy/[port]/blacklist* |

*regex* - The black Clears all URL patterns from the blacklist | DELETE | */proxy/[port]/blacklist* || Limit the bandwidth through the proxy on the *[port]* | PUT | */proxy/[port]/limit* |

*downstreamKbps* - Sets the downstream bandwidth limit in kbps. Optional.

*upstreamKbps* - Sets the upstream bandwidth limit kbps. Optional, by default unlimited.

*downstreamMaxKB* - Specifies how many kilobytes in total the client is allowed to download through the proxy. Optional, by default unlimited.

*upstreamMaxKB* - Specifies how many kilobytes in total the client is allowed to upload through the proxy. Optional, by default unlimited.

*latency* - Add the given latency to each HTTP request. Optional, by default all requests are invoked without latency.

*enable* - A boolean that enable bandwidth limiter. Optional, by default to "false", but setting any of the properties above will implicitly enable throttling

*payloadPercentage* - Specifying what percentage of data sent is payload, e.g. use this to take into account overhead due to tcp/ip. Optional.

*maxBitsPerSecond* - The max bits per seconds you want this instance of StreamManager to respect. Optional.

Displays the amount of data remaining to be uploaded/downloaded until the limit is reached | GET | */proxy/[port]/limit* || -Set and override HTTP Request headers | POST | */proxy/[port]/headers* | Payload data should be **JSON** encoded set of headers. Where key is a header name (such as "User-Agent") and value is a value of HTTP header to setup (such as "BrowserMob-Agent"). Example: `{"User-Agent": "BrowserMob-Agent"}`| +Set and override HTTP Request headers | POST | */proxy/[port]/headers* | Payload data should be **JSON** encoded set of headers and optionally `headersFilterRegexp: .*.*` . Where key is a header name (such as "User-Agent") and value is a value of HTTP header to setup (such as "BrowserMob-Agent"). Example: `{"User-Agent": "BrowserMob-Agent"}`| Overrides normal DNS lookups and remaps the given hosts with the associated IP address | POST | */proxy/[port]/hosts* | Payload data should be **JSON** encoded set of hosts. Where key is a host name (such as "example.com") and value is a IP address which associatied with host hame (such as "1.2.3.4"'). Example: `{"example.com": "1.2.3.4"}`| Sets automatic basic authentication for the specified domain | POST | */proxy/[port]/auth/basic/[domain]* | Payload data should be **JSON** encoded username and password name/value pairs. Example: `{"username": "myUsername", "password": "myPassword"}`| Wait till all request are being made | PUT | */proxy/[port]/wait* |

*quietPeriodInMs* - Wait till all request are being made. Optional.

*timeoutInMs* - Sets quiet period in milliseconds. Optional.

| @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index a5b6d64ae..cc592b185 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxy.java b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxy.java index a04ffe7af..44f1ac326 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxy.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxy.java @@ -39,7 +39,7 @@ public interface BrowserMobProxy { * Starts the proxy on the specified port. The proxy will listen for connections on the network interface specified by the bindAddress, and will * also initiate connections to upstream servers on the same network interface. * - * @param port port to listen on + * @param port port to listen on * @param bindAddress address of the network interface on which the proxy will listen for connections and also attempt to connect to upstream servers. * @throws java.lang.IllegalStateException if the proxy has already been started */ @@ -49,7 +49,7 @@ public interface BrowserMobProxy { * Starts the proxy on the specified port. The proxy will listen for connections on the network interface specified by the clientBindAddress, and will * initiate connections to upstream servers from the network interface specified by the serverBindAddress. * - * @param port port to listen on + * @param port port to listen on * @param clientBindAddress address of the network interface on which the proxy will listen for connections * @param serverBindAddress address of the network interface on which the proxy will connect to upstream servers * @throws java.lang.IllegalStateException if the proxy has already been started @@ -68,7 +68,7 @@ public interface BrowserMobProxy { * @throws java.lang.IllegalStateException if the proxy has not been started. */ void stop(); - + /** * Like {@link #stop()}, shuts down the proxy server and no longer accepts incoming connections, but does not wait for any existing * network traffic to cease. Any existing connections to clients or to servers may be force-killed immediately. @@ -125,7 +125,7 @@ public interface BrowserMobProxy { /** * Starts a new HAR file with the specified page name and page title. Enables HAR capture if it was not previously enabled. * - * @param initialPageRef initial page name of the new HAR file + * @param initialPageRef initial page name of the new HAR file * @param initialPageTitle initial page title of the new HAR file * @return existing HAR file, or null if none exists or HAR capture was disabled */ @@ -215,7 +215,7 @@ public interface BrowserMobProxy { * Starts a new HAR page using the specified pageRef as the page name and the pageTitle as the page title. Populates the * {@link net.lightbody.bmp.core.har.HarPageTimings#onLoad} value based on the amount of time the current page has been captured. * - * @param pageRef name of the new page + * @param pageRef name of the new page * @param pageTitle title of the new page * @return the HAR as it existed immediately after ending the current page * @throws java.lang.IllegalStateException if HAR capture has not been enabled via {@link #newHar()} or {@link #newHar(String)} @@ -258,7 +258,7 @@ public interface BrowserMobProxy { * The minimum amount of time that will elapse between the time the proxy begins receiving a response from the server and the time the * proxy begins sending the response to the client. * - * @param latency minimum latency, or 0 for no minimum + * @param latency minimum latency, or 0 for no minimum * @param timeUnit TimeUnit for the latency */ void setLatency(long latency, TimeUnit timeUnit); @@ -268,7 +268,7 @@ public interface BrowserMobProxy { * specified time, the proxy will respond with an HTTP 502 Bad Gateway. The default value is 60 seconds. * * @param connectionTimeout maximum time to wait to establish a connection to a server, or 0 to wait indefinitely - * @param timeUnit TimeUnit for the connectionTimeout + * @param timeUnit TimeUnit for the connectionTimeout */ void setConnectTimeout(int connectionTimeout, TimeUnit timeUnit); @@ -279,7 +279,7 @@ public interface BrowserMobProxy { * connection to the client may be closed abruptly. The default value is 60 seconds. * * @param idleConnectionTimeout maximum time to allow a connection to remain idle, or 0 to wait indefinitely. - * @param timeUnit TimeUnit for the idleConnectionTimeout + * @param timeUnit TimeUnit for the idleConnectionTimeout */ void setIdleConnectionTimeout(int idleConnectionTimeout, TimeUnit timeUnit); @@ -290,7 +290,7 @@ public interface BrowserMobProxy { * connection to the client may be closed abruptly. The default value is 0 (wait indefinitely). * * @param requestTimeout maximum time to wait for an HTTP response, or 0 to wait indefinitely - * @param timeUnit TimeUnit for the requestTimeout + * @param timeUnit TimeUnit for the requestTimeout */ void setRequestTimeout(int requestTimeout, TimeUnit timeUnit); @@ -298,7 +298,7 @@ public interface BrowserMobProxy { * Enables automatic authorization for the specified domain and auth type. Every request sent to the specified domain will contain the * specified authorization information. * - * @param domain domain automatically send authorization information to + * @param domain domain automatically send authorization information to * @param username authorization username * @param password authorization password * @param authType authorization type @@ -340,7 +340,7 @@ public interface BrowserMobProxy { * For example, the following rewrite rule: * *
   {@code proxy.rewriteUrl("http://www\\.(yahoo|bing)\\.com/\\?(\\w+)=(\\w+)", "http://www.google.com/?originalDomain=$1&$2=$3");}
- * + *

* will match an HTTP request (but not HTTPS!) to www.yahoo.com or www.bing.com with exactly 1 query parameter, * and replace it with a call to www.google.com with an 'originalDomain' query parameter, as well as the original query parameter. *

@@ -353,7 +353,7 @@ public interface BrowserMobProxy { * will result in the proxy making a request to: *

   {@code http://www.google.com?originalDomain=bing&anotherParam=anotherValue}
* - * @param urlPattern URL-matching regular expression + * @param urlPattern URL-matching regular expression * @param replacementExpression an expression, which may optionally contain capture groups, which will replace any URL which matches urlPattern */ void rewriteUrl(String urlPattern, String replacementExpression); @@ -410,8 +410,8 @@ public interface BrowserMobProxy { *

* See {@link #blacklistRequests(String, int)} for details on the URL the urlPattern will match. * - * @param urlPattern URL-matching regular expression to blacklist - * @param statusCode HTTP status code to return + * @param urlPattern URL-matching regular expression to blacklist + * @param statusCode HTTP status code to return * @param httpMethodPattern regular expression matching a request's HTTP method */ void blacklistRequests(String urlPattern, int statusCode, String httpMethodPattern); @@ -447,7 +447,7 @@ public interface BrowserMobProxy { * whitelist response code. * * @param urlPatterns URL-matching regular expressions to whitelist; null or an empty collection will enable an empty whitelist - * @param statusCode HTTP status code to return to clients when a URL matches a pattern + * @param statusCode HTTP status code to return to clients when a URL matches a pattern */ void whitelistRequests(Collection urlPatterns, int statusCode); @@ -501,11 +501,18 @@ public interface BrowserMobProxy { /** * Adds a new HTTP header to every request. If the header already exists on the request, it will be replaced with the specified header. * - * @param name name of the header to add + * @param name name of the header to add * @param value new header's value */ void addHeader(String name, String value); + /** + * Header filter regexp. + * + * @param headerFilterRegexp the header filter regexp + */ + void headerFilterRegexp(String headerFilterRegexp); + /** * Removes a header previously added with {@link #addHeader(String name, String value)}. * @@ -545,8 +552,8 @@ public interface BrowserMobProxy { * for the quiet period within the specified timeout, otherwise returns false. * * @param quietPeriod amount of time after which network traffic will be considered "stopped" - * @param timeout maximum amount of time to wait for network traffic to stop - * @param timeUnit TimeUnit for the quietPeriod and timeout + * @param timeout maximum amount of time to wait for network traffic to stop + * @param timeUnit TimeUnit for the quietPeriod and timeout * @return true if network traffic is stopped, otherwise false */ boolean waitForQuiescence(long quietPeriod, long timeout, TimeUnit timeUnit); @@ -587,7 +594,7 @@ public interface BrowserMobProxy { * {@link org.littleshoot.proxy.HttpFilters} instance (typically, a subclass of {@link org.littleshoot.proxy.HttpFiltersAdapter}). * To disable or bypass a filter on a per-request basis, the filterRequest() method may return null. * - * @param filterFactory factory to generate HttpFilters + * @param filterFactory factory to generate HttpFilters */ void addLastHttpFilterFactory(HttpFiltersSource filterFactory); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java index bed58cef2..0951594cb 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java @@ -145,6 +145,11 @@ public class BrowserMobProxyServer implements BrowserMobProxy { */ private volatile int connectTimeoutMs; + /** + * Regexp to check request url and inject headers if url match regexp. + */ + private static String headersFilterRegexp; + /** * The amount of time a connection to a server can remain idle while receiving data from the server. */ @@ -592,6 +597,11 @@ public void addHeaders(Map headers) { this.additionalHeaders = newHeaders; } + @Override + public void headerFilterRegexp(String headerFilterRegexp) { + this.headersFilterRegexp = headerFilterRegexp; + } + @Override public void setLatency(long latency, TimeUnit timeUnit) { this.latencyMs = (int) TimeUnit.MILLISECONDS.convert(latency, timeUnit); @@ -1052,8 +1062,8 @@ public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerCont addHttpFilterFactory(new HttpFiltersSourceAdapter() { @Override - public HttpFilters filterRequest(HttpRequest originalRequest) { - return new AddHeadersFilter(originalRequest, additionalHeaders); + public HttpFilters filterRequest(HttpRequest originalRequest,ChannelHandlerContext ctx) { + return new AddHeadersFilter(originalRequest,ctx, additionalHeaders, headersFilterRegexp); } }); diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/AddHeadersFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/AddHeadersFilter.java index 5b584ecfd..16bdccc72 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/AddHeadersFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/AddHeadersFilter.java @@ -1,9 +1,10 @@ package net.lightbody.bmp.filters; +import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; -import org.littleshoot.proxy.HttpFiltersAdapter; +import org.apache.commons.lang3.StringUtils; import java.util.Collections; import java.util.Map; @@ -12,29 +13,48 @@ * Adds the headers specified in the constructor to this request. The filter does not make a defensive copy of the map, so there is no guarantee * that the map at the time of construction will contain the same values when the filter is actually invoked, if the map is modified concurrently. */ -public class AddHeadersFilter extends HttpFiltersAdapter { +public class AddHeadersFilter extends HttpsAwareFiltersAdapter { private final Map additionalHeaders; + private static String headersSpecificFilter; - public AddHeadersFilter(HttpRequest originalRequest, Map additionalHeaders) { - super(originalRequest); + public AddHeadersFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, Map additionalHeaders, String headersSpecificFilter) { + super(originalRequest, ctx); if (additionalHeaders != null) { this.additionalHeaders = additionalHeaders; } else { this.additionalHeaders = Collections.emptyMap(); } + if (StringUtils.isNotEmpty(headersSpecificFilter)) { + setHeadersSpecificFilter(headersSpecificFilter); + } } @Override public HttpResponse clientToProxyRequest(HttpObject httpObject) { if (httpObject instanceof HttpRequest) { HttpRequest httpRequest = (HttpRequest) httpObject; - - for (Map.Entry header : additionalHeaders.entrySet()) { - httpRequest.headers().add(header.getKey(), header.getValue()); + if (StringUtils.isNotEmpty(headersSpecificFilter)) { + if (getFullUrl(httpRequest).matches(headersSpecificFilter)) { + for (Map.Entry header : additionalHeaders.entrySet()) { + httpRequest.headers().add(header.getKey(), header.getValue()); + } + } + } else { + for (Map.Entry header : additionalHeaders.entrySet()) { + httpRequest.headers().add(header.getKey(), header.getValue()); + } } } return null; } + + public String getHeadersSpecificFilter() { + return headersSpecificFilter; + } + + private synchronized void setHeadersSpecificFilter(String headersSpecificFilter) { + this.headersSpecificFilter = headersSpecificFilter; + } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index f0d04f745..8af98bc62 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index cc2d8976d..8bdce882e 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/LegacyProxyServer.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/LegacyProxyServer.java index 103f2f25a..9e1f390f1 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/LegacyProxyServer.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/LegacyProxyServer.java @@ -18,7 +18,7 @@ /** * Describes the legacy BrowserMob Proxy 2.0 interface. Clients should not implement or use this interface. - * + *

* Use {@link BrowserMobProxy}. */ public interface LegacyProxyServer { @@ -122,6 +122,8 @@ public interface LegacyProxyServer { void addHeader(String name, String value); + void headerFilterRegexp(String headerFilterRegexp); + void setCaptureHeaders(boolean captureHeaders); void setCaptureContent(boolean captureContent); diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/ProxyServer.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/ProxyServer.java index 29c5f897f..1b351d1f2 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/ProxyServer.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/ProxyServer.java @@ -205,7 +205,7 @@ public void stop() { server.stop(); } } catch (InterruptedException e) { - // the try/catch block in server.stop() is manufacturing a phantom InterruptedException, so this should not occur + // the try/catch block in server.stop() is manufacturing a phantom InterruptedException, so this should not occur throw new JettyException("Exception occurred when stopping the server", e); } } @@ -236,10 +236,10 @@ public void setPort(int port) { /** * Get the the InetAddress that the Proxy server binds to when it starts. - * + * * If not otherwise set via {@link #setLocalHost(InetAddress)}, defaults to * 0.0.0.0 (i.e. bind to any interface). - * + * * Note - just because we bound to the address, doesn't mean that it can be * reached. E.g. trying to connect to 0.0.0.0 is going to fail. Use * {@link #getConnectableLocalHost()} if you're looking for a host that can be @@ -258,22 +258,22 @@ public InetAddress getLocalHost() { } return localHost; } - + /** * Return a plausible {@link InetAddress} that other processes can use to * contact the proxy. - * + * * In essence, this is the same as {@link #getLocalHost()}, but avoids * returning 0.0.0.0. as no-one can connect to that. If no other host has * been set via {@link #setLocalHost(InetAddress)}, will return * {@link InetAddress#getLocalHost()} - * + * * No attempt is made to check the address for reachability before it is * returned. */ @Override public InetAddress getConnectableLocalHost() throws UnknownHostException { - + if (getLocalHost().equals(InetAddress.getByName("0.0.0.0"))) { return InetAddress.getLocalHost(); } else { @@ -295,12 +295,12 @@ public void setLocalHost(InetAddress localHost) { throw new IllegalArgumentException("localHost address must be address of a local adapter (attempted to use: " + localHost + ")", e); } if (localInterface != null) { - this.localHost = localHost; + this.localHost = localHost; } else { throw new IllegalArgumentException("localHost address must be address of a local adapter (attempted to use: " + localHost + ")"); } } - + } @Override @@ -544,6 +544,11 @@ public void addHeaders(Map headers) { } } + @Override + public void headerFilterRegexp(String headerFilterRegexp){ + client.setHeadersFilterRegexp(headerFilterRegexp); + } + public void remapHost(String source, String target) { if (client.getResolver() instanceof AdvancedHostResolver) { AdvancedHostResolver advancedHostResolver = (AdvancedHostResolver) client.getResolver(); @@ -660,7 +665,7 @@ public void clearRewriteRules() { public void blacklistRequests(String pattern, int responseCode) { client.blacklistRequests(pattern, responseCode, null); } - + @Override public void blacklistRequests(String pattern, int responseCode, String method) { client.blacklistRequests(pattern, responseCode, method); @@ -690,7 +695,7 @@ public Collection getBlacklist() { public List getBlacklistedRequests() { return client.getBlacklistedRequests(); } - + @Override public Collection getBlacklistedUrls() { return client.getBlacklistedUrls(); @@ -709,7 +714,7 @@ public boolean isWhitelistEnabled() { public List getWhitelistRequests() { return client.getWhitelistRequests(); } - + @Override public Collection getWhitelistUrls() { ImmutableList.Builder builder = ImmutableList.builder(); @@ -748,10 +753,10 @@ public void addWhitelistPattern(String urlPattern) { } /** - * Whitelists the specified requests. + * Whitelists the specified requests. *

* Note: This method overwrites any existing whitelist. - * + * * @param patterns regular expression patterns matching URLs to whitelist * @param responseCode response code to return for non-whitelisted URLs */ @@ -759,10 +764,10 @@ public void addWhitelistPattern(String urlPattern) { public void whitelistRequests(String[] patterns, int responseCode) { client.whitelistRequests(patterns, responseCode); } - + /** * Enables an empty whitelist, which will return the specified responseCode for all requests. - * + * * @param responseCode HTTP response code to return for all requests */ @Override @@ -799,7 +804,7 @@ public void removeHeader(String name) { @Override public void removeAllHeaders() { - client.setAdditionalHeaders(Collections.emptyMap()); + client.setAdditionalHeaders(Collections.emptyMap()); } @Override @@ -847,7 +852,7 @@ public void setCaptureHeaders(boolean captureHeaders) { public void setCaptureContent(boolean captureContent) { client.setCaptureContent(captureContent); } - + @Override public void setCaptureBinaryContent(boolean captureBinaryContent) { client.setCaptureBinaryContent(captureBinaryContent); diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java index 00cdd8179..1191e164e 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java @@ -127,7 +127,7 @@ public class BrowserMobHttpClient { private static final String VERSION = "2.1"; private static final Logger LOG = LoggerFactory.getLogger(BrowserMobHttpClient.class); - + private static final int BUFFER = 4096; private volatile Har har; @@ -137,7 +137,7 @@ public class BrowserMobHttpClient { * keep headers */ private volatile boolean captureHeaders; - + /** * keep contents */ @@ -152,7 +152,7 @@ public class BrowserMobHttpClient { * socket factory dedicated to port 80 (HTTP) */ private final SimulatedSocketFactory socketFactory; - + /** * socket factory dedicated to port 443 (HTTPS) */ @@ -160,51 +160,56 @@ public class BrowserMobHttpClient { private final PoolingHttpClientConnectionManager httpClientConnMgr; - + /** * Builders for httpClient * Each time you change their configuration you should call updateHttpClient() */ private final Builder requestConfigBuilder; private final HttpClientBuilder httpClientBuilder; - + /** * The current httpClient which will execute HTTP requests */ private volatile CloseableHttpClient httpClient; - + private final BasicCookieStore cookieStore = new BasicCookieStore(); - + /** * List of rejected URL patterns */ private final Collection blacklistEntries = new CopyOnWriteArrayList(); - + /** * List of accepted URL patterns */ private volatile Whitelist whitelist = Whitelist.WHITELIST_DISABLED; - + /** * List of URLs to rewrite */ private final CopyOnWriteArrayList rewriteRules = new CopyOnWriteArrayList(); - + /** * triggers to process when sending request */ private final List requestInterceptors = new CopyOnWriteArrayList(); - + /** * triggers to process when receiving response */ private final List responseInterceptors = new CopyOnWriteArrayList(); - + /** * additional headers sent with request */ private final Map additionalHeaders = new ConcurrentHashMap(); - + + /** + * Regexp to check request url and inject headers if url match regexp. + */ + private static String headersFilterRegexp; + /** * request timeout: set to -1 to disable timeout */ @@ -214,7 +219,7 @@ public class BrowserMobHttpClient { * is it possible to add a new request? */ private final AtomicBoolean allowNewRequests = new AtomicBoolean(true); - + /** * Hostname resolver that wraps a {@link net.lightbody.bmp.proxy.dns.HostResolver}. The wrapped HostResolver can be replaced safely at * runtime using {@link LegacyHostResolverAdapter#setResolver(net.lightbody.bmp.proxy.dns.AdvancedHostResolver)}. @@ -226,22 +231,22 @@ public class BrowserMobHttpClient { * does the proxy support gzip compression? (set to false if you go through a browser) */ private boolean decompress = true; - + /** * set of active requests */ private final Set activeRequests = Collections.newSetFromMap(new ConcurrentHashMap()); - + /** * credentials used for authentication */ private WildcardMatchingCredentialsProvider credsProvider; - + /** * is the client shutdown? */ private volatile boolean shutdown = false; - + /** * authentication type used */ @@ -251,17 +256,17 @@ public class BrowserMobHttpClient { * does the proxy follow redirects? (set to false if you go through a browser) */ private boolean followRedirects = true; - + /** * maximum redirects supported by the proxy */ private static final int MAX_REDIRECT = 10; - + /** * remaining requests counter */ private final AtomicInteger requestCounter; - + /** * Init HTTP client * @param streamManager will be capped to 100 Megabits (by default it is disabled) @@ -276,13 +281,13 @@ public BrowserMobHttpClient(final StreamManager streamManager, AtomicInteger req .setConnectionRequestTimeout(60000) .setConnectTimeout(2000) .setSocketTimeout(60000); - + // we associate each SocketFactory with their protocols Registry registry = RegistryBuilder.create() .register("http", this.socketFactory) .register("https", this.sslSocketFactory) .build(); - + httpClientConnMgr = new PoolingHttpClientConnectionManager(registry, resolverWrapper) { @Override public ConnectionRequest requestConnection(HttpRoute route, Object state) { @@ -312,7 +317,7 @@ public boolean cancel() { credsProvider = new WildcardMatchingCredentialsProvider(); httpClientBuilder = getDefaultHttpClientBuilder(streamManager); httpClient = httpClientBuilder.build(); - + HttpClientInterrupter.watch(this); } @@ -324,10 +329,10 @@ private HttpClientBuilder getDefaultHttpClientBuilder(final StreamManager stream @Override protected HttpResponse doSendRequest(HttpRequest request, HttpClientConnection conn, HttpContext context) throws IOException, HttpException { long start = System.nanoTime(); - + // send request HttpResponse response = super.doSendRequest(request, conn, context); - + // set "sending" for resource RequestInfo.get().send(start, System.nanoTime()); return response; @@ -337,7 +342,7 @@ protected HttpResponse doSendRequest(HttpRequest request, HttpClientConnection c protected HttpResponse doReceiveResponse(HttpRequest request, HttpClientConnection conn, HttpContext context) throws HttpException, IOException { long start = System.nanoTime(); HttpResponse response = super.doReceiveResponse(request, conn, context); - + // +4 => header/data separation long responseHeadersSize = response.getStatusLine().toString().length() + 4; for (Header header : response.getAllHeaders()) { @@ -363,7 +368,7 @@ protected HttpResponse doReceiveResponse(HttpRequest request, HttpClientConnecti } // set waiting time RequestInfo.get().wait(start, System.nanoTime()); - + return response; } }) @@ -471,7 +476,7 @@ public BrowserMobHttpRequest newGet(String url, net.lightbody.bmp.proxy.jetty.ht throw reportBadURI(url, "GET", e); } } - + public BrowserMobHttpRequest newPatch(String url, net.lightbody.bmp.proxy.jetty.http.HttpRequest proxyRequest) { try { URI uri = makeUri(url); @@ -589,7 +594,7 @@ public void checkTimeout() { for (ActiveRequest activeRequest : activeRequests) { activeRequest.checkTimeout(); } - + // Close expired connections httpClientConnMgr.closeExpiredConnections(); // Optionally, close connections @@ -601,7 +606,7 @@ public BrowserMobHttpResponse execute(BrowserMobHttpRequest req) { if (!allowNewRequests.get()) { throw new RuntimeException("No more requests allowed"); } - + try { requestCounter.incrementAndGet(); @@ -632,7 +637,7 @@ private BrowserMobHttpResponse execute(BrowserMobHttpRequest req, int depth) { HttpRequestBase method = req.getMethod(); String url = method.getURI().toString(); - + // process any rewrite requests boolean rewrote = false; String newUrl = url; @@ -663,7 +668,7 @@ private BrowserMobHttpResponse execute(BrowserMobHttpRequest req, int depth) { break; } } - + // url does not match whitelist, set the response code if (!found) { mockResponseCode = currentWhitelist.getResponseCode(); @@ -698,7 +703,7 @@ private BrowserMobHttpResponse execute(BrowserMobHttpRequest req, int depth) { if (os == null) { os = new CappedByteArrayOutputStream(1024 * 1024); // MOB-216 don't buffer more than 1 MB } - + // link the object up now, before we make the request, so that if we get cut off (ie: favicon.ico request and browser shuts down) // we still have the attempt associated, even if we never got a response HarEntry entry = new HarEntry(harPageRef); @@ -815,10 +820,10 @@ public HeaderElement[] getElements() throws ParseException { if(decompress && response.getEntity().getContentLength() != 0) { //getContentLength<0 if unknown if (gzipping) { is = new GZIPInputStream(is); - } else if (deflating) { + } else if (deflating) { // RAW deflate only // WARN : if system is using zlib<=1.1.4 the stream must be append with a dummy byte - // that is not requiered for zlib>1.1.4 (not mentioned on current Inflater javadoc) + // that is not requiered for zlib>1.1.4 (not mentioned on current Inflater javadoc) is = new InflaterInputStream(is, new Inflater(true)); } } @@ -903,8 +908,8 @@ public HeaderElement[] getElements() throws ParseException { } } } - - + + // +4 => header/data separation long requestHeadersSize = method.getRequestLine().toString().length() + 4; long requestBodySize = 0; @@ -919,7 +924,7 @@ public HeaderElement[] getElements() throws ParseException { entry.getRequest().setHeadersSize(requestHeadersSize); entry.getRequest().setBodySize(requestBodySize); if (captureContent) { - + // can we understand the POST data at all? if (method instanceof HttpEntityEnclosingRequestBase && req.getCopy() != null) { HttpEntityEnclosingRequestBase enclosingReq = (HttpEntityEnclosingRequestBase) method; @@ -950,7 +955,7 @@ public HeaderElement[] getElements() throws ParseException { LOG.info("Unexpected problem when parsing input copy", e); } catch (RuntimeException e) { LOG.info("Unexpected problem when parsing input copy", e); - } + } } else { // not URL encoded, so let's grab the body of the POST and capture that try { @@ -988,12 +993,12 @@ public HeaderElement[] getElements() throws ParseException { // ok, we need to decompress it before we can put it in the har file try { InputStream temp = null; - if(gzipping){ + if(gzipping){ temp = new GZIPInputStream(new ByteArrayInputStream(copy.toByteArray())); } else if (deflating) { // RAW deflate only? // WARN : if system is using zlib<=1.1.4 the stream must be append with a dummy byte - // that is not requiered for zlib>1.1.4 (not mentioned on current Inflater javadoc) + // that is not requiered for zlib>1.1.4 (not mentioned on current Inflater javadoc) temp = new InflaterInputStream(new ByteArrayInputStream(copy.toByteArray()), new Inflater(true)); } copy = new ByteArrayOutputStream(); @@ -1001,7 +1006,7 @@ public HeaderElement[] getElements() throws ParseException { } catch (IOException e) { throw new RuntimeException("Error when decompressing input stream", e); } - } + } if (hasTextualContent(contentType)) { setTextOfEntry(entry, copy, contentType); @@ -1113,7 +1118,7 @@ private void setTextOfEntry(HarEntry entry, ByteArrayOutputStream copy, String c } } - + public void shutdown() { shutdown = true; abortActiveRequests(); @@ -1129,7 +1134,7 @@ public void abortActiveRequests() { for (ActiveRequest activeRequest : activeRequests) { activeRequest.abort(); } - + activeRequests.clear(); } @@ -1221,10 +1226,10 @@ public void blacklistRequests(String pattern, int responseCode, String method) { public List getBlacklistedRequests() { List blacklist = new ArrayList(blacklistEntries.size()); blacklist.addAll(blacklistEntries); - + return blacklist; } - + public Collection getBlacklistedUrls() { return blacklistEntries; } @@ -1236,7 +1241,7 @@ public void clearBlacklist() { public boolean isWhitelistEnabled() { return whitelist.isEnabled(); } - + /** * @deprecated use getWhitelistUrls() * @return unmodifiable list of whitelisted Patterns @@ -1245,19 +1250,19 @@ public boolean isWhitelistEnabled() { public List getWhitelistRequests() { List whitelistPatterns = new ArrayList(whitelist.getPatterns().size()); whitelistPatterns.addAll(whitelist.getPatterns()); - + return Collections.unmodifiableList(whitelistPatterns); } - + /** * Retrieves Patterns of URLs that have been whitelisted. - * + * * @return unmodifiable whitelisted URL Patterns */ public Collection getWhitelistUrls() { return whitelist.getPatterns(); } - + public int getWhitelistResponseCode() { return whitelist.getResponseCode(); } @@ -1265,9 +1270,9 @@ public int getWhitelistResponseCode() { /** * Whitelist the specified request patterns, returning the specified responseCode for non-whitelisted * requests. - * - * @param patterns regular expression strings matching URL patterns to whitelist. if empty or null, - * the whitelist will be enabled but will not match any URLs. + * + * @param patterns regular expression strings matching URL patterns to whitelist. if empty or null, + * the whitelist will be enabled but will not match any URLs. * @param responseCode the HTTP response code to return for non-whitelisted requests */ public void whitelistRequests(String[] patterns, int responseCode) { @@ -1277,14 +1282,14 @@ public void whitelistRequests(String[] patterns, int responseCode) { whitelist = new Whitelist(patterns, responseCode); } } - + /** - * Clears and disables the current whitelist. + * Clears and disables the current whitelist. */ public void clearWhitelist() { whitelist = Whitelist.WHITELIST_DISABLED; } - + public void addHeader(String name, String value) { additionalHeaders.put(name, value); } @@ -1315,7 +1320,7 @@ public void validate(Cookie cookie, CookieOrigin origin) }; } }; - + Registry r = RegistryBuilder.create() .register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory()) @@ -1323,15 +1328,15 @@ public void validate(Cookie cookie, CookieOrigin origin) new BrowserCompatSpecFactory()) .register("easy", easySpecProvider) .build(); - + RequestConfig requestConfig = RequestConfig.custom() .setCookieSpec("easy") .build(); - + httpClientBuilder.setDefaultCookieSpecRegistry(r) .setDefaultRequestConfig(requestConfig); updateHttpClient(); - + decompress = false; setFollowRedirects(false); } @@ -1340,13 +1345,13 @@ public void validate(Cookie cookie, CookieOrigin origin) * CloseableHttpClient doesn't permit anymore to change parameters easily. * This method allow you to rebuild the httpClientBuilder to get the CloseableHttpClient * When the config is changed. - * + * * So httpClient reference change this may lead to concurrency issue. */ private void updateHttpClient(){ httpClient = httpClientBuilder.build(); } - + public String remappedHost(String host) { if (resolverWrapper.getResolver() instanceof AdvancedHostResolver) { AdvancedHostResolver advancedHostResolver = (AdvancedHostResolver) resolverWrapper.getResolver(); @@ -1422,7 +1427,7 @@ class ActiveRequest { this.request = request; this.start = start; } - + /** * Checks the timeout for this request, and aborts if necessary. * @return true if the request was aborted for exceeding its timeout, otherwise false. @@ -1431,7 +1436,7 @@ boolean checkTimeout() { if (aborting.get()) { return false; } - + if (requestTimeout != -1) { if (request != null && start != null && new Date(System.currentTimeMillis() - requestTimeout).after(start)) { boolean okayToAbort = aborting.compareAndSet(false, true); @@ -1439,18 +1444,18 @@ boolean checkTimeout() { LOG.info("Aborting request to {} after it failed to complete in {} ms", request.getURI().toString(), requestTimeout); abort(); - + return true; } } } - + return false; } public void abort() { request.abort(); - + // no need to close the connection -- the call to request.abort() releases the connection itself } } @@ -1512,6 +1517,14 @@ public static long copyWithStats(InputStream is, OutputStream os) throws IOExcep return bytesCopied; } + public String getHeadersFilterRegexp() { + return headersFilterRegexp; + } + + public void setHeadersFilterRegexp(String headersFilterRegexp) { + this.headersFilterRegexp = headersFilterRegexp; + } + public boolean isCaptureBinaryContent() { return captureBinaryContent; } diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 91a102d8f..42c0adb20 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java index 6aca98f6f..d92c988dd 100644 --- a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java +++ b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java @@ -28,6 +28,7 @@ import net.lightbody.bmp.proxy.http.RequestInterceptor; import net.lightbody.bmp.proxy.http.ResponseInterceptor; import net.lightbody.bmp.util.BrowserMobHttpUtil; +import org.apache.commons.lang3.StringUtils; import org.java_bandwidthlimiter.StreamManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -270,12 +271,14 @@ public Reply updateHeaders(@Named("port") int port, Request request) return Reply.saying().notFound(); } - Map headers = request.read(Map.class).as(Json.class); - for (Map.Entry entry : headers.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - proxy.addHeader(key, value); - } + Map mappedJsonRequest = request.read(Map.class).as(Json.class); + mappedJsonRequest.entrySet().stream() + .filter(stringStringEntry -> stringStringEntry.getKey().equalsIgnoreCase("headersFilterRegexp")) + .forEach(stringStringEntry -> proxy.addHeader(stringStringEntry.getKey(), stringStringEntry.getValue())); + + mappedJsonRequest.entrySet().stream().filter(stringStringEntry -> + stringStringEntry.getKey().equalsIgnoreCase("headersFilterRegexp") && StringUtils.isNotEmpty(stringStringEntry.getValue())).findFirst().ifPresent(stringStringEntry -> proxy.headerFilterRegexp(stringStringEntry.getValue())); + return Reply.saying().ok(); } diff --git a/mitm/pom.xml b/mitm/pom.xml index 7c2af724f..6694724c0 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT 4.0.0 @@ -17,7 +17,6 @@ org.littleshoot littleproxy - 1.1.3 true diff --git a/pom.xml b/pom.xml index fece2d2bb..bf15854e3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.33-SNAPSHOT + 2.1.34-SNAPSHOT browsermob-core browsermob-legacy @@ -78,9 +78,9 @@ 2.5.6 2.5.6-01 - 4.1.34.Final + 4.1.39.Final - 4.1.34.Final + 4.1.39.Final 1.61 3.0.1 From f67c6716fd99e38fa69f2dbc9500dc7ffe6d6da6 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Tue, 27 Aug 2019 15:53:32 +0200 Subject: [PATCH 28/41] Fix header injection for rest module and promote version (#26) * Fix header injection for rest module and promote version * Snapshot version bump --- README.md | 2 +- browsermob-core/pom.xml | 2 +- .../java/net/lightbody/bmp/util/BrowserMobHttpUtil.java | 3 ++- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- .../net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java | 3 ++- browsermob-rest/pom.xml | 2 +- .../java/net/lightbody/bmp/proxy/bricks/ProxyResource.java | 6 ++++-- mitm/pom.xml | 2 +- pom.xml | 2 +- 10 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 4f5498196..72774a7c3 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index cc592b185..9b2a51d45 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT 4.0.0 diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java index 282bf61b4..e8986680a 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java @@ -171,7 +171,8 @@ public static boolean hasTextualContent(String contentType) { contentType.startsWith("application/javascript") || contentType.startsWith("application/json") || contentType.startsWith("application/xml") || - contentType.startsWith("application/xhtml+xml") + contentType.startsWith("application/xhtml+xml") || + (contentType.startsWith("application/") && contentType.endsWith("+json")) ); } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 8af98bc62..fd0dd4f52 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 8bdce882e..4581348de 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT 4.0.0 diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java index 1191e164e..62c56d8d7 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/http/BrowserMobHttpClient.java @@ -1100,7 +1100,8 @@ private boolean hasTextualContent(String contentType) { contentType.startsWith("application/javascript") || contentType.startsWith("application/json") || contentType.startsWith("application/xml") || - contentType.startsWith("application/xhtml+xml"); + contentType.startsWith("application/xhtml+xml") || + (contentType.startsWith("application/") && contentType.endsWith("+json")); } private void setBinaryContentOfEntry(HarEntry entry, ByteArrayOutputStream copy) { diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 42c0adb20..7e1647a07 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT 4.0.0 diff --git a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java index d92c988dd..0737ef602 100644 --- a/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java +++ b/browsermob-rest/src/main/java/net/lightbody/bmp/proxy/bricks/ProxyResource.java @@ -273,11 +273,13 @@ public Reply updateHeaders(@Named("port") int port, Request request) Map mappedJsonRequest = request.read(Map.class).as(Json.class); mappedJsonRequest.entrySet().stream() - .filter(stringStringEntry -> stringStringEntry.getKey().equalsIgnoreCase("headersFilterRegexp")) + .filter(stringStringEntry -> !stringStringEntry.getKey().equalsIgnoreCase("headersFilterRegexp")) .forEach(stringStringEntry -> proxy.addHeader(stringStringEntry.getKey(), stringStringEntry.getValue())); mappedJsonRequest.entrySet().stream().filter(stringStringEntry -> - stringStringEntry.getKey().equalsIgnoreCase("headersFilterRegexp") && StringUtils.isNotEmpty(stringStringEntry.getValue())).findFirst().ifPresent(stringStringEntry -> proxy.headerFilterRegexp(stringStringEntry.getValue())); + stringStringEntry.getKey().equalsIgnoreCase("headersFilterRegexp") + && StringUtils.isNotEmpty(stringStringEntry.getValue())).findFirst() + .ifPresent(stringStringEntry -> proxy.headerFilterRegexp(stringStringEntry.getValue())); return Reply.saying().ok(); } diff --git a/mitm/pom.xml b/mitm/pom.xml index 6694724c0..01af63138 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index bf15854e3..792751b5a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.34-SNAPSHOT + 2.1.35-SNAPSHOT browsermob-core browsermob-legacy From ef3b41c2d3c0dfc1c10d73c8794e8d6967e5b6ae Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Thu, 17 Oct 2019 11:28:04 +0200 Subject: [PATCH 29/41] 2.1.35 (#27) * Update little proxy dependencies, update bunch of dependencies in brwosermobproxy * Update little proxy dependencies, update bunch of dependencies in brwosermobproxy * Push proper version * Update dependencies for java doc generation * Added snapshot version --- README.md | 2 +- browsermob-core/pom.xml | 8 +- .../lightbody/bmp/proxy/InterceptorTest.java | 8 +- .../proxy/dns/ChainedHostResolverTest.java | 15 +--- browsermob-dist/pom.xml | 3 +- browsermob-legacy/pom.xml | 4 +- browsermob-rest/pom.xml | 10 +-- mitm/pom.xml | 4 +- pom.xml | 81 +++++++----------- resources/jar/littleproxy-1.1.5.jar | Bin 126970 -> 0 bytes resources/jar/littleproxy-1.1.6.jar | Bin 0 -> 121955 bytes 11 files changed, 54 insertions(+), 81 deletions(-) delete mode 100644 resources/jar/littleproxy-1.1.5.jar create mode 100644 resources/jar/littleproxy-1.1.6.jar diff --git a/README.md b/README.md index 72774a7c3..30da906a4 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 9b2a51d45..cea7415d5 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT 4.0.0 @@ -14,7 +14,7 @@ BrowserMob Proxy Core (LittleProxy) Module - 9.4.15.v20190215 + 9.4.21.v20190926 @@ -87,7 +87,7 @@ dnsjava dnsjava - 2.1.8 + 2.1.9 @@ -255,7 +255,7 @@ org.hamcrest - hamcrest-library + hamcrest test diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java index 64cae3581..bdb2eb298 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/InterceptorTest.java @@ -4,14 +4,10 @@ import io.netty.handler.codec.http.*; import net.lightbody.bmp.BrowserMobProxy; import net.lightbody.bmp.BrowserMobProxyServer; -import net.lightbody.bmp.filters.RequestFilter; import net.lightbody.bmp.filters.RequestFilterAdapter; -import net.lightbody.bmp.filters.ResponseFilter; import net.lightbody.bmp.filters.ResponseFilterAdapter; import net.lightbody.bmp.proxy.test.util.MockServerTest; import net.lightbody.bmp.proxy.test.util.NewProxyServerTestUtil; -import net.lightbody.bmp.util.HttpMessageContents; -import net.lightbody.bmp.util.HttpMessageInfo; import net.lightbody.bmp.util.HttpObjectUtil; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -33,8 +29,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import static org.hamcrest.Matchers.endsWith; -import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.*; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; diff --git a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java index 9415f8854..04de7c9b9 100644 --- a/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java +++ b/browsermob-core/src/test/java/net/lightbody/bmp/proxy/dns/ChainedHostResolverTest.java @@ -17,20 +17,13 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; public class ChainedHostResolverTest { @Test @@ -62,7 +55,7 @@ public void testResolveReturnsFirstResults() { ChainedHostResolver chainResolver = new ChainedHostResolver(ImmutableList.of(firstResolver, secondResolver)); when(firstResolver.resolve("1.1.1.1")).thenReturn(TestConstants.addressOnesList); - when(secondResolver.resolve("1.1.1.1")).thenReturn(Collections.emptyList()); + when(secondResolver.resolve("1.1.1.1")).thenReturn(Collections.emptyList()); Collection results = chainResolver.resolve("1.1.1.1"); assertNotNull("Resolver should not return null results", results); diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index fd0dd4f52..d38915711 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT 4.0.0 @@ -15,7 +15,6 @@ ${project.parent.artifactId}-${project.version} - ${netty-4.1.version} diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 4581348de..ce801aba5 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT 4.0.0 @@ -110,7 +110,7 @@ org.hamcrest - hamcrest-library + hamcrest test diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 7e1647a07..e845c78c1 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT 4.0.0 @@ -63,19 +63,19 @@ org.eclipse.jetty jetty-server - 9.4.15.v20190215 + 9.4.21.v20190926 org.eclipse.jetty jetty-servlet - 9.4.15.v20190215 + 9.4.21.v20190926 net.sf.jopt-simple jopt-simple - 3.2 + 5.0.4 @@ -167,7 +167,7 @@ org.hamcrest - hamcrest-library + hamcrest test diff --git a/mitm/pom.xml b/mitm/pom.xml index 01af63138..f74f746fa 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT 4.0.0 @@ -88,7 +88,7 @@ org.hamcrest - hamcrest-library + hamcrest test diff --git a/pom.xml b/pom.xml index 792751b5a..4191cf7f8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.35-SNAPSHOT + 2.1.36-SNAPSHOT browsermob-core browsermob-legacy @@ -46,7 +46,7 @@ git@github.com:lightbody/browsermob-proxy.git HEAD - + bintray @@ -65,25 +65,26 @@ UTF-8 UTF-8 - 1.7.26 + 1.7.28 3.141.59 - 2.8.9 + 2.10.0 1.13.0 3.1.1 - 2.11.2 + 2.12.1 - 2.5.6 - 2.5.6-01 + 2.5.8 + 2.5.8-02 - 4.1.39.Final + 4.1.42.Final - 4.1.39.Final - 1.61 + 1.64 3.0.1 + 8 + -Xdoclint:none @@ -103,11 +104,11 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.8.1 - groovy-eclipse-compiler - 1.8 - 1.8 + ${java.version} + ${java.version} + UTF-8 @@ -152,7 +153,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.1.1 attach-javadocs @@ -161,7 +162,7 @@ jar - ${javadoc.opts} + ${additionalJOption} @@ -176,11 +177,11 @@ false install - ${basedir}/resources/jar/littleproxy-1.1.5.jar + ${basedir}/resources/jar/littleproxy-1.1.6.jar default org.littleshoot littleproxy - 1.1.5 + 1.1.6 jar @@ -241,7 +242,7 @@ com.google.guava guava - 27.1-jre + 28.1-jre @@ -268,19 +269,19 @@ org.hamcrest - hamcrest-library - 1.3 + hamcrest + 2.1 org.mockito mockito-core - 2.25.0 + 3.1.0 net.bytebuddy byte-buddy - 1.9.10 + 1.10.1 @@ -308,7 +309,7 @@ org.littleshoot littleproxy - 1.1.5 + 1.1.6 @@ -351,13 +352,13 @@ org.apache.httpcomponents httpclient - 4.5.7 + 4.5.10 org.apache.httpcomponents httpmime - 4.5.7 + 4.5.10 @@ -456,7 +457,7 @@ org.javassist javassist - 3.24.1-GA + 3.26.0-GA @@ -466,7 +467,7 @@ org.codehaus.groovy groovy-all - 2.5.6 + 2.5.8 pom @@ -489,7 +490,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.19.1 + 3.0.0-M3 true @@ -497,7 +498,7 @@ org.apache.maven.plugins maven-source-plugin - 3.0.1 + 3.1.0 attach-sources @@ -511,7 +512,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.1.1 attach-javadocs @@ -542,7 +543,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.7 + 1.6.8 true ossrh @@ -566,21 +567,5 @@ - - doclint-java8-disable - - [1.8,) - - - -Xdoclint:none - - - - - netty-4.1 - - ${netty-4.1.version} - - diff --git a/resources/jar/littleproxy-1.1.5.jar b/resources/jar/littleproxy-1.1.5.jar deleted file mode 100644 index 2f5a9198f4d45aa7652ceec4673e81332015f0c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126970 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

>PTB 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%0A&7+7l9_bnRzWX}A`@(c1iwzAw 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 diff --git a/resources/jar/littleproxy-1.1.6.jar b/resources/jar/littleproxy-1.1.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..927e769a3135b71661acf641d4eb599eb2883798 GIT binary patch literal 121955 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 z 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 literal 0 HcmV?d00001 From b285fc50a393cf00127be0e8937bf14c3c75bafb Mon Sep 17 00:00:00 2001 From: "whitesource-for-github-com[bot]" <50673670+whitesource-for-github-com[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2020 07:42:48 +0200 Subject: [PATCH 30/41] Configure WhiteSource for GitHub.com (#28) * Add .whitesource configuration file * [IS-779](https://hellofresh.atlassian.net/browse/IS-779) - Disable GitHub issue creation In order to avoid spamming the GitHub repository with issues regarding possible security vulnerabilities and to integrate probably within the HelloFresh project management. The GitHub issue creation is disabled as per the [whitesource documentation](https://whitesource.atlassian.net/wiki/spaces/WD/pages/697696422/WhiteSource+for+GitHub.com#WhiteSourceforGitHub.com-IssueSettings(issueSettings)) Co-authored-by: whitesource-for-github-com[bot] <50673670+whitesource-for-github-com[bot]@users.noreply.github.com> Co-authored-by: hf-security <60392618+hf-security@users.noreply.github.com> --- .whitesource | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .whitesource diff --git a/.whitesource b/.whitesource new file mode 100644 index 000000000..f15f2cf8e --- /dev/null +++ b/.whitesource @@ -0,0 +1,13 @@ +{ + "scanSettings": { + "configMode": "AUTO", + "configExternalURL": "", + "projectToken" : "" + }, + "checkRunSettings": { + "vulnerableCheckRunConclusionLevel": "success" + }, + "issueSettings": { + "minSeverityLevel": "NONE" + } +} From 8a3c25288680eefc2565e5fc2fca54b82feb1bec Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Thu, 20 Aug 2020 11:15:07 +0200 Subject: [PATCH 31/41] BMP_2.1.36 (#29) * BMP_2.1.36 * Update fluent d dependency * guice update * guice update --- README.md | 2 +- browsermob-core/pom.xml | 2 +- browsermob-dist/pom.xml | 2 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 8 ++++---- mitm/pom.xml | 2 +- pom.xml | 26 ++++++++++++++++---------- 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 30da906a4..58defd501 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.36-SNAPSHOT + 2.1.36 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index cea7415d5..726e0ce2a 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36-SNAPSHOT + 2.1.36 4.0.0 diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index d38915711..c66744429 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36-SNAPSHOT + 2.1.36 4.0.0 diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index ce801aba5..b269f8fa8 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36-SNAPSHOT + 2.1.36 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index e845c78c1..dffd3b17e 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36-SNAPSHOT + 2.1.36 4.0.0 @@ -40,19 +40,19 @@ com.google.inject guice - 4.2.2 + 4.2.3 com.google.inject.extensions guice-servlet - 4.2.2 + 4.2.3 com.google.inject.extensions guice-multibindings - 4.2.2 + 4.2.3 diff --git a/mitm/pom.xml b/mitm/pom.xml index f74f746fa..e36f5ec4c 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36-SNAPSHOT + 2.1.36 4.0.0 diff --git a/pom.xml b/pom.xml index 4191cf7f8..1a5656923 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.36-SNAPSHOT + 2.1.36 browsermob-core browsermob-legacy @@ -73,15 +73,15 @@ 3.1.1 - 2.12.1 + 2.13.3 - 2.5.8 + 3.0.5 2.5.8-02 - 4.1.42.Final + 4.1.51.Final - 1.64 + 1.66 3.0.1 8 -Xdoclint:none @@ -239,6 +239,12 @@ ${logstash-gelf.version} + + com.twimba + fluentd4log4j + 1.0.1 + + com.google.guava guava @@ -276,12 +282,12 @@ org.mockito mockito-core - 3.1.0 + 3.5.2 net.bytebuddy byte-buddy - 1.10.1 + 1.10.14 @@ -316,7 +322,7 @@ org.mock-server mockserver-netty - 5.5.1 + 5.11.1 ch.qos.logback @@ -352,13 +358,13 @@ org.apache.httpcomponents httpclient - 4.5.10 + 4.5.12 org.apache.httpcomponents httpmime - 4.5.10 + 4.5.12 From 00b04f712d78c3d15e8a61e6ff8a567536480543 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Thu, 20 Aug 2020 11:18:29 +0200 Subject: [PATCH 32/41] Open jdk 11 (#30) * BMP_2.1.36 * Update fluent d dependency * guice update * guice update * Update jdk * Update regarding jdk * one more update * jetty update --- .travis.yml | 2 +- browsermob-legacy/pom.xml | 2 +- .../bmp/proxy/jetty/http/SunJsseListener.java | 181 ++++++++---------- browsermob-rest/pom.xml | 4 +- pom.xml | 2 +- 5 files changed, 89 insertions(+), 102 deletions(-) diff --git a/.travis.yml b/.travis.yml index df1624cee..f58eecba5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ jdk: # Not running tests against openjdk7, since the SunEC is not included in travis-ci's version of openjdk7. # Not running tests against oraclejdk7, since travis-ci no longer provides it. # - openjdk7 - - oraclejdk8 + - openjdk11 cache: directories: diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index b269f8fa8..829efa5fd 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -14,7 +14,7 @@ BrowserMob Proxy Legacy (Jetty) Module - 9.4.15.v20190215 + 9.4.31.v20200723 true diff --git a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/http/SunJsseListener.java b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/http/SunJsseListener.java index 0c2262bba..89b64a54a 100644 --- a/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/http/SunJsseListener.java +++ b/browsermob-legacy/src/main/java/net/lightbody/bmp/proxy/jetty/http/SunJsseListener.java @@ -15,13 +15,12 @@ package net.lightbody.bmp.proxy.jetty.http; -import com.sun.net.ssl.*; import net.lightbody.bmp.proxy.jetty.log.LogFactory; import net.lightbody.bmp.proxy.jetty.util.InetAddrPort; import net.lightbody.bmp.proxy.jetty.util.Password; import org.apache.commons.logging.Log; -import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.*; import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; @@ -30,25 +29,26 @@ /* ------------------------------------------------------------ */ -/** SSL Socket Listener for Sun's JSSE. - * + +/** + * SSL Socket Listener for Sun's JSSE. + *

* This specialization of JsseListener is an specific listener * using the Sun reference implementation. - * + *

* This is heavily based on the work from Court Demas, which in * turn is based on the work from Forge Research. * - * @version $Id: SunJsseListener.java,v 1.20 2005/08/13 00:01:24 gregwilkins Exp $ - * @deprecated Use org.mortbay.http.SslListener * @author Greg Wilkins (gregw@mortbay.com) * @author Court Demas (court@kiwiconsulting.com) * @author Forge Research Pty Ltd ACN 003 491 576 + * @version $Id: SunJsseListener.java,v 1.20 2005/08/13 00:01:24 gregwilkins Exp $ + * @deprecated Use org.mortbay.http.SslListener **/ -public class SunJsseListener extends JsseListener -{ +public class SunJsseListener extends JsseListener { private static Log log = LogFactory.getLog(SunJsseListener.class); - private String _keystore=DEFAULT_KEYSTORE ; + private String _keystore = DEFAULT_KEYSTORE; private transient Password _password; private transient Password _keypassword; private String _keystore_type = DEFAULT_KEYSTORE_TYPE; @@ -56,149 +56,136 @@ public class SunJsseListener extends JsseListener private String _keystore_provider_class = DEFAULT_KEYSTORE_PROVIDER_CLASS; private boolean _useDefaultTrustStore = false; - /* ------------------------------------------------------------ */ - static - { - Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); - } /* ------------------------------------------------------------ */ - public void setKeystore(String keystore) - { + public void setKeystore(String keystore) { _keystore = keystore; } - + /* ------------------------------------------------------------ */ - public String getKeystore() - { + public String getKeystore() { return _keystore; } - + /* ------------------------------------------------------------ */ - public void setPassword(String password) - { - _password = Password.getPassword(PASSWORD_PROPERTY,password,null); + public void setPassword(String password) { + _password = Password.getPassword(PASSWORD_PROPERTY, password, null); } /* ------------------------------------------------------------ */ - public void setKeyPassword(String password) - { - _keypassword = Password.getPassword(KEYPASSWORD_PROPERTY,password,null); + public void setKeyPassword(String password) { + _keypassword = Password.getPassword(KEYPASSWORD_PROPERTY, password, null); } - - + + /* ------------------------------------------------------------ */ - public void setKeystoreType(String keystore_type) - { + public void setKeystoreType(String keystore_type) { _keystore_type = keystore_type; } - + /* ------------------------------------------------------------ */ - public String getKeystoreType() - { + public String getKeystoreType() { return _keystore_type; } /* ------------------------------------------------------------ */ - public void setKeystoreProviderName(String name) - { + public void setKeystoreProviderName(String name) { _keystore_provider_name = name; } /* ------------------------------------------------------------ */ - public String getKeystoreProviderName() - { + public String getKeystoreProviderName() { return _keystore_provider_name; } /* ------------------------------------------------------------ */ - public String getKeystoreProviderClass() - { + public String getKeystoreProviderClass() { return _keystore_provider_class; } /* ------------------------------------------------------------ */ - public void setKeystoreProviderClass(String classname) - { + public void setKeystoreProviderClass(String classname) { _keystore_provider_class = classname; } /* ------------------------------------------------------------ */ + /** * Gets the default trust store flag. * * @return true if the default truststore will be used to initialize the * TrustManager, false otherwise. */ - public boolean getUseDefaultTrustStore() - { + public boolean getUseDefaultTrustStore() { return _useDefaultTrustStore; } /* ------------------------------------------------------------ */ + /** * Set a flag to determine if the default truststore should be used to * initialize the TrustManager. The default truststore will typically be * the ${JAVA_HOME}/jre/lib/security/cacerts. * * @param flag if true, the default truststore will be used. If false, the - * configured keystore will be used as the truststore. + * configured keystore will be used as the truststore. */ - public void setUseDefaultTrustStore(boolean flag) - { + public void setUseDefaultTrustStore(boolean flag) { _useDefaultTrustStore = flag; } /* ------------------------------------------------------------ */ - /** Constructor. + + /** + * Constructor. */ - public SunJsseListener() - { + public SunJsseListener() { super(); } /* ------------------------------------------------------------ */ - /** Constructor. - * @param p_address + + /** + * Constructor. + * + * @param p_address */ - public SunJsseListener(InetAddrPort p_address) - { - super( p_address); + public SunJsseListener(InetAddrPort p_address) { + super(p_address); } - + /* ------------------------------------------------------------ */ - /* - * @return - * @exception Exception + /* + * @return + * @exception Exception */ protected SSLServerSocketFactory createFactory() - throws Exception - { - _keystore = System.getProperty( KEYSTORE_PROPERTY,_keystore); - - log.info(KEYSTORE_PROPERTY+"="+_keystore); - - if (_password==null) - _password = Password.getPassword(PASSWORD_PROPERTY,null,null); - log.info(PASSWORD_PROPERTY+"="+_password.toStarString()); - - if (_keypassword==null) + throws Exception { + _keystore = System.getProperty(KEYSTORE_PROPERTY, _keystore); + + log.info(KEYSTORE_PROPERTY + "=" + _keystore); + + if (_password == null) + _password = Password.getPassword(PASSWORD_PROPERTY, null, null); + log.info(PASSWORD_PROPERTY + "=" + _password.toStarString()); + + if (_keypassword == null) _keypassword = Password.getPassword(KEYPASSWORD_PROPERTY, - null, - _password.toString()); - log.info(KEYPASSWORD_PROPERTY+"="+_keypassword.toStarString()); + null, + _password.toString()); + log.info(KEYPASSWORD_PROPERTY + "=" + _keypassword.toStarString()); KeyStore ks = null; - log.info(KEYSTORE_TYPE_PROPERTY+"="+_keystore_type); - + log.info(KEYSTORE_TYPE_PROPERTY + "=" + _keystore_type); + if (_keystore_provider_class != null) { // find provider. // avoid creating another instance if already installed in Security. java.security.Provider[] installed_providers = Security.getProviders(); java.security.Provider myprovider = null; - for (int i=0; i < installed_providers.length; i++) { + for (int i = 0; i < installed_providers.length; i++) { if (installed_providers[i].getClass().getName().equals(_keystore_provider_class)) { myprovider = installed_providers[i]; break; @@ -209,37 +196,37 @@ protected SSLServerSocketFactory createFactory() myprovider = (java.security.Provider) Class.forName(_keystore_provider_class).newInstance(); Security.addProvider(myprovider); } - log.info(KEYSTORE_PROVIDER_CLASS_PROPERTY+"="+_keystore_provider_class); - ks = KeyStore.getInstance(_keystore_type,myprovider.getName()); + log.info(KEYSTORE_PROVIDER_CLASS_PROPERTY + "=" + _keystore_provider_class); + ks = KeyStore.getInstance(_keystore_type, myprovider.getName()); } else if (_keystore_provider_name != null) { - log.info(KEYSTORE_PROVIDER_NAME_PROPERTY+"="+_keystore_provider_name); - ks = KeyStore.getInstance(_keystore_type,_keystore_provider_name); + log.info(KEYSTORE_PROVIDER_NAME_PROPERTY + "=" + _keystore_provider_name); + ks = KeyStore.getInstance(_keystore_type, _keystore_provider_name); } else { ks = KeyStore.getInstance(_keystore_type); - log.info(KEYSTORE_PROVIDER_NAME_PROPERTY+"=[DEFAULT]"); + log.info(KEYSTORE_PROVIDER_NAME_PROPERTY + "=[DEFAULT]"); } - - ks.load( new FileInputStream( new File( _keystore ) ), - _password.toString().toCharArray()); - - KeyManagerFactory km = KeyManagerFactory.getInstance( "SunX509","SunJSSE"); - km.init( ks, _keypassword.toString().toCharArray() ); - KeyManager[] kma = km.getKeyManagers(); - - TrustManagerFactory tm = TrustManagerFactory.getInstance("SunX509","SunJSSE"); + + ks.load(new FileInputStream(new File(_keystore)), + _password.toString().toCharArray()); + + KeyManagerFactory km = KeyManagerFactory.getInstance("SunX509", "SunJSSE"); + km.init(ks, _keypassword.toString().toCharArray()); + KeyManager[] kma = km.getKeyManagers(); + + TrustManagerFactory tm = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); if (_useDefaultTrustStore) { - tm.init( (KeyStore)null ); + tm.init((KeyStore) null); } else { - tm.init( ks ); + tm.init(ks); } TrustManager[] tma = tm.getTrustManagers(); - - SSLContext sslc = SSLContext.getInstance( "SSL" ); - sslc.init( kma, tma, SecureRandom.getInstance("SHA1PRNG")); - + + SSLContext sslc = SSLContext.getInstance("SSL"); + sslc.init(kma, tma, SecureRandom.getInstance("SHA1PRNG")); + SSLServerSocketFactory ssfc = sslc.getServerSocketFactory(); - log.info("SSLServerSocketFactory="+ssfc); + log.info("SSLServerSocketFactory=" + ssfc); return ssfc; } } diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index dffd3b17e..75f1204e3 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -63,13 +63,13 @@ org.eclipse.jetty jetty-server - 9.4.21.v20190926 + 9.4.31.v20200723 org.eclipse.jetty jetty-servlet - 9.4.21.v20190926 + 9.4.31.v20200723 diff --git a/pom.xml b/pom.xml index 1a5656923..ca701b1e7 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 1.66 3.0.1 - 8 + 11 -Xdoclint:none From c7dac9fb7b55912717ad6c2db4dfe8ad448aa976 Mon Sep 17 00:00:00 2001 From: "whitesource-for-github-com[bot]" <50673670+whitesource-for-github-com[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2020 14:20:47 +0200 Subject: [PATCH 33/41] Migrate .whitesource configuration file to inheritance mode (#32) Co-authored-by: whitesource-for-github-com[bot] <50673670+whitesource-for-github-com[bot]@users.noreply.github.com> --- .whitesource | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.whitesource b/.whitesource index f15f2cf8e..d40db00ae 100644 --- a/.whitesource +++ b/.whitesource @@ -1,13 +1,3 @@ { - "scanSettings": { - "configMode": "AUTO", - "configExternalURL": "", - "projectToken" : "" - }, - "checkRunSettings": { - "vulnerableCheckRunConclusionLevel": "success" - }, - "issueSettings": { - "minSeverityLevel": "NONE" - } -} + "settingsInheritedFrom": "hellofresh/whitesource-config@master" +} \ No newline at end of file From 0b1814407fd922f8c0d55914ae657226b3c8754a Mon Sep 17 00:00:00 2001 From: kirillbilchenko Date: Thu, 20 Aug 2020 14:39:01 +0200 Subject: [PATCH 34/41] Added fluentD logger --- README.md | 2 +- browsermob-core/pom.xml | 8 ++++- .../bmp/filters/HarCaptureFilter.java | 33 +++++++++++++------ browsermob-dist/pom.xml | 7 +++- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 8 ++--- 8 files changed, 44 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 58defd501..d65a5bae7 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.36 + 2.1.37 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 726e0ce2a..dfd9b1d83 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 @@ -69,6 +69,12 @@ jackson-core + + org.fluentd + fluent-logger + + + com.fasterxml.jackson.core jackson-databind diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 6b2ae86fb..68e79d84f 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -17,10 +17,11 @@ import net.lightbody.bmp.proxy.CaptureType; import net.lightbody.bmp.util.BeansJsonMapper; import net.lightbody.bmp.util.BrowserMobHttpUtil; +import org.apache.commons.lang3.StringUtils; +import org.fluentd.logger.FluentLogger; import org.littleshoot.proxy.impl.ProxyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.slf4j.MDC; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -30,12 +31,22 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import static net.lightbody.bmp.filters.StatsDMetricsFilter.*; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getProxyPrefix; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getStatsDHost; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getStatsDPort; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.prepareMetric; public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); + private static FluentLogger LOG; private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); + static { + if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentPort"))) { + LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost", "localhost"), Integer.parseInt(System.getProperty("fluentPort", "0"))); + } + } + /** * The currently active HAR at the time the current request is received. */ @@ -769,15 +780,17 @@ public void serverToProxyResponseReceived() { } protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - if ((Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) + if (Objects.nonNull(LOG) && + (Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) && (response.getStatus() >= 500 || response.getStatus() == 0)) { - MDC.put("caller", "mobproxy"); - MDC.put("http_response_code", String.valueOf(response.getStatus())); - MDC.put("http_host", request.getUrl()); - MDC.put("request_details", BeansJsonMapper.getJsonString(request)); - MDC.put("method", request.getMethod()); - MDC.put("response", BeansJsonMapper.getJsonString(response)); - log.error("received bad status code"); + Map data = new HashMap(); + data.put("caller", "mobproxy"); + data.put("http_response_code", String.valueOf(response.getStatus())); + data.put("http_host", request.getUrl()); + data.put("request_details", BeansJsonMapper.getJsonString(request)); + data.put("method", request.getMethod()); + data.put("response", BeansJsonMapper.getJsonString(response)); + LOG.log("failure", data); isAlreadyLoggedIn.set(request); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index c66744429..b6173ced1 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 @@ -45,6 +45,11 @@ logstash-gelf + + org.fluentd + fluent-logger + + org.apache.logging.log4j log4j-core diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 829efa5fd..5238c035d 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 75f1204e3..fdcd0e80c 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index e36f5ec4c..01d5dddb4 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 diff --git a/pom.xml b/pom.xml index ca701b1e7..2436e5384 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.36 + 2.1.37 browsermob-core browsermob-legacy @@ -240,9 +240,9 @@ - com.twimba - fluentd4log4j - 1.0.1 + org.fluentd + fluent-logger + 0.3.4 From bd05297cf321de34e3a0ed6b38640bd356b52a2c Mon Sep 17 00:00:00 2001 From: kirillbilchenko Date: Thu, 20 Aug 2020 14:42:00 +0200 Subject: [PATCH 35/41] Naming fix --- .../main/java/net/lightbody/bmp/filters/HarCaptureFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 68e79d84f..02715d78f 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -42,8 +42,8 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); static { - if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentPort"))) { - LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost", "localhost"), Integer.parseInt(System.getProperty("fluentPort", "0"))); + if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentdPort"))) { + LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost", "localhost"), Integer.parseInt(System.getProperty("fluentdPort", "0"))); } } From 9b32c6278c80774e60b09be71bd47a2694f109d8 Mon Sep 17 00:00:00 2001 From: kirillbilchenko Date: Thu, 20 Aug 2020 14:43:17 +0200 Subject: [PATCH 36/41] Logic fix --- .../main/java/net/lightbody/bmp/filters/HarCaptureFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 02715d78f..0d1bc17bb 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -43,7 +43,7 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { static { if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentdPort"))) { - LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost", "localhost"), Integer.parseInt(System.getProperty("fluentdPort", "0"))); + LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost"), Integer.parseInt(System.getProperty("fluentdPort"))); } } From 29bcac761e29aad1bd9c4c27f35147b85acc9f80 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Thu, 20 Aug 2020 14:49:45 +0200 Subject: [PATCH 37/41] Added fluentD logger (#33) * Added fluentD logger * Naming fix * Logic fix --- README.md | 2 +- browsermob-core/pom.xml | 8 ++++- .../bmp/filters/HarCaptureFilter.java | 33 +++++++++++++------ browsermob-dist/pom.xml | 7 +++- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 8 ++--- 8 files changed, 44 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 58defd501..d65a5bae7 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.36 + 2.1.37 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index 726e0ce2a..dfd9b1d83 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 @@ -69,6 +69,12 @@ jackson-core + + org.fluentd + fluent-logger + + + com.fasterxml.jackson.core jackson-databind diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 6b2ae86fb..0d1bc17bb 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -17,10 +17,11 @@ import net.lightbody.bmp.proxy.CaptureType; import net.lightbody.bmp.util.BeansJsonMapper; import net.lightbody.bmp.util.BrowserMobHttpUtil; +import org.apache.commons.lang3.StringUtils; +import org.fluentd.logger.FluentLogger; import org.littleshoot.proxy.impl.ProxyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.slf4j.MDC; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -30,12 +31,22 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import static net.lightbody.bmp.filters.StatsDMetricsFilter.*; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getProxyPrefix; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getStatsDHost; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.getStatsDPort; +import static net.lightbody.bmp.filters.StatsDMetricsFilter.prepareMetric; public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); + private static FluentLogger LOG; private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); + static { + if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentdPort"))) { + LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost"), Integer.parseInt(System.getProperty("fluentdPort"))); + } + } + /** * The currently active HAR at the time the current request is received. */ @@ -769,15 +780,17 @@ public void serverToProxyResponseReceived() { } protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - if ((Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) + if (Objects.nonNull(LOG) && + (Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) && (response.getStatus() >= 500 || response.getStatus() == 0)) { - MDC.put("caller", "mobproxy"); - MDC.put("http_response_code", String.valueOf(response.getStatus())); - MDC.put("http_host", request.getUrl()); - MDC.put("request_details", BeansJsonMapper.getJsonString(request)); - MDC.put("method", request.getMethod()); - MDC.put("response", BeansJsonMapper.getJsonString(response)); - log.error("received bad status code"); + Map data = new HashMap(); + data.put("caller", "mobproxy"); + data.put("http_response_code", String.valueOf(response.getStatus())); + data.put("http_host", request.getUrl()); + data.put("request_details", BeansJsonMapper.getJsonString(request)); + data.put("method", request.getMethod()); + data.put("response", BeansJsonMapper.getJsonString(response)); + LOG.log("failure", data); isAlreadyLoggedIn.set(request); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index c66744429..b6173ced1 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 @@ -45,6 +45,11 @@ logstash-gelf + + org.fluentd + fluent-logger + + org.apache.logging.log4j log4j-core diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 829efa5fd..5238c035d 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index 75f1204e3..fdcd0e80c 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index e36f5ec4c..01d5dddb4 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.36 + 2.1.37 4.0.0 diff --git a/pom.xml b/pom.xml index ca701b1e7..2436e5384 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.36 + 2.1.37 browsermob-core browsermob-legacy @@ -240,9 +240,9 @@ - com.twimba - fluentd4log4j - 1.0.1 + org.fluentd + fluent-logger + 0.3.4 From 0a2637419d491de1ccfbe05e43f3d34117f484c9 Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 24 Aug 2020 10:08:39 +0200 Subject: [PATCH 38/41] Update littleproxy-1.1.7.jar (#35) * Update littleproxy-1.1.7.jar * typo * Update dependencies and capture filter * Update code formatting * Use ubuntu 18.04 --- .travis.yml | 5 +- README.md | 2 +- browsermob-core/pom.xml | 12 ++-- .../bmp/filters/HarCaptureFilter.java | 56 +++++++++++------- browsermob-dist/pom.xml | 7 +-- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 13 ++-- resources/jar/littleproxy-1.1.6.jar | Bin 121955 -> 0 bytes resources/jar/littleproxy-1.1.7.jar | Bin 0 -> 120645 bytes 11 files changed, 49 insertions(+), 52 deletions(-) delete mode 100644 resources/jar/littleproxy-1.1.6.jar create mode 100644 resources/jar/littleproxy-1.1.7.jar diff --git a/.travis.yml b/.travis.yml index f58eecba5..a2b4446dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,8 @@ sudo: false language: java -dist: trusty +dist: bionic jdk: - # Not running tests against openjdk7, since the SunEC is not included in travis-ci's version of openjdk7. - # Not running tests against oraclejdk7, since travis-ci no longer provides it. - # - openjdk7 - openjdk11 cache: diff --git a/README.md b/README.md index d65a5bae7..62a541a91 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.37 + test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index dfd9b1d83..fe4c6e211 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 @@ -69,12 +69,6 @@ jackson-core - - org.fluentd - fluent-logger - - - com.fasterxml.jackson.core jackson-databind @@ -269,5 +263,9 @@ httpclient test + + org.apache.logging.log4j + log4j-api + \ No newline at end of file diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 0d1bc17bb..52f3541d0 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -6,28 +6,48 @@ import com.timgroup.statsd.StatsDClient; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.*; +import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.codec.http.QueryStringDecoder; import io.netty.handler.codec.http.cookie.ClientCookieDecoder; import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.ServerCookieDecoder; -import net.lightbody.bmp.core.har.*; +import net.lightbody.bmp.core.har.Har; +import net.lightbody.bmp.core.har.HarCookie; +import net.lightbody.bmp.core.har.HarEntry; +import net.lightbody.bmp.core.har.HarNameValuePair; +import net.lightbody.bmp.core.har.HarPostData; +import net.lightbody.bmp.core.har.HarPostDataParam; +import net.lightbody.bmp.core.har.HarRequest; +import net.lightbody.bmp.core.har.HarResponse; import net.lightbody.bmp.exception.UnsupportedCharsetException; import net.lightbody.bmp.filters.support.HttpConnectTiming; import net.lightbody.bmp.filters.util.HarCaptureUtil; import net.lightbody.bmp.proxy.CaptureType; import net.lightbody.bmp.util.BeansJsonMapper; import net.lightbody.bmp.util.BrowserMobHttpUtil; -import org.apache.commons.lang3.StringUtils; -import org.fluentd.logger.FluentLogger; import org.littleshoot.proxy.impl.ProxyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.MDC; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Calendar; +import java.util.Date; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -38,15 +58,8 @@ public class HarCaptureFilter extends HttpsAwareFiltersAdapter { private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); - private static FluentLogger LOG; private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); - static { - if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentdPort"))) { - LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost"), Integer.parseInt(System.getProperty("fluentdPort"))); - } - } - /** * The currently active HAR at the time the current request is received. */ @@ -780,17 +793,16 @@ public void serverToProxyResponseReceived() { } protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - if (Objects.nonNull(LOG) && - (Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) + if ((Objects.isNull(isAlreadyLoggedIn.get()) || + isAlreadyLoggedIn.get().hashCode() != request.hashCode()) && (response.getStatus() >= 500 || response.getStatus() == 0)) { - Map data = new HashMap(); - data.put("caller", "mobproxy"); - data.put("http_response_code", String.valueOf(response.getStatus())); - data.put("http_host", request.getUrl()); - data.put("request_details", BeansJsonMapper.getJsonString(request)); - data.put("method", request.getMethod()); - data.put("response", BeansJsonMapper.getJsonString(response)); - LOG.log("failure", data); + MDC.put("caller", "mobproxy"); + MDC.put("http_response_code", String.valueOf(response.getStatus())); + MDC.put("http_host", request.getUrl()); + MDC.put("request_details", BeansJsonMapper.getJsonString(request)); + MDC.put("method", request.getMethod()); + MDC.put("response", BeansJsonMapper.getJsonString(response)); + log.error("received bad status code"); isAlreadyLoggedIn.set(request); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index b6173ced1..6ae3e3396 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 @@ -45,11 +45,6 @@ logstash-gelf - - org.fluentd - fluent-logger - - org.apache.logging.log4j log4j-core diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 5238c035d..985c60154 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index fdcd0e80c..6c01e56fe 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 01d5dddb4..a0738f622 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 diff --git a/pom.xml b/pom.xml index 2436e5384..b1588f803 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.37 + 2.1.38 browsermob-core browsermob-legacy @@ -177,11 +177,11 @@ false install - ${basedir}/resources/jar/littleproxy-1.1.6.jar + ${basedir}/resources/jar/littleproxy-1.1.7.jar default org.littleshoot littleproxy - 1.1.6 + 1.1.7 jar @@ -239,11 +239,6 @@ ${logstash-gelf.version} - - org.fluentd - fluent-logger - 0.3.4 - com.google.guava @@ -315,7 +310,7 @@ org.littleshoot littleproxy - 1.1.6 + 1.1.7 diff --git a/resources/jar/littleproxy-1.1.6.jar b/resources/jar/littleproxy-1.1.6.jar deleted file mode 100644 index 927e769a3135b71661acf641d4eb599eb2883798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121955 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 z 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 diff --git a/resources/jar/littleproxy-1.1.7.jar b/resources/jar/littleproxy-1.1.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..b5130bdf5db05ba4194387c97707eba164c34eed GIT binary patch literal 120645 zcmbTd1CV9S)-76HwyV2r+qP}nw%ujhw(Z(wn_aeTce!4F=lt*B-gnNu@peSUUa@1& zl{;sykvVg&G32E{Kv98!AR&P`IKC@<@}p$P0s#TZ{b_%G1(Fd_7NC)k6{V9Akd+V> zQBtOr5xtk0oRF5Hq5TCXMMF6~In$^}zreI}=twImLoFfm%cY`8@kWMPYD&qTT5@`n zT8c)Ieu?Q@xjp67q{OdB$+0CkT5%b0OQwUvy+dFi`9J+b|LGs-Z~g!2@*f|lKUe?g z|DR^;fBxn_Z2nw;{%LlOW_17A0`Y$=tSy|KtxcTF?d+WY#rm&d|Lgs}|9@E9JKDK> z{1+dr|L9|3V{iRm9C7}mqlvq-qk+?ZaYgv!`j7C~7`U3){ug7s|K0dc%xM4bB0}|l zcK-W~{u!o!K2Z%E3{2|ZfPmR;jOG7|Gp&)efs>O>{ERFx1LAP0 zA1&di-mgRm6qK-V9?u=$1q zo1UM%JwQ9iG2AEa_9p_V0&K!=IN|C>_I6Vvdz6sWB@}^)x<9#5>;kNu-%|qY4q)0< ze0%d`r|aVdKQuU<8S4d0!|P+rr^O4=vrxuX;wo1-f-Q`r_9d1gzo zI>fcDnF9@LzXtQ3u&F|y{GsVxFx;^-t$AB_;%EH@CyJru??&5#w&ekt)AH>CU-1H3 znAH|S{6A?)4E+RTOSFx$vBK3&!uPlCUL{ZB{hLjCtE5IGv8I64KH%2rudL=iyb5o(~8_%6VIKpNl|WUq1MCIE?V z4xE%4i(bD*bgTSD1ks25k^SJ3SFTo*xUl45X2KS`y?U{cXMm5uz)Q9@m2Yu65V(-Rb$@f!uUi6 zlB`gxBu6;&vAo6N~Cj@SfB9HOp1oRA|aKQc(e^`s7|(2yWy^S6y3OQbx);H)Ev8jXWm z5#%p1#^wM}tD}X{0SSo!X-uupU=`SMbW_OU$tauAEFlW=Z0-RL3i7XjG+XWD04Fs( znKZ%HwxkZvr8+g5s}l=KLCqP-w&Iz&yM&%G2ep_e7j48S^$;b(ank1-!nNkq~dZCONwVCuF$)Ueot{Q zov88lMCRxyH63bxpx-7_Tv>Zv=O0(lD|t_iYRsMI4k?lKpS0JbxOjw2IEfUisR&fb zC4T>r;=&j)PCKVmm`;{X^EL9qzJE|*3g@;}D~`W*moe;ji8mf|Ni#5g0z-8kB(dc7 zksf~s?0ImD=0 znjN3t_zk=YF)F>ckU6_LhIJ(`KfB-WpT6$-AigJ>WvJ~xz$Eb^l6;e9w@P61rvnl}$=Y zE8iZ{uX48N_;`JR=>x1m8Hx(%XK_T3d5|=1g@3^?h44O%#P$01z@DK;5Cmj$hPXsA zDpw@jaK564FwW6rw8)Pi=}JhN)U-Jo&7)RYwWPOzxh)iUUsTS`Ik@XWol3`j71;-6 z7@|w$faRT22(i<^WaV=bVdqfQ(mJ^P(rl1GnHlXg;cM33&2>vQ$fXZtkVCg!YvGQa zcX)>F;{p%+X>6h7a1GT84Vs zoOK3KtL0D%y7W23(3}t4>Zx~hL_;1ly?H5M{S1AcL6-Q3@UMF1)#A71$qS@u$?;C& zjN(MvpC@yP7z8q*RLvGC)TR1P%acm4_ofo%EKV^gWbY#BUY3RxzwL?le(1!Ru+5kS z>qQ(HA+L8BR% z7&sOnZVofO)K^$(ASR9X%Ek0IKnUgOGjnj9jIb!Bawa3&$>Q&g!wZYPu9FSOEgZD~ zE3g=lFS)cn?%Oe(#|6$rol?sI^*rsJtM)Hga5-qFR5~pat(WZk=iYGo*RS>PUBmcF zA++L=1^z08gp`z)EWJy<^!sTnw&@~>fb;pRK z!eX?3;`7%{j`(B4>>s8&ZS6|mF_A}9c7G><2a>qFTIMGowFwkvFD^VI1Q$WSsuhC6 z{t(Y7X{-$|Zr}DVZs*I}v(ZN_ZBB^FW7#DfbKx>ABZ2Zi82II)5F4UX#|9}-=tJEM z_Jo^X)niBSj=RQ6iQ&lBlF!sBNCc$Tb(8O9lUGl24v zvZ7ga(Bk?RGN8QKK-mg`yqMe_!6%5eFrFB?L(Udf#++19<)k!!R&b#<;fb5FyHG%^ zGG>r%&fFZPX3c+EzbE9pDfBcE!Wk@snD!Sg8AV8Tt^nTHll}9Le+MVXyQ_vhI1o@K z5)csUf8R9!m(5bz&dkij@$bMaR@ZP^S4QVq);L%jS9B|eA}9vK9x2a=b3`IKJRb@s#BV4Y?wKF^s)%`xez#Z@rIU6iya;pwYgsyS}2moOac94h1RkUXhVUHP|{>9F^ zr;gplPOBw1x)(&96J-F>ggz`ESA7c_F9`*i^u3-dogdT`Sf&nj1$rEKlcOWgBgBTs zUeoCzONaWqi&^S!3QMg#vV17Dlv_i|QF}YpEbWhlW3(*PFsCY8M5>i0a`9N;)2vHW zrjlKclB*Q!^@${$w@K^aG}_GckB0Q>>Mc@4oZ2=F>)wWbi%V?GhegZRLSU%vL@QbA ztVv~6#}UBTH2Vrag`jm86t)xQQEZFvc;_lixUb>s358FwO_CQg}J( zxbxWxHj@iJ$Y4|4c^n}ZY7m)S34J^|+jYtbQE4LnEl6@y(ud6r*Yf^_exI7oBlQ&A z>7BZpzc_?qqh#jFXSC9nbkwL4l&mzInk+mukn5E3(RQ4sN6p9T<)mo4)pnt%VX}%{ zMX~t!8x3SuinwcHr{v{P_%itQ9L@VCwWL3iY>}Dg}ZvF^sTXfe#yU&bK!keJ3 zh1X2I^n#+Ry@;>{^9j0pZz`?vvK*s3jW;t=lcj>V#3zGgdP+}A1B0Jr(%!kH3W6G; z{l3O6eo@+KP#==~IV03jU<1_Cwljuqf|gg>-<0?OZBSKE7ua_S^lG^?SH03(r(|}9 zacV2qeD@xCCAIwzGjaGQG21B47V8K0n=$848=#C(7LZmJv@7xzT$(k( zWQ`cM7-f%rHa%nD(3IU<|4uDwqXSVFIpB<~!HlKl{dzmmZecZ&N)|&Iq#R!ls)p%B zJLTVa9NgsJkogMlfLlM_%Nh7E@Z>rN@ECZqp}4^~w6fIv{-p0(-U&IuA-;m&;{%n z@>=e6Nwa9+buO18-D)ZNCdw6J#0QN#k_DRha}V<4$1>cJ$AxYIA++H*c?hG|cvW!I z)|2@dhp#yzNzocwbkAwK;?_TyP($2RsR9i+zKd18gG549OiciS_dz~VUo>ufqAd|n zQ%IGLneQ8hu(eEUc*ZzFjXOCO8d=U(&wfWbtv|gkEXTd_wooptBeezCf(fb34kRog zI5794#2MinR*)a)#o<2L9$P0l*i#+vSJ@fS*wrsqGuYmwK4&$#)Fcvc2uv2}Vfu0$ zrq2KC!SAn%2T5_GS2zX`kPbHx&|l~KzbYvIS`GO7QU34Mi@y%#D$W+xPJiFHx-_A@ zwN)1Rj!hHT(mf>REizec)=In>B{-c8&c7!(&jpbt#!1fwlSrHDCRmsmrL<7sXNCc& z3R=Sa2+_(l1EiHG$!Ws?Kv&8eXb!0=Lxed_+nFS%McF4K%iFcrn_k;($2m?{9A8dX z+1$6+p}61toQ7n+vxmVA>G#1<-ym5x>7%e_Iy8c1uNV%~d@t)$^=+bX&&O!h3~SKo zgJ)`|mJi4_y->UXz#p7$C0A!n8)b$4g619FX)k-}(ln110=<_~l z<)hFYhlX~5Kzq{Eq5E(bXxJl$R^3p;Ywebv9FNd~x!v3Q;R%2VeJ>jTrwX}sgb}@g zz7l;w+PBTpg7UpEK(0pry~ms50mUbZx?$&ke=AAF9jc~rW9bcppl38}HRX;o;njs< zN58K{<4)8aZR3a%`RVGrF`2t<(C4<-LH%s&9UE{>GyHq^O=A&3z03v1jjwE{x@s(x z`q|(eQjVjS5W8u|1`yhTcUWw9JTmg^AjYs2?#A$?m3FmHJxvDi;*xS}1>+0-3=jmbAB6XDK1VHLM|4;^>^ zO6WUxjNT3yF72?`O(e8$IXd1D9n+#3^|Q)*1_s`~O3(CqQT=r6eZaOpNA3;-UTgQ5 z(Kh3L>(nz&&TA1y?%wZt?oXYPXI#GSnOMA={m}PkBtBp3VKZuX;Gc$lX1ArLfQbOU zf!s#*o}Cf8ms={PPtCsVy4p|GzGK9chbGsj7P~7qm-e@gcCOaz6T8ccGrKvx>gnOB z=_}kIi^~pfFYXxO4Lth?^V>(rA)e3tII^5D%R!^}WjIf^9Vj>s&pm~o=H?%y849yo zZD4&%xH0e?hW>rc9oUz<`2;lMxh>8BBvaFRhqu7BX?yX)*oh1-E>6rhuPmMD&1lL5v`cIBzBpoZSK{Xr?rZCpA!M!Ba`S}q~cG#o{n32br;CkEby zm>bOl`3_?32$L(UUJ<3I404B$?n9Z?2-)*QHgo*_NT+rlL0`EQ_oZB`*BI%z|ng zJwnvA(J}~}vtq9`T6!te%lbjYkc=ngxrcjw1ur*x8WOBa9O=nbSgh{fFB_T^IAwDj}44!Xlp4@4>yPf$&+| zptUpCpDRdnd$&jY+@ikSrcdLgXZT=wuPd%K_~|>Y4Z8Ztx< z)f5b)yDgz0%&c3@YafbyN~0*mrA(oPp9DWgQTXfRM1WANrb=eHd1=lFb(^F;mKdjY z`Tbf}@Qwg}2%;JxVtobDR73k1srsnbVyRIGWT)7~>e) zL5i$4coL#KhRc+TBq}mq?>T9^dczOi?^Mmmg85|l9AyMHb{T*C$;Lhy+>#tzRB0y* z)Tvem){CEwXma?YPL340#dx;dmDsUox$~#i^2m_Fu<)!J34(SQ3PkpOX;P%r40XiS zG1Kc3H4@D)H!*EGIC!z)n1B+$4z;z_dJVm;jKs17@Pq1IJd|1)+Ro;eSr`*&B#)f2 z7|)zJ7o6L*r%hX%7>*^{WVe8Xo+$3&t+qC+bj%j$Z(cZDDRPla%?efxEbl!nh_ttitZ74KxH`6o)Rg*izlj)t_0{uJ=ETeD1O^01OwmHWES_wOKmC7 zg_cKpOAr`_H48I8@OD~wmfSjl0^LxMBNtUqA`}muf(2<^Yo3+&R>u=9!<-XeseC*Iyxi4zWSI1JHfdYV6(c>u5feV8}T|qI*H{^qb{g%rX zra*qYV4zGYyQaK5_MB0uyHXPd1%NVzSyirFg-p1l08XMHein;LJ(K`MKd<0+|2N8t zus{F+YWIk3Mpmh1Jn$>mi`AlhmDQweW*Xv~qlbSyKOm%tnVB|wv~%Xy`u;tMr&X1A zFBP1eoE4%cdMZ}u?fUjQ)T+%tzkJbR`UW5)nL0K_S4~Gz%%k8*0*p79#U0Z{dKC_1 zRf5gU#7(`El^J3($_)hP#^lnWKXrzF?(lhBSy66);i=u~xhoDW?-EcV$(b4RW;EnS z?}-PC?M_gBVo|BM!-}eS3jwW);P+>I^*1ZKD?+NELMBo|iy)1Wp@NQ}&ZEjPRl0YR zs|JanspeM{2q#q-V$!OKq^HTYIT$LJ_lHEPFbGWwr}5kt#_yvsNFg0oq|qFe6$nlq zj&Q3epKZQWsQV>HsFy`h)`vZZ4=G!iG>989pJD7O_wUgt3@O%2BN5L)D@>g)-7H2_ zEsL-h^;_N0^>+w#0cao*;3@lSA~YH6%ZN}SJsSY(P&1V`gq>B8p_J1B$7uDEXqC4l zL1-Q+^AYNW5zTwnDp^F+DnlNI>6Fty%!rhaVU#GB!U;vHloaA{cHkW4>UF6V2f@*3 z%vFX&Szk$86aoSKNYNGMhWE_(g#y;9!Aec!hLMz-BAF49?muWzwN!r5a;}Keia1vk zNNE@CaaT!eID2d4_v6@;^*^-a%d=O!R5UF>h&Wdkhyj#-#WkMg#ZGBEDF^r8R`9cT zav|ma$WD3*5J2mCu7Gas6I1y`)I83O8mgpE-?aI3HHlkApOtG|bZa@+TMuUs{}SaB1nb3xjn zf}}qI_JV|L5b@p~Lh0oa)%#SDGc{FxAl3weG+bUVQE}m-a=@y#17j_jfpuuX;5+yd zzcYgCdw~`SiQQ_cS=7z2vn>>GsWcR}QX594;*bo`M6y#DV%gI~t3_EZ-}7_`q}-yk z&D-pb(ji>phise6iO5!}#Zhr6bYBMmq;!;~CSA(;C5V|eL}9sa>Cya(_ahktLMT#B zlVl*jPM*c9SyoN-n9@5#jR+5L^xV%iolg>%j^*o!hGupqRme+0z;@4GA??x)O;cZh$ZdFy59Mq8{oI*xI)(ly((Z*nlA7khfm z{g~Il3mc1&XdW#wYEgB(TOi@oV0~*K@M)cP7J0p-U^#gpp!=HCc65IyXxQrU7F*H~(Lhhk<%y6Gnz;;XeJvq^0da3(B zhPvwQuF8l0zVaN#L!w$l2uCoA$VL0-<} zW8k1k7jYAp`%~UZfuH1&Za%s_cg7`|`@0L5I~G@(589dslOVSy~kkz3$ud(5x z4NNFftEG@rivF@lLfob)J)C1yXNP7_pU?JbPl6J9#K%rl6He^jfy35bxa>*k#Z+>` zvvgHzvT)DhW^QhUm8CmTJyWvf9x`L85$c zMV2*8L*_>=t#qk zs`7{2mE$5-1K?dx4+8GbT1;_)+&{@shF?OdDZ?j{S*@+eXW+M==5g@2OYQ)kPPNE0 z^}0?@vFOzM>+i!PW=SCMB`>E4fb4>%62YgDWR_l{L?+mD?iiQ``h`!$@-gU~eXJkl3QjeD$ zpx|pnclM(^vYh+SI(cr=d>sEuZ~j0v3=CtUd=XCcRcp`lbnM6M7RzR;|9$}{@~kH8 z=#_kNyzDLGh;88eI3!a_m4Wsm#J1ky%`J^VE=Sz;a?tFoImySmfEv~2=FD*_y|J=! zap7oYU=#047C!5ZNjCnIM@l&olv`J3FWS;s^Iai^KQcaLjZ-Hm{B@g(<*8juqO;{l zlr5Z%h-qbYv!zji4DDSapZnL+v~S^qtIetHhP2Vdy}c5KB%yRm51Uxr;wo_H%Ae_*?J@8HW<1(exI(Xp$3+*RFc-3vFnWKeIfCYOh>Bii059< zN~4Xlz&aPw-kEkRot$)<0tVv4A$`jQ$?#52A^^#QqKh#!%%*fpyy!Cv=DR-_JTO1f zWG_*1So5fpNqHmZx6|m{fiY1$BODPn?sAc_G}eF?~WIfXc84 z6@?4dbM!JXQgg1f;%eZLT^Pl6qnkR04^`wszb&)%9(aNM{>^ba<8Axz7rw~eXRux{MQ;XRz;sv5XLgd9@E{fwSHcl6zsH7$6>#3<* zIa5L>%6DAOV#!TZ(@S_&5%GaCHs)1RmB6LRYRO9+>B+t>#+h14d`908Tl<&l1LcI! zd#AoXc-hl<>#bR$STN(5A`K}G5=n35kVXg=WQ!^P9zE&GG5?9r_NDnu&|Kyl`glY1 z%n;3OWZlDi4?4Bb^D$U=LQS6?gbBuJ)(LL{&0X0mr&l;d8Is#K1J}rD5eOabeC<%S z?tpqG@jKZXUkrJgQcFTB6H|Q(M1@&CGl)e(eO&-=TGTPXDZ&2gn|jV7k6rdDdsa_j zzccDm+u7LcIhZvU=utbv%8umxBALN{%iDa*hOjQk4VPfcvBcGOV(Pp9#j{v{9UoG_ zNBZC=mNpQbAB-+>k{1+hXlfr!Z7=iebDGrWir?zYA^@n&Vxd-zM@_yG(R%)@qhqB#YfziPa#_H=#~;}*l|b3XCe(rGkY+F#w9e@wW=fd zhPNXSdBs%FQX3^?O?Wf^#OQ2TGXbO&A*kt)RrPqVA~fUY9`Qz%UcKVg2z_uHVM^mE zKQeTG2NY|eb!vM`=O+(Ezw3%WyX}4}Ll3S7_5Xnz=o&K<15!$iy9uxo z&uTOPuL%ZQm}Z~uzm+iWmKOZV6Q5J#T2`+%MrAjBWFcK^Fwj<%GRa%s(F0G+goU9k zDcWa-W$(zTT6ILMdOSd)NtEcqfQHJHtOxu4i_2(mD5S&byvSg1=%(E{T#(ZGGn=&l z4O&)^1f!nc@(Fx`Dwxw0Kz1BI4KgbzdSOkLc5R48x2CRf)B&?FetPpfl0WMVxZ~Be zE=NUxocG|s*G{$Lj@&M}@JndM&;^Bd4UFKCkKr!0W+|45)ZcnHM!Ts1Z_4Nuif78HIz4I(bVw*m-eWSTM%qSbJ+kLK`D+A|^_p zClZ`iOx>)49^z?2BZOsmNx6l1ged{pPsnmQJ7HlM;qFbr0JJWTFoESduL(G-*2Dykur+Zp z$#lJ){W3dZQv`wRh0Q78^|@%5v1HZ1m}A)psLgM!k}iTMlGrv zRUwn*8rNn?iB)z%mk~C%s>K&E(*NP0P9dtF2tdx-qqGmV z+97nX;S^Y?0wShT4n;j_5$i>oj~vW`X-o( z5YMLwEf@Q2GAGN>H{_GI4Y@ar_r5-~UjCiq&3}u$FPYI+OLI)j>#yIkG_32azD< zFNkZfU>yqdFEstE%3Tdh>r)qnsx({=H_=#S);DafDoeeN)5dBg$cpzTnG-+fPMKfW zUiFMQKRR_(2m$!`^lLsNzu!BrZ=dwOULKf$w)-J$R)SF|HlnVZ41md632KcPgDIpd zUnm}*ZMkF%^F)VGyF-~MVy0aaKi)3gk$*UATZ@rRqMGU#%LgdOYBa0a4q#j3q&iQ+ zG=(_1&brn1et68#nc;B3;$TdA=%!UaZ!H#Ab;&z4lrGerpcVCye`FoE&q3SF;1GNv ztv3%a__NJxAS{?-;)6z^pdK7!GeHuUhPLb|Zwu@tG@Lp4_e}vPW|7J9GU}?I)cI4@id9si-sV0$ z)+gE-VN)9xXI&ebhAUpXod+)JE!7{nalo z-)79+H%F~@oF{K<2K^Z(;`vQctc~xACCFlIMKwMX+RROH=4s4I&1fBn6zwL14Gx=N zDRZ!9kNrbNK)Vjab7fPDl2wdX_o>WP)XQhfz#WVuQGmmP^Qs76!DR-^z6Z=p-_wq0 zr%|N)G$SfN_0VlztPoX6_ek$8JgZ2lCK>t1fK9{bF18*pXcbRiS`qixF-AbKUunkt zSh4j`3~|zxfKd8Fk%aBv*G0qxfVE-*;Bx$-Y46!%sZhl?Gc$8CFlW%bd_3AD&$jHR ze^(r~>1vK8(LRb={t5lI%QHBzyfa!Pc+E~l3<(HduM)U#7~bh~y?^O#l)u?6_A1^k z0eHThs^NXWv?}*@@DEOx&XwRoaNmI3GxxFH33n0vu3rO;HLRjzvg5*@dUKu4-y)tmb=f^bm_V?h>S$13S-2xVJ z2c=}@E2PQ?U5?txSDVxb=MECn%IPMj4-w2%LA*xJ2k)31wnGe>Fu%H4sHdv)3T$vH zQrAkHIN{y>Kj9Wa!jdMvGAs2zvYWHzUtPe`ot5CIIxS;`heK)Xw>@w8D9xrSP$<8Z zVoEdL_m-rGNoj=W!7OyFlCjPOaMnD#l1J)R*D$QkeI0jZEcT(+?6PqWI?tD^&3LWQ zzN_kos>OGg2aq5CVk&RH8>-%jb5A!n)!Tv>JQe-iYU3r5o25?v6r;2E#EB(E4Y#RQ z{Dn%@f`h9{aHcpp`yfilPMgMn00wIp6UZ|jv1UNHITNzdv)ew3m8hY~tV4AaO$%O9 zZAU z@yzpSyhDI(V#^k=9d_Pz;y&a(-6<+^HWbfnR+sW z)l%C-?HBsDZC2oPt=K6E{fW1S`H$!jK>~$-20t+zV_xkvCM(b8^k!ot3_1f~y!_0I z4#Lfwe!Pw5i~0b#5&(F=?L{n}-DCoJZlDIq#GT1dehN)6YVNn;_O$4TWrnzCX^MLB z-XolhA;e2ZZTZ4^Er>?jV+=3M_Li=|Ym0@3Gz#JQ`1~fKloCF=7Q>qQiLA2*b}>(D zsLte|o;iXv)hA)|E!Ki}+QMM7EAhQRx-fTxx%KFTUKEg;Ul{5D6o_7+HK2XXzej~V z7tcf4-LKoS3E2eVjXUVWVviTL1o>$xoExEh6~T5M*5H{aLf{#OH&!1;Cq6&^+uYFl z=K7>F#0#8H>^N{tD{=W3NnI39sHUf;>rU>qA=ftHJ+Eehk(;&M_-v){$>ZoC1LgI>34OPWw`(C50x|-c zV4+K+*tu!!9^_BVFR@V$;cVz~8|ZR^cu8jq%2g`^2igJaSE+C#a^awJ-UE$Yg{Pb%}p(c6`z1dz@u=l>7Dhiq(r_oy-t@F5)iY z%@JHXKDsB0fw4io%iNvQPvf-3n!%+6u=4GuFhYAIT#9&3F(8NnlY6MyP`E1{h^9Zl zp;?ScVhCJEoRb19h3W$Eh@oP;f|%C@dAak_LXxt@Bwe{&LSEeFxD(IBw&WPM88UQM z56=851*8mQhy`nztO3z#eFFN4zhR1X*N}7*N4S~oleiISYRTZaUs|5ES?VyU4b*6&7Qovbq?L zy(m}en&bc2$v}1&b zP%9l0vU}uZ-iTq2D?#FWRIQs{-FveWXBnFvT<$aDeZ`g5M?J8S#)_j%f36R*9q%Ju z3V%eeHCPe|;XYb-_pOOkva@*Vw^wagGpxq)2E{Ut$pX}}-N+*ZIr2F11*M3N`}JfV z@2Lp`#RSE2w>Ppm!D)Yc%OtW65?umg1P7W$tBIhPbpTJ#=9Q&W2OJ*;;~j|*{R)3= z>nm}_;c$@48GxVejJa!2V-2x7wkTpXndkT-9is43_4Ezu<0BF|!nwN&$A3|m=-&I5 zrD5jBU9xtwebD*qWY8dP7iin5Yv zcL*OXis;1E^3tS~$&9#kN$e7hLgdllJOi)fvR)6-wfffV)L~_3T4Q%39yJKFBM(18 zc{roxwhpjl9lh`+x^shcGwS<_cXt-+`>2cpvv+qM>-*HImz%%7{d>}iyOZ=(`Uj;? ze;Vz7MC;%3RRI@g^FIO<3nK$(yZ@oknnW|e2k;|`e31he1P6zUA!4>R)iu;J{t`E9 zO@O1;&}f7gtu@{K#+`&j3GK@?Hj(+&)AJjm7c&uP9|*~S(u!7jh%>PYa>8A2JQP(_ zwM~5Wlydt)!jUwnZ7(t5NHT3iVw*s?yjrKkb&Yu_vaoSxxdp4ycJUL@@Z8aWxl!SF zzvlPWB~+hW`g2wIR7H~u6iARJ4EG=c?z}dlXE*{-8nI`He;=}B!yL>X-5XHdAITf@ ze;l&7v$Or*hW+;>UGR@)&FPOI%>IA4!^#>;N(`vH0;~d0BH#OTB4N~mG4R|4XY-}= zVQD4-JVC4v;B!T!ZD8*fyw4ziir!=vaW*xD%UttskED9tjYsd#FPB_EogqWC?u%eB zpzX1MXf}&%B=spYc=JTjfN@RbhKz}|IcFS7dRArmC5*H@6d7??_a0r^mP;%l6MWxoU(pkDeriDXC}`tWAsIA(@Q znTZN;;(B;f=d^3vu2%q!R5^9CwghoZF4f~I1}dJz9tqLbIA&^95wcF-l6$Udhtwo> zdG=kpg!SaC)-kwc4P=bov|O&6+YPpm1#s>hce~{D#vm2L;T#HUSrJQ!DPL*&qqZu~ z%(UThD^$+RgySTudov~d8<&MB8=(3tw4T810_R7Hg_Gv#g4UTct$m~Vh0}L8Sgque zK}t~YX;ZL8b$V;f)`XEdwWOq~y|v~jo+@Ol1e7H@+7@aXrb6NQWD7PHXp;*H8Yv(m zxcD>^=gP55D9#uok*{4(Z9~)gm1`x`ee)(@GDiQQjaN_bYz4lPbRNZ5db;|kw}nNo zf<^lgk1?9k0zVmT{RY$hSzJK#uzB(+@>j$|UtJ3_*T^P5+LO(Pu?Q%hAu#=f-q z3nHPpj#M9o?isvMd1jGQTTc|oW-h!1zg|lc@(S2nXNo!B4CF;An%^=Op(IC2F(yy- z)<~pZ{7ezj@uocq{g>Tc+Gb&Xmd_v=bwFj9Ol2R z6o0`+)WX`?#L-E>*uehJ_um0it*WCm&yU)r6(?AJN01kQk8f%5YX^c7+OV2_$Cc6sqPHi(0o~Mj7;h)mv9p81!a^wl0cP8ejq&~sEj$NsS7vbk(s6UNw@0%$e)jQnjwu5H^_eRB zk2U{+*qCM)0{EpglCphMnGc}jWzbi^z*AbamdIg|->kPnDi6Evq!Z!1}3v*!R z!YpN4Ex%=c+NMDm5pcO@h(85ub5j;utrrl7EsQ5IN_$G$)F2k{p|WvC*-7I%D5q1H zf5qKoN#^2*&RNo<4vZT3{l;vy&8ER!cgqR|BfGd?Vb&p8SuoXvY9jVRRgl!U6y#Tos6gQ@s=+bzu ziy5_>REhkzd=bA%q978IS9w`rRH#h}Z#?2LlW-_G`hawSSQKPr%w=uNb*7%dKyE%7 z>hXs!V^uVhJy2x8+cql3k4f^m1i>du@AMvobQ+z#bLHIl8!m*mHetC!c+nlV>h zJ6`%IoE+z`eUA9V>;^9=uh3;66cSw**a$cbJpfj9*Gv2ZG1LcrP7txSOh3y>Vk^iB zSizGU246xD=mYXet=+B%TRQZRKgIi`Gf0FVJb=XiW`ddcT!AU2$dvHB-vRO36+fgN z$mf&^|8$aKaL%c8)*(QO0T8o~@4V*@GLi}D1tTDe1gt+N6=)zrSW672pq4;hVlHaQ zOofg!z>zZ@$8=IPK(=tl?%Wp?fOFgLz2Xk{U1kKByY85Mq741zYTudS>=ZmIEf#5@ zK@4qJ9W)Ap0KK(d6M-m@FI_-31OEtBc+N{bus0AXhaE4?9b(G1f^%N`u`#Zqw14ae z$XMwBN-7A-bqJX$2#Oius197b7hTr75dMqL##bF%(QF7eSYrftbP?`wfF=Sy9UDI) z9`M)t0zPg((bs_=rv(in7u-l4lAsdeoh2@ArO`9-MwFbtDL0(l0tiZOFxg!1AehNp z@lrkOQde(DAPtu8>ju*}7V!(1nrq#q^M~JactmyK7%!jpJmuq(oWb2S(kg%(~%k8k?xG=W)vgWCpc62yy z4ac!>HHTbX8yT9}-AXhgNWn4J{{Hj>TJ444vB5E=>zz6+xa=k=mDSmGRmtdm&Y_5s zx~)LeSmrkk^|Q->M8sDiOQ~@n9lTBUNnJSFOqCT~dzzL@V9o%7}OB-Z#;O9+@edA&?7YP_IF_a4Ax)rUVo-i z^3*@#^fHk@65szAtiQ3mg-uKiT&$h{m%QWetLG)BhqvaFfwGE zG%}%+g_mAemFQWu%+7HFJeD~(j9Is1KK79rVckc0y3#^o?SX6`zkNp z;d=BYrf6+z_K!SmZS|9|&^EH6hPTC_w~{wqx9GcCz8!5q|FUcHD$+yo>jBT)NA_Z$)}ty656t z)8RiD_-_9o8jO#AyXA*p+7ST5)0gELof2~OPE+#@GQ&MQs>jZXjCHyX3gDae*Y#eA zk-NL6u+1?&$-Vguh34O3+VD!TcumL2b?P-$^~>eb_e0y^@y^No@%$(P_H)9*J! zfb;Xz@As{m>$}T0im_|=*Wa%1Lad)iUxRc%r-#*UR3JXVzQ${7Z_l@}pWWU=1HPPl zO`bUsditg^!Sn}O)9c&-9%_AG4!tbTy71kxc&KqpJOi+=abwS6H8m4G*j6y!>Xc%UzbB4aJYCh%{#tpmY>Jl z6CYfPjhb8P1j^4Ag|=G__}2ulTV_67+0rzj=2zJWeVi>`g;eJ>Kb~*WShcYJ$y3=q zDm#j+9R^BXORA@ELA68a^92w>h_>{N6WI_K&F7C^m7vBqk4W=K-K6%HN`_NdY^+*q zEVXrd>dT|+HZXvS{piyLmRXl-EjQ{G_igQ>{AV8|m~|%S;jGwNva*;X0OKffDJl;_@TbEmFerzi`=ix!`eYTvUvg$b=GUBmw9#jVsAfMvIdBI*` z2+bdpshU6ae&#JP0ZW9v4CdheXUZX93Ue}p(xZe%+l z`4A|RY~%+Cw9F3gr7q_ESwt7Z#RO-24~e)deR2mus7a1(B*wX0_f#tjdiVjm>nY^? z|8Vw>L6){l)^L|?+qP}nwr#u1wr$(C(Pi7VtGc@Ct7p#49K@WNH@+V`Hh$f)BiFSu z^UAdnIw+hs`*H-$;^D=@GYK@}BO9Q)AN}#7|MgW^D4o^ZfTu2-f<~^j6gOrl&%CpI z3!r-t3!mle{QfsL&$h4Pbn`a;m0;u|%bSa8#MtyYu2B`MA^&oXM6B2(>a&MiTi|Ed z4wgA#39Ci_wKyC@NXUxiwk*xzU9L=&!dZ7d8RjL6ZmA~_fRBD)e)b+~H_IWJ2}2TI zzk#_>-wnx=`~X6Cuik~RgXB`Q=!d`NehM9?;qp=f;3Go%)4hN%NuEbw)oWE~Wv5n~n}nr)e>s>einB%dvU7STP@h$VK6%livmrj=w)7f1Uq;_N9s>I(Ad=8~! z>bdHNu+L&dO~J=kM9_-~$C_AfuT8#6nk~L`mFlcE8+fdzS?FL#ZUN&-iQ|N1`|r*2 zL$&pVnY-a}LmAzF5->$pk>kVTny2JCy0Gu29lXvQIuGixZ`ixdf4}nVE41}ExOX^o zHoLYqN4Jk26fIX{C5ja?&t18;s@V$Gz06Vy*x^wG(9927HtSQLX^0UQA(2=c8C!4` zR&Qd=4P1=-SsYr8{g%c7eG55pEIi%8203lF3F z?2Y-OcfR_n^XR97G3i|-f?yM+h18!adtXS>VXJd=(wz}`lws46FA=>VVK37m`y#q_ zN=3no)fq$jI%pGq_w7nUGHjvL(HyqHNlWm94IpR%aFy~~SmUi(KtQrQ4i}3%DFqvr zF$h{gM)IDX{Rt}_*j$8xES0fgKT;s22+UXl^s!Dg z7acj7bTyVs+$*HuPf{`Q_Wi)hu>IMx4$hH%^ln2(f#|L(OAh~}u##{N;XR51e^&lb zJckm;wtmF3a#|!J6HjmkZAp^ zJl^hP$nnK!<8;I0fTnC#y08Gx#_6ed1u0Er6;nlcRZqCYQdJWaaj6Q3^=WyzsV6|R zENi5>{~Q{spvyW7b)qEe_|iCr?oyg%LdJni0m!-75rL9njF~g3Vy@}A`F$+J-5?f* zvVrxl!-^m#P}EKW)(ZknLzahfiw`vABX-(EV@OS|mbrZMRfN`;Izq_sEdV<`vC`Jf zrkeY=q>xfKff5QSG2_>t9uef2-4onF7$~U9n4!21N)_Q~i=Y#+L^EwuX!HpH_UQM_ ziqYlEdk5OQcqI4aVjSX-Ro zw-D*5g|Z64N=apglyuzV1GQ!Q=m@!z(<92StlpuUeu20!&MBZz;uicbt|=3Tl}(Y) zn)wk%!_M0!N!0F}Z(Mkd%E7sV58$*?RUz)F*R#6S4@qUHB(hyU=nzFSBKr<)_I>yT zhSytKo>&rASU?+56iOm63`v!AY6j@`)QXhL%h_RugXgP6JRhg+ZBx>cLl+!T7_?BF zgh6!jWE7uA_AgjjR)T&3_l7j(r>@j0@2%W6K)&>KQ(gxDR&K)sRapi5t-}5TOvU{N zuJRs%yLzzLt^x{f;HZjw09j5Dm+~H>3gt(d=PfdK^?<=V^eY6mq5(K4ib8b+rgkL# zP1#Z$^4ibTI7)6Xx5`_k?Gp^!oTFniVUUjYkB-|1;4){PsM{t9I9DdF;|hA|6SQXa zyoiH3d6b7ZY$1tvdKr|5VL%n?A?gu5VVJJsedl>x1v1oyA}U=mzRkDT)-T%eYc6 zlN(l3ZW?A&%A(33pT^)=mltR>l@%mk`H2AXpYg+K*q{Aep$os57b-5{36>)2C|b{R z4~lhK+l*AH$F-?o7qONP4)wBeXH;NlAre#XVi>y)SxG@KvTkiJE{4H=PCC~q*3tF* z`ICg+H??x|gXN7byZiZggF zB_~59Ysx|~Kzc%*IOs=w&U{PAQ}Nvmu!kX$MPN!Ou8MQGt;!>~ALmeX<+><5O1%t9 zH(?*TPXvDPtVl26w4#W3T)c>|GRlUB@lP?=xTY$(CWcik;%syjGGc8EJIIFC#$k>M zcD1ZjvL12RhYxORm0^&5sfspvZw(YZ1hnBQ-HNLaauE|B&3VEFWCsQgPKR(EZxxi( zh}!af#(lPwKD+OyXF@oRoo}mi#%UJFFu%(*h~1Nw)=|DwFAAnp8%EimAa1o2ra6=! zNhbED4WE%)p9Nn;yxEHP%DmscOOAm*j$(?F@@i1&8Edq!eL+%_exX9 zcT;3$MifaT!ERTDAB@&vyW8ZWdx9d#w%ep2BVi#zZVy)s6kr;SuT_xcC_sV9+G#yS zkZZ~Tx(Fypl3a9k`JD!NJV5I2I8K}YFfNX$q-H$i~c=N4;VmOB&_0nmf*?Lm%!36H9%+yy&~Vf=Ht(gg9|19S`|8;=ZT^#GNgq6SMDFaa z!$tIoI`e1e$JV^Ka$~~s;mw0sl(H)7?3A0BTL6!&MDg(^ zB`$8c)NUn#4-&OF4b2b5I6;gnVJ;^uDRwBgAtXIot%YmoTRahDcu#K-gV5#QC*BpB zB=qdz)m|f2el zyF~w^d@0{4%pM?cRHWD7En@L*vvv(59mWrzl> z+=c2VPud5I*82@=b^Q$%#0ucaCS#Uz%frozX6LF^8xqV!(C!RQN4uWa`(V14I{JsZ zT;;q0E3@q*^YXVcl^|TTk$)7qg-ntCelYXAunZ^Bx3UMM+-+7949N&lM){)rW#ADi9?2e!D1=!FAz{3y^CeX;I0cv?y@5t%@;Q8@>ed2~wkA zj#KF-UwfK81{>Likrp^o4!e*pXuP~!XLHA7a%N=f_@pw(=8#VN7oHHwA8QqamCAik zhr|dQZOOLu3;EWvHUJ*V7JaIETVn)2`_ApkCDw5|xL=w>8z>uWrFMrh2(9sZ3&{(U zsmn~^%4tyODCUFw14p1mBA{`w@qV@UZ=}&Qqa)SWJRAJ|#i52p#S-n+92W3a!Wj-6 zo3A^3%@DpB$ve`1fFj<3%tqQxBr1m0yLr&(yR7`Lpwgj;pDlp=GdBY-=GJgeAXRxU zH-k8LFI;DTz#wki=6=H|ZTkVcjqacc0r*+x`2zUa#m)RSh|8gREA;nZEX4-D?wyt#4qRBwSn-nWRPW6};#T)E>Up?wNS1^0R(``bxp~0)5J~#__GT;sI|m zLhs|A6Mf{YQ+onx3(xxfR5 za+PxV1e2HCp`&S()7ztOau_I$2s-e83N22K~5oopCv| zCq)A4r_|n%lF$7GB(kLs6!MU$bPgR^(*o?iaK@ck!HW(kb91uxC@63Ph-!0(0_x|K z1xU0;Tn!QwxMz^cyU8ajns7C#vB(D3F& zlrp7V9*}LdzUn@(qWv$0T_F%&#a*MKR=LwJrA(RWo|s3l-Kl0DK&8_sqB^sTm{X>A zz9{{UY+p{|#=;?yn1dk_4KRZ@R5R83>Lz$q2lS<`D>DY=jtVx_Wns-E~q_cSs#hSzut+kmui4b(9w zrT9qd_;g1g4-Nq)AB~!FPqXsxqDN_8N9346Y-d36$RTm$MNJz^jdQId z{Y7#J5~8Oq&*}rNdgE`gu!drqT2D6R_C4me{KzcuJ@;aO%=^|L6*iOU2xrXQ=LFw2?a*r%^SX@3(81{-L!j_HxfAp@=%&x3sY!*_`B0-Z@?$jSuRR(#AoGN zZJpO{WlD7-%;0PTM2YsxPZ}-@<7$qExX)O#V89^B%GqH*qf1j+qI_8H~uP%>WQj%y)#Buj9j<8Zce`j)EN zUNOz;1cQdbjTXU9)T(uNcD7R}xMckeo#rG8XlC#@)t&hc=eA=9ukL?**+t|T8U6KG z$Iw<532w!Cie)!=SH=IN3)NXLmCG{)W>faFt7`z0DX=$lFgTAy@()K6z|r|zxKm8^ zPv&FR28p=CWCg7V0O>+i-h!IZRJ83>!Kvw6$fAh%o}l&ug{{zD?%|FRSzni*O~5lx8%fi7}1^W0b_)c z<@!+ygwCCx{hUa_&m{Arf;NEmJdpmo-wJ47(qNMJ7Dj;VL39I72e9Hrh)uC?l|LId z2vt(>1H97!z@>#?*t}cHT6V)1oPJh$AiJ&sdJjN?f?Sj zHiXhGZJNK^pmi4->Ms1^p00Y-OMf`Bcx}H=9qx+|9qvzZ+#sr3fi_6I@KCnMaYWr= zjwVC8Y6bsf#)dA=>4Hibf+>7OZFQ4lN+^B{#k%j}6TAV!wmzevZje4SF^Mxm$Z}Pa z^PbmV8{~xcJ?to`**%M*m2N(ys>r2ETgZM{hTf^R3(X8K51wcG)Nutq=!{QL(*vH> zjv@?p@Htec9QWM8eiw-zB{wMjmAUN}o_fd(Njl$lNNDaZh$_=O9gT^~doYfj63pP| zeIX7*FE=okSce&0KSxqP&Sd+kN71_;bI45YZ=mrK*m5U)w@l0DlSX>FII(ihA9{ch z8Fa)b8vTQMtRXK0Y9YG?V*2`Y+F2*7V5!jkYDXKzEk3s_o&>L(f%X_XaE&2*_o0;) zp}P^kR7QT;lbBfRnVIU4l(nzR)6S!-mXW0!tXMm&hwQC~>aZy0KM&HXvcKRnV@}y} z^RHF)U$)uk@g;EB9B?D%hH85QNZyJt?w{mC>k)!}#XFzR%*NF6ll4fx|50Oy(hG#T zwJXx|E7kb~VB5X8wed!}&f~H}{{n&A?Yu?r0SmqLafjvmnR-VQvByU$_eNp5XGXNg zY7tFP#pn)masX&p4&@sQ<$%EO#9&TLQ$@UoM|f3JXg`KJLjhfOAOn*Pot``32?C1D zo!`cKqNHBLPe(S*sx3ITaN4<B`>>47rrXo%dvgtA6S6pw*XLkhXPs|f`eBd0TDA>og; zl0HV30hdXL_Ahzo)JFt0eB_y zmq|++GK#7MSx@Fb6{Ur(P@NZX&`Ad3ZZ84WP6_+2_N*ScV=~{CE-j9+2q!9(?>i=Kuel zl`qTRuKWJU$~O=J0R;h>Ij9dZ3{uz@09YoD5LxxDC5S*n+im|E_~>t*p_29g;2FAC zfZE@udL=El;+)ImbA11FQabbFnh;A6IGmpOF$6)3QCLO~{m(2>Td+SkC&MX=5T&gc z{6Jj<7v(j>;$*>@>y}|#HiE1`t2718HEM92=Qu)bi_3$@`20f3xJ^4@3b&f(D(j4t z(y9@1F5|bGFVkjpE~&r_r4T*MGKUbe(Ykm2hj%m=)kua&j=Ja}jMb98v|ZN;v}X`T z6Uf9~5zU|r2h2?tV3$?es~FC8O3>9k87zoXW_>s`1P8ff_JQ?s*2dP|#Z}d-vbU~_P}6svRDIsFV}d_rQJroEZ5TzcG3@~Q`~-r!~~}AVTrCKY}0CT zLKk2Ik--|WtL@(7>71cjkSvFaNI^|24Hd;m&>rCp|QmnGe({%LMRUcr-*(DRh>c=ADQXriQSvc!Wk& zalRLt0}g65keXk55QcBV>4$H}mU*4XMJQ;=CFT{`$6TgNFf%8D?A*^QDA)s3dyQ`s z{s?}LAM&ch0dCO!!tKW)?<_M@zuX9(xW!BzGuM9&m^HsOq+jcdwEtn}>+_HY#OutZ z9FW5w$QWM67>xcTVS+h00ewx;$Xg8TPj)8L6((hja0$?kpe>3OZ`t=l2mea=52eRU z-Zhw}igVfNhb%70%15zl{>F{nF6onir@ue$4$`Q{xskDm{2Q}pV=Y)<@4rksF8=(b zrTabh=MM7Y$G7L&|7p1PKge?!h#CG9pvpFK-(K6kEi~F**y@pVs{wh{>u5(m5SS4W zh44kJ7S!i&MqL(aIBYMrZ~?xOC6-RXzKg#Jb~hVIqj}(sqRvLA8Sa^>%gsNZ4-aTR zbuLTt3}nO*;S^`@>|s5S71f7{vQtJebIi#Zrz&c0p)xTgp-1X39B=ySy>ov)CV3F9vznJ1;fxLyR^RTY=?_>X_hy7+jRwX?@WR z!qbJMa=Wv!k}pw=L=>fxKKa)aka=$A&zX`(rQX5SF?`cl06Oyx&=>M73uBZBLfe&n z?75xO#wFzvQ)Lr$K5`d3>t=MkqtAU@Y)~zYqNPD}54*(sYn?M^7Hxy!W9}%RIq~>< zsnhA)WOA+k(M_07IK73Y8APBu3fp)O6F)(q2!4YgtLL}_RBNcV%n*@s%_i6dk?xy6 z@Zjz2=oH(OZu|uS^E2w&YA1vLrZ~P>PNy(;U@`eIZo^#8AmbH8gkJxjvBn6FbtdC8 z^pB?g=YKG}{YzHH-<7&<_f0DY|2M7tJ6YL(JH*@AA&J5JvYs5)`9P2sbpeyp0N3G+ zA&5IjDeCU;jtsjhA`&$3(4Ith*R?laFH^ix{E;s|zc`U>Vpgtro!Z&eQ$C-(E2Us;#Qb_M>Vy-YGk8pIE z;j&pH&x;@UVBxK%nWE3iAVlk!q*avF?Mdc0A1WwOT(t;384sdZ(VWp@x@gec*=L7} zpa5^K2!fFMiUJGn7?K;q0mgZa#gSKVnz3sm0Ms_GsJgdZR*N@4t0moxhw73~c}}L$ z2VrC}8U%@)i6E37MFUy$vWk2pQekC?!L_N8om#Km*1Md(#d?g{mxG<_MChS;8nqvY z(+3JjdmFec_c7El3VEtj%vf;!%01myFK$UH))5PAE`n$|Z{A1RNFzv*DnM}Wz)=Kb zY}|;dj8Lo%D|Np*bCcsyLYRPQTgI|ofI3eIt&w|s*(zD4am&Glb6->x7%H`sakdk= zRFtZ~dG8{YW{`amzZxR4+bT@hhVm{aL}0GaW>eW3355=|#u+refF>hf%@=#>Fjo%pvjGMs`f3Mru*ZQ3;br*%q*;jpE{ADHLZ#F9j~9BT&ZZQq`AK6;egNoXf!wfW^~meCJm-!DKYCe%5v#jslHr1{XWKfW%g0uOdXp;SiY+X zl0*m{y`*Hs9>_c!5*bpeoXtS}?Vw&QG!&KT9jmos?|{OERg~t=F7$Z76V0{yPQJMh zUgPA#Gzjsx?XLt8C>QsMeF!{suS8a{^W&aQ18n{cTvn^W8v6^^+HVJ5-X{?4s3Q_% z3DVO8>$+%?&;#O72`u3gwxCRODdJDizfXew1!FNsg8-Xv7+Zf&o&O)%;lG3Ne`SZN z7qVF2`j`+FYiqh7_zY6!GZKPm8$c{ar%c6!#i8J3S910Eb-zhZLpjDv^-d#9++sO- zm5TKe$;<>v6~7afd(>o4jz&;v8foa1u9K;|c5f%!i`1{KS0H{|Jz|Eaa%9nO5IZAk zOcm+(vuq|Kn>w&WTeankcx=+gX0qN}6y5np!`XNb(HCJ6W^@hMcNYzGPz5h1h`|&$ zZ9p$2%BWSb6?a;%R%jmWfxbSVd z_xog26gCw{n}oc5I`OsJJ&j10Y^I>j>&$aM8tyF(9vIl`@vZ9+@tjNb19h*A`~NP6 zuT)cMr3)Da8@V=dTU1Gkd0OXV(B>NZ1?YF$T*R8)y~#j0)ELTI@K))xwZz}FC~MYG zEQ-cBrE%w!S=@QgOGD|``XFb4ZZ^KUy16eg{-)42lH#Tt@ zF0IaYh@-&cf^4%sr$GM?cHyMLA$Nj1lvy|ta3?#OeGE6cccXjgJj2fyan1n$UWfh= zlYoz2QggM*kc&god zC!Oi{(Z+AMAGCSsqq3_IX=(KKoc`zy5Di%hDUG1h!}0xZw%X#mgtQoG%yCAi2`+5d z>H6ZS!t#wgYLc;`E(Aqe;6vvbS2fJszgrZc23|ZwItJ7nlxl7!xC67#iS3=k1?a*k z%}%M>d2{V*l0528lXx14r3&`lrDS(2d^XCcenS6gv`PqdYg6i`D60cUpCT-Vfy_Y) z$>J{I>SMU~Vl`~KSvj|gh5>HGA8YAIeBIIt@?(G60SK$Jh+`3gL>ibUN);(tS(Z+Xx;e(q$-GI z>4T4w;gMRr)bXoi!Myd`V4!&bE5h7dKY~DaTVE0_nUc~x9Aplf@}r~jqG&@m~ett**n(=bGppX=@ZNmPxrq*>(5gM$EFyQ=_)CFio zT6+{GWYbR?fADpu4E0Zg`TG*K}@M$p%tpEwASsP-2!fm zygfDgO;g>8o>Dlod_AN?_`-qogz3dD@P+YH`_{xy;0__Hf?m)h7pC4P-81>k#{}S;XaUa|!H`_%JQpL3YV3-@0F|Yq*iro{rN$ z>xI97W5mqSMV)oJ2h80fRADFvHqR|H4&99><;_sYqT|f!QVpr4jV_Hpxc-@PL3E2M zY`-f$i0_I|<^KV#|3k$m{tZ|GHv>nLzs9l^O`PoQY@JMmO^ob}|6ACir1KYoc@}7O z$RqJlKPUqrpMi{{85j_Zh(Q)eLHHuLZ}l0e6R*cy-LkU*pK?#}ZiCT~phv*;WIlw> zBk!&ikNU~Qr%0K;MJir5?Jv{bpPzd~KR4=r$Mp-NlG45yV5>E>MU1azF*^Jb_9rOR z!I0V3Z&QI&UU)8A&I#MZpLHz@$c~}W$~WVS*pr-vx0EWA-2FW;$9Q`(_Eqy(+%sxl z>YnhUS+lxnLSH!mrk`FtwMX5ybvamb?*ca)dIc!dt5SP>^%@tm-ZaEp}wrbbxh z;x;^Npf7ePz@9wCu+B0`M1>nyBw#gG4&UzH4x{WwNNEMqS%`_aID0$FVm^ z09>mKC4>>|BHHIMg?hc*`{X%W=*F$gudQkC>Ne)BiOi|QxZ~>Mzl693e5A-d{7(6HOP(DhoXWn(wgm2Ptb8cPg0mx#gbn$M}PUP@V9oXcBc)>YEfj& z3!I|aRD7^UUn`c+DTx*PRTPV@FcB4=?|%%`*YwSt7PCmt{$@QZZ_LkkM+{QTvna?_ zjjS@GpB4IDe*ef-=jdxav?_LPGk_H~6JPQK<qT5sqb=AWZ8pU18Mi!T58Z4%3Od0?V7YLG~b z@UXc+`CegUdt5Z~IgtTUXsXnnnK7DNWyTPxao(7PCbRGq0`8zixPK0C$gB;@hws4l z`j%qQ{M!Kk2T7Kaor|N9$=`Yy!7;yN2l$bLXMQM($Y{U)=zwRPo)>Y8Ll>tfy$3Gd z{ERawnchrT7IWGIdX*oskRpUay57$^Jmz}Yyvd!R`ytl`Ne^jHVV`{%G2S!hB@qMi zd|+Z*M0%`g8oy26z{rXfVKSmU)}9K4_32+v#zMhy;k|uiD$1mSEt@h@qIfhFp=}C1 zIgn9dYsb@iMT^`f6|Pr6xs%)})ZZkH*iiWqi0Y}y#Nq$x-T>dmC#qx6ROq)lH<83j zy2B6HDrU0v>40@b(bUIgA_+OU+%4AM{%70lOOKaBiJV!^p6`e^cGy^>u{%9 z9_^2RSiSaFMy>+)ju8F*&s}~K`oDMJ7x-SX=4#>Wq3md2Wc7E@%gBB2#>;*W-htdl z!{x?cAbmEEA`2vli_@pR>v1NNuhz1LYVi9N$k&Hwa_LGCkvA8_Gd1bTdDDH?WOqYX z`@-FW z5$r1VBwi_Q!p z%Mqop?8dUI`Ec-ta$jrwQ%t&%9eGGcXhz>zETs;`=!Y%LM~q`#uj9w$)$1GV6Qr#% z4hlwAlC|`lbOocU>mbBYD6eR$T?um=-T9=n3(IIj+^KPG8w!uXK?v+7&a&C~7KuHx z#^Z)5VCE;r7{2A4=fk$nF$f^ADgK-4G5FK~_Rm2N_1iRzT|#OP?GTjM%DQ6*99C{y z*w4nehc=eg+)$fQY5mb*jMYE?vB2{0_5;1D%TpZRSm617{q_DY8yf$0>Eb``O|-YO zp|y9kvo~>cwlHy$qMM+jxs|T}MJKs3IZjP6E(2R z**>8d8Nu}MU=8yG{WR77FVCZ< zHf$I8;dwUL8C-xMx)lVWnl|^9hxfxn35jb66_JZT2~~X7*`@ZEpG2QaQhNhR3FBUW z@IpFVDwk7gLullzWiy?ao4UTd{m-;KpYZQT>G85gH^Sg zz^3ZttbyDTK@;u4s_0M??g1nJ^`+#JbUEP7FWe~pr-H)RZl9yZ#Axq#lkN4Uh?zNo zqS!*@oEEaWG&Vs0HGjrhxsCfc7&b@Pfo@CZW>4OE=T3F8_|#~#sZ2JZ8HYK}O^?Tb zo>lh1*OY#zrebRLP(~Y%gr65}0y9!!l#Pn_xYWMwF5UTbew9PcD=Pvq+@v z84@g{XD5nh=cLC>Z;+^UW0!;+QtHQ6ZNp_E*1=y_()It?(EF>1h|(tWKlqM@hVLSR z{@+H#e`vz~UOy-~8#w>x!JVwEqlTq|yd^}MJ|0(MkrALw4$lj1VN=m!jwNgePE3-W zFP$gj(?=k4wrCKN46U+qe^W;1QwC5$u%k1;x zck9Xz-jP9aV`LWU!Xo@ieUU+O)wLuJ#ksM~qgEDH6%?bW7v(6Xb4pTl7?i}Q3(9$I z0?V7qG{a4KhF|6tX$lOLd87hVm>s&5%ardGK~^fY&6!TtJ8l_Qr8y@j&sy7TJI9yZ zK4fZ-+O2E1HZv?flXk}>&?!*w4H~pn;ro%E7E5I+kkrjMWeKgfdGcp&Hdt1OBQf0< zSR;e)t_F>&v}etd@f9#Sg8S^ca}ZD}5O+E99!g}~T2wx$^jh|v4e6M*5BNphR!O`ZT$5G$Z&XzAClRIGw3yTyHSm9YEKfP!D?hZvL;=ZZk%Y! zG;E5gb~>GFEhpHv=T2+K!nCr|QU4INT`Kh{`t5_r5RtHW4bsz zg2Y_UOi8Jum<|yEjznpr_8pv%XVNFPb4x?lojD{1gBG0R+=ujA-qgY#Cf2~L6nlmSGdPgh>TJmj^&Y-OCaZu7>HSB5e(o>EDocq-zqsgWbu4F*MS; z!LwcL!6KUS%nQs{QQ>GaURZ(+n(_$LAOPNrK#Y~AhsNpR>NQZ~KG$<4KQXO5rfH{rd!IQ@{DtJ)=1owQe=OLUps z&xmw^YSr0vsPC`42)!{xiste@r{cLcv5rDMQ>QqPYxex=zp=_GQYw~_qbejM!Eh`U zgDyUak4jwa(jQ~XAcK~bf&m$H}vL@d}!ETjZ1J0KD@S4F zy&6~O0TH)mevo~S@q#^?|8q&Vw?hI*wZPwKsiV5BIjpv?&?($JfLnwA0BiLvb^`5? zcZ2Q=CC2FkVR{leGAJ0Dk3fu*rK;d3XG@tIh+>;0q)6qUuR;1Hb~Pmp+_Y8d=jkd8 zY>kN>RU51n%etL08_Q;KqaY-0mDSllR0w~C&hq*cQRsIGy#8GR|Nje}|Gx43TcZjT zQfkr>0R(_Ns*w+LwiRC`r?bfUQ2h~Vp zr!aFpq|a))({$ED_C?MNAFnrHT@aXtu>(;kwykE`m?8GtYui%vMp_gFS*R;AH8PDf zgEOX{=o?1JTLY|BO~ME{!kZ>mEAF{kXw7CV)l2>A0gTCVRJq;Ad;~b0@N3*ustNut z$iaez03U-)0;PGC{#msY|5fwLn+W^J8_EReq~_5jRydQXTyQ3bHt1(h_^`SncVq}d zwCNizKB+mk(f(9#S^WruDGI48(1A3e6{+CsaU(>F%oC<4<`si6Rb!gn5(LGf*bK^= zM5Xa$Z<>LlV{@vY)XG!Q({M6IS)a$7aOvJdu&nb|Om|5!#xfqHkrfpvH|xz|W}%gk zu&IogsA$_&R!_sdO+H9fMMYp!DKc5fjDowUMSmDHCRS4hGlT6B9_m%~Aw_8S+>z2? zSbFKKd{OAelM&OpiVj0}bM*D>HV+?#BGo`l7!6IOka1EWr8lMcb^0-^k@HEnFDs|p~O?BWs;iIUQvRk{N&KvyV>FbBBzX-ty)}JRiC}5!F zcx?weXxogYqOCEU=w|`zrFT9PO^T6bM5dxFe_)^IM70p2_>~#HzPUf=$#e`CrKzeI zAulGGa=I-|OvE$U2bHbeRX3uasv<-Gs6t4Q!n#~Zr~y;Ka0RWbj6P%~fQZrAY=QL? zS}a9mU6~POlCW$`DM^b2dYe#0cETa9Bp}Py^@oXZ>d&Ez)l~GB3@-L#t}vd)4)u)e zRUQGmRq!!7)=uaZsAO>mil*)TY9QV16e$0yVPRPb8djI`d-7M7T?hP&58o$*qjAe| z=0W|9IZGl1IcWWfB&a9S!5*a9;HM_rj$0MdkU%O6k>Qd1qN!WC%B6*$^2yL)+|LV4}9m#IHP5wafQMj$XC%OUtc}+mxWyPVQuH4CSWzcU1;anUcs5^=lru2vF*=49Q`2uIE3t?j+&wL84@v(=}k;+NFilU zWY`yUj~ZY4v+rm^%R6IQH}sOO@z%1A5r<7rdZLr1ogReuK)%Ffz>i4%h`s~kQR)z- z^wL4RN;J)7In%C}Js@B@R*!BDq(X!C%PqgWCaV-QX|lxfRpuEIhOOA~s}u#~jS$PMRvanr({<_51!y9~t^Ik_9VF}8X8n$@SiKFy-7ZFxCF#=r zEHGY!x72T)yyamyl_Pn2(k5%Ja1jA&XEvM@+SECB_RN`)$A%H$5&7|7{VkdviH_c# z%8!*Qu`8Cf<7$(2E3Y{-RsrvXnO-xqSfn&KjtgksOB(AZG30Hw$pqtr5+MQ!E!taq zg4kz0b=KLKgO5D1j!!0fuQ`iWWEMNj5|Xyh`?|p(Yb9X@DI%2q_K^dP*qXhfyji9}jrVEDIy+2n4J2O0rOgPUB%&gq zPL#BTN+M`A#CO`m+^EWBr{ep;5vgfLY1#**tykr?`K1{C2YC?3!ZQNrijc>-hUAH%>OKxO+uDO@tTrl$bjbl$?!5%TJZ{A{ZO) z`^AS#>v_Uz12Q5AW6+NPdEV^w-|~%y?gvN1PC{k#u!-)1Qw-Z=XKaa2*PuXrgdGCK ze_LFW`T)=r<;l^(3o9mo#3M&5EQ+PcE0!wMklgDb{N98&hav?76l9S$hks6#r()lR z#^pxyhHAao-Q#3O{aOsd<_L^pi36$@FUH{5iBLv%Je2LTPklyaoSGx|5sz!MDQzhU z94B1sz=d}Sm58PxwugHGx(9PtFV!Touy7CI7B^0qfGgS_4vi!;w>xeg|CmTeG{Njj z2ekv$I3&*;Z`4#nukE#!?C=h7Zk+Qn)8$k-DdOA2w>tcn#BjlnZ>s?A$B*CCKYpnF z?{NG#HO2q@^S}7yU8#GyW2?D*ZE1WzTC{Fu=u=(Q6H$CqL-ClauB!Oum}^(WM_4ht zx~#ltCy~YFTum1j)i{OB0)HOO-dsovF+Wz`FpUkqM5Akf2XnrQIXSTnB#n)Gl3?a6 zs-T5MKE-2JXW`b;byU?U(atEI_>RwXcdyfR`^o2Z`|qh(zE6rDY7yC#IWW7T+$W=Y zD*E7lzt$d5+Q9qz;|N zZ*1e&?&a^SKc#qID1C6ZI{=m+v3Lx8zGGK-Z+E@gJ^Q0yZ+Av~zKQ?@yJ!W9_)sB*kYjC9n}AooV>j>gWDGntuI_r!mQXQ-QzJ-J)5#y7!{A-NJ})B$(!l*FRK6~8r094N1guZdc_ zQKv8~Quw=QfEBk)+PPOD`ojDQ0Y5`H(kRSkXF5tgcj94?q$Vjvca6qmPO zlQ7ss5zma1R5#D^XU69JgSLuFuPlgcGZnU2PapD36eFD>Cono6^pGU{>%gw}66&qX zPMd5;j!J<%wR0K4^G1R6<3cg(2l~6jm`ZpOGdstPuKhpoGn7~?G+W}OX)*?^te!WX zFM9^^spbObFaPDoMZe(SBqC-D&f4vD2*`#QXG!rmdvpD3>I-h>9UKc91d*?u?!$YkNaAYhKZ*b`lnoH|rv^hY{qSMgt>qfS zhZI9%K2!N6Kjl|HY{AV8_xKc6D+IZ+Bl4yhHBW*SSNO>W)#8erqrv z-5v3ZY&bF_mXgo|gi>=diFQ6iN#KKL{FNlKwwzfe?@f{xt{2QCug%7dyyMKq{k5bU zp*nYCSMI}`N+>Ha(3C*&^to?hFlCw4orpgS#ffb%h zxqKADxxBh1OsQQ^JDOlI(He&oz+*kxb;}iMge{3Br*>&Ux>FfWX!n)9khE}a8sO?% zT|`xXtm4txuRS{}i5wpqC3B2pxtcWOJ1a}71EU&s=28VaHVf$f z-U>Jbxdz`?E$elc}s5X5&ciuq5@;-|e* zIhAn#;6FOW8x3lVP-&M8@C>e&c4wr8*0yy|iXk+VpD+y9Q*9sY-Nq2LaUPqKsycK(J<6bgmvj~HE=*SJ)k3u&H~qw4ck#cLE{NI!aEp~E;s zPI&^&KNHp$SzB1N6ub1Zy45-Jp^e_P$mt8h_VJCy<2(9zPOfGQcXg?i@BQj?Xq+Nm z2t$F2;xS&#mLezJgOZ`c(e;$kP6-lEgWhex?l1|6XtqQO(Z96}FwMpIWEPmt58@i~ zCccZ(LWxjJf2HZQXXr24~;j9=atM`BWR<;5PQ8nI$U!yOMBJ z0-ORF<_v^kv)6)a;z@Ym*eJ#4vlyw1(zX~5E-8J{A+XG~D@s?#9;nNL0}8r{PFFLy zj&QP2d0xalwfjrL2OeI#QB( zj;f1|KM(|L{cau)u!vP0yP@&6D%1{+Fv_M6+2Li0$~`zTdl`>I@y9$$bw0O#n`-6( z98r4qR&|h1p6R+-7)7m9F&v>yySRo;t5BrE2nl)dpl7nvQnMHaCyvS(#ePhCNFd0T zzNcYaHo@|mK82nWL3N1Q=w;WCkC{#3ynT zVDZi-Qn*3RjCZxMi>xt77Qj%l2rs%$ap5tc7m9qIW+QECaS@k!PRmGk^Z>uoRqnH8 z4%1a_h^n@)cS5goy0JDEB`wJ9UlN0RXXL1ORYNV2GGjgfFks-I6 zhz>LetVs#0$vZhhF@v$`uy8%;$UuoNE)CxB($)hG1(%VV%=IgPdlv?Vo+PrEuCJ%2 z*H-Wd?Fz+l5(E}tI`$#5ZW-m9q{iaW+cU@jchRH3HyX>OJ;Y|=+_MexZA#7A_;KXz zQ$d*`;JD?GV|jH(RJ4{;k>cVW?e=f;a1Uh?TE>%^+m40y9E>SnGhMCi^7%G;@{43F zonP<*>Irevnoq1(FHVYEdcLqinG3NgpW9nr!SJ< z(bDqoMUaM&>_P^ZSNRV4zZ4`J0%<6f;z@TR8;kP=Q&HK+6NMl&@!dC31;!JNAT^aR z38kT7O|YCtvEbo#KS;c_R%NBgv;8_(O(oarXi(%hug)DO7nm=iQXjhwH zjcKBqtsFX2biT&5VlIb45n#~iq7U-Aw9Vfgh0PosXu)Dp7Kd?dHk(JMo6G0bxtcTR zndTmJB{V^VUb`tY5^h}|H^{s3o$|Zh|cb69_9uy@1k@mLagKHOSGfRLd#L zg6ABRcEWZJ(mrFkglS_lL5AVrXjY7ptyVbFRxPhz+ZbhR55t_3d+$DA+aF#5{7x|W z%A*gWop1@1?L@^o;LcLm_a#kn<*D0_9wTGVQlNY^BMz;lVE0sDyQ^gmASPM#6lDr1 z$bnv9~Hq_`%cG^S$rIiS|kIfJVi-63nDgR<(0S?n=2eYn~J`&!thx#|(duW{$ndHSUpW)o`v?;5|xVD4z$ z30>R1z=~c~Q%Ju4&QWJn$t&=ycdQ`>;2pRHCB`PSye>%5*bso7M$g7}I&ounXi8DB z_NKG`7S9wGmJF7yeA}-)i36y1BG*&69h9EjSuD$HO4@DV+#c;s6R$oMuGy9kN0<-oY5S!*RWP}SMRMuA zqk2uJ2oMDR{1X;==d9w>_g5}hx}Q(Rz?`SwZ)_uCZzPD+z}9ClasZ#GKF;fpqsXuU z!Ec5<(5)tmZgEG^`$=+#ltAR+v2h11gdtxAB0q^%zqmzgt1rGJ8op@e*gFjG>gFesdYVaZZ=ftENiN-dF>EIjz+jus(9P0~=!vHk0#-$r z1noGLjV7A%Nx^eon3wIw<^03q+pP-JK!1S)c&~s)-64X$kiOU9sw+XSqd;Fs5g2;? zFs})HmS?(GOm_bm@8)nmf=f;R1&(-w&Umdd*{w_R>^m^j>peL`4w?%R#jq*q! z={|0N?4|caiaUOpB=NytS#aYw%o+RD@Xb2>VScQd&;{}^1^Iwh;}aJC)&)tmM-2S! z7f>IYT@TMg^_rL_u%^Z!@XYV%o?tM6?I&UVmN15G6dT2pN?b^4@H}E5B7DMk0A$AT zndAszO$Ve5HGK!_5mawX(45hP zn95fcEMAp!oXQ9HjP#iNUJ~K~QnM`kon(6ea0w2t9!0UeCMH!Y+`mSrD7@Vk9KjKb z+&Jop+Ly|AVmGZ2(TD@(l{EIT6wAne1K(NzS{>Ej$=iR5ThH$bv84gLDsAA4Z}14e zo^-q0T>)wX5ukeu)VlBSsQeZU(kk03n0BG5ycXm*gurt{WOkq zvN_ay)(B(FPUZIWJZAEW({GA+a_G7X-fxd?`NOSf!`(L^w}z8f`$G4D<$(ILsF?Un zdwHs8SLRm3FTf)=@_^ZbJI-~iTu-bbXVFUv?~H*%rq{hX44bOP8lj1lG`CpMD9sGK zrUFL zFsoeWNk1m>5t-0yvbG`VHqwRwMGY)DQ=P-%ERXl+H=RwIN8}7Bt|4)I1luH}!Y{23 zY=7i=!GqZqfcwXJ?Vql_;Z=MNejk%yH&*aIs(9ChhvS0+_P66r%}GMpIzPjo(*5f3 zEszH6HqnoiLF6J0@y-AL?9!D(ydSpzbm=sHx^ztc_qM=)?x_EdK~atBjxvfm>c1S4 zdPxmvWSfc>v}7wj$SPYTZB+hv$aDp%^4aF4Fjr^kR^6A;oi5-wzURD)pqzz^`7pkZ z`M!!GUU!smBGhyM;cKqeUb>43`)GkxW+EJz#dHrZ2UDNd|DnT(2Qy`5*RQZ8hc5>*x2 zc#ZAUj)muHB>GwL9gKL#VxD2&Rqb7+=Aiw15=SrnR;{M)hSW4FKBAIyBOxS+>Kew> z!YDCP^+p`eDy(XWu{XkX|H@e`Qwf0_0|uu8!`X%*#T$nw@Sh{~^swqCce1Bo>}e#O z+c3GeA7}Sgjc&C02Im9zbNLFi2qqoVQSD7lr zNo$QnNAAdeHU(sGUA0tkp@6w`+ji=GI`QCpZO2kG7J8BO9W@?KEBUNT=SS4na4XN2 ze%oqh!1nUnTWwz6{-;)xHlqQEdwP6lG_bge&exv<-(=ZK2Ax9BJ%Gvi#}#WqW}~4& ztRwAX5xPma3@o9!5vIHBbdk}1ZiFMvdD;hj8V5r|I4R0&!|*mEBke`lp<%xZOdnYW z30A$M@bIY4cfRa;Wj#)gHHzx849$@?2sK&n5EY?&KZ@*f!{{@Qq%z{y%W3(jIl;MvZNW$dTDa%yeD;7e z2IB>ZeM3u%os|-I*Nj@arm877*Ns*=2>BiXeeQ^kAiu#Tt233&0RiASqwqMSeGu^S zJQuVt*n9A;S)*V(qi8$hz*~dJ+e7pjFaP=e|3h8+Uuz?kooz(z%q{Iq|94#}_p|*PA2>L;GdP_aIJ_IU zoEUg+_wvL3A?{lD({#6r7`P>zY+m(n<1qAB_cHR=;UVtVz5zjaF)MLUF1UsgKRF}4 zE`NJ51vCB5CQ9B<*4XD_;jv2FG;aO|k%RZ|La*Px(Xf^8q8A^W8Kk6~6(d;h@1!4K zqVH%a9~O~VSfGe%f5}Zt$kOT=nHZQD82|i2fguKA27v(qNjC$FWMHZf7{*%vPwwC* zb49?;&!GI@Pk`TlEz=XWF#LI2lmBPy`#<6hVpOcL$SILI!cGP9ZDJw9d|!=%_Bp*4}hw!G)fe+Fcq&5oXWgGKn~)j$(nEb}E5Z-*?mmM(*~Nji29j_i?V&fpbxq|J_#Pm+r= zb;LigB-1?eVtjKFLO@+?SO|$#D7B(3RcN;UW;3iv6$}lhTwjct63J?QAM2D0<}S6$ zTMM?!(8IOILMG#<K$U9D?Gwfsvu#9k1*fQv70ByN5pXtz7ksfVK{K4 zRYq1|ZKtY4s;5*6Ef@1*M~;!}pyAj(0IZzn=2;UBMOtK%Qja@T)KzC$YZ+m6)!or{ z9Hc8;h;@Y-sg*jcw99UZy*7C(mE6z&jsn{&z-HdQ1=A_Frc{vF>{Qzv|4Wmxk8$>% za}t)^4gNU$`$PpxBfllPa^JF(OLqXYz(;(CD`Uc?_t4#hKqEnIr#CX$RK<{Kkq8>o07yrmO#ol&<%Me`ZTvh zx*kR=m_fjJnVQUD3Su4%)+pR8)R4sYJ`w@Gf!=n!;b$9;z`X$GL<+|x9R+8)A|}>H zvKo_XGa#0|=CEt43gvGj!~j-RZeLokCqv{6kR<3hU2$aIu7<$1$Ndm+cg0Z7UGF)? zq4j?L6}f_LySkh^Dnowr>~Aq=G`p00SN+AKz%44t_J`gA9)hg(gwPzjOcsE6dlZm& zNVLfEqSUI+cFJ2N@DCw)PlxCMju#_$pY?_zMjGGe{ePPr{D*9s!AXlc^Ctsj9^=<9 zlK=9EAYs&@0P5zwY0r0<)aQ?cWn~k zY<}(V@Ae*f@4f%+y_-p@!{dV8_i3ewmTq8<2G-FR7=mNk#Tt!iuRvr!(na3I3k}Xe zcAIDy9j)8=_%e7*IzU;3qH-qQ>41qnO~u5r>7DdWYHjaQ_4D?gy~e z*Ir##B~{HKka8xJtSw07Vp=$#3>J0ALn76w4=#Tk9QZw|g=2F=`}GYn_h zk|VmzP3s=ET-K!<>p{3wp1wOlFr=zjs zr0!-E#n5&F=q+ZtvUQ4hl4FWax1!eT5m*^V|f`cZC4l7s@2m` zWvoI+7wPzNTp{7Y3-Z^I_oA1@a?jNq^Gv{#d zDe&@9&n*^|NNiAZ5^n*)!NCMlZ%B^v3A(#nJ0!PfYT1*8+W=*kv4$M<9oH66(XxE; zx0NF|`iyAev~>q^#ojk-2-^;n_-u{dJEJH*3ZB|IvbVxAcUEGP|bQmTTPRUO`2|+?n*oM zZoQPELbaY#Ehv7qdz4R=!8z1V+&+VJcc(T}NU}L3V5w~i6Q^`TO#3O~DvwpJ4u`>Hd)qzmM#7e($_>1^VxkV$nZ7^OJr` z5A=1wGg~t;qA%1GFqUxV7IYzh7wz}GU;+ zM24ZD3CExa>e8Vbg2)_v08|bNeHvI*-Besu3uj2elDh7=Z7TC>myn4VR8=UZPeYTS zt7#A_qpAfHLuUo1l~?A;eJf8)IpK)(&tn7Fl_TtbxFMtv5rL!y=EPrX>PceMqj6yzfG^wbnHf@ITYjG8D%tvyTc zKXT+`hMevvsDDY+Mct6?PI)d-NUB zgaAy@WI0#pW(E?7=yI9KI4`fap)5$0&6)@N_3_f8O_tV`s}>rP{B|tIFUHtEVUylb z2L0!0&(M1e!I5V3XIXA;4jFgNGJ>*KQrQQryx@~EIZ(?Sv1&TocHBNV(6jMr#po<% z=Fe=@>_@Q%(Jw`0)y(T|+n7RYBPB6STWZ*eZ2*#ge%HDv?mk#qx97mmWfRrvrd6?P z*g^OwN``KgXLPI0Obz<*%QL6sc2@p#=_*g{&!jh)R?u|JjI5pBA@np!H5W=!jBC~q z-tvWQY8q1CtK!7_oUj;iQG|RLG0sMg`yNU99)|Xd^qNXQT!bi(?>L-_Pe*?g+Pv8` z+bo(re@0fJaxyb*Wh~?tuizHP+0+`>ck*FEW*LYj9>LIs2X0{nxyyd`+fl=-!3t0rp|c z@hD-~JbZ^}d0}PK3Gksm9DPk@A0N+XKJd4{AKJ{5c)M-Aw=Ras+pO zL5c)QhsEFetwNl`P9b3oTY^QaUm)zC7Jbf*4^^S`skM!iOh_ zrJJ|wq_(nXI1QQK^6|?I-|yFwm_ly`45x_M!EZDEUW}5K0V;oMI)-4+zm>$K5Dfn8 z(3P0_sndOr-3G4364$gyC@pL%_}GJij}Nbf#cGvQ2zY~7-zPos?;)RG8Y*Hm7$6Y! zBu=M@RFmV4lRTiI4J-&P1(y;H`yA>r%UTsYEP<6XCrbOjXR*ax@!3?xrNAa|Z?iHD zMIQSjQWGrA5sq*LkckFP!Pg4#*NOrh6yvtSKiqTzyBgqM3!q+6l3x+S z3CJMt$mxbaN5&v~!=M`F5oPj7e)EYc_=MI!(-d5B4z3~ztwpsX(;r!VI4zwARb4uVY0i#Rzo3Sa`Aa1S8I&9=TNjhVIZ`fTMcss-h0C+)t zW2*a*)e~yg450yQh$K0{=VH#DmO{mbr^!#@;k*$fb&uw_@8^Pn z=FnRqdJk|zCpNsTg>j$0+|*MNTf#k)By@s}PZ!b6X#mK?;|WBY&OD(7>vclG#Q4Pe z8%$jU35QQO1}Nv)!gTmj+##Rdv*-k+s=z5qbo?SC#7qYf&%e+Qu|(ssg?fQ)`xI8; zUboZ~#X>>^rx`>JAQzbV|Cp;n>mT%zk$Wpc8>r%N9Tm|EEI_NEn(Qq(sht3eAmvA< zgAj8xN(9F;P~40u1`HtViGJ*cPb|XmtcXoFh3GS7jf{T;8yC^L*I^fb;E;-! zC)!W^=AhPW;+F`82TF-uZtRigb&l9{SVBtxscRzmHpD>t5{?})Ko?rm4@2S$dg+$c zgS)0(0P8q@1Gzw*3^qcH{c6X*YL6c6pZ?svG=LZhwmAohu8it zB*3Q$z4%XWZ|_Sj0?YRI?(Xov=ci*>?9p*j6$ufL&qHqVe?g)4!L_`GK#9SMQF=La zkh=SNc;BtBTe)rM2T>Wfme@^*;{Qf;etl<%F+Nk9g4;}JX8ORI|Cx*mPewwg9z9;3 zqlU#iOr%lxUC=KOu)NBy+^1sqE1+JwnZ$*&OTg#S9$)rZb@hEX%Y$F`s|uPHb;QH1 zaKWGP+%=*CwgHku(gdjXTdE%(3EoM~q{9h$8Y6m4>UwtW>`Wh5w%U0H2wOQ!;S9qi z1Xo0u98DmLSbhCHxTM>WB6TfVzj6>PY<4Bc9P%CqRYn2S#`%fLxuw+ zkz~L~_??BB+demu;t5pR^G}>*zYuA){Tacw`tKgTbTX<~6!4w-k};)>;zk%<@@?>w z#Bo)w*HomeqH&b;pi;9^M46%*r=?UXNiX$~AM#on${k1n1#pPkC7Z2CGe`G5+bST* z{nv{Y?T&!{pAWYFqzZk?@nzN2PDn&{a%^@vzO0E=sH+t!x8=t~PDGzcad)x&Ie1;z zqJkX-y+UdLjd40L5?~ZgLZQ?QO0>0cK^~0+>g=TAorwF?Xju zi>QUCicD+HPe9O<_i?FC#z|YK+9t}C_d_SJv2o!m?lt5dd$p~hSC5{FKcN)|x z$&INr1y@ZTl%daL1p_fpBawUxjtU`i1#5ByZbCY&MC8=W`%wk!Hmh6xapFkw6hL7# z9bP%iRKqPv9|ct>I`I(XaDz)UTV9GJ%Zr6qxjxCoUoOm9WivR1X_WD_jkF3u`#tSU zI+k%vd2ac*y(i~{oF^GRHOmQoZxcXNa-wC)9?=UHvv2K<`mCU}e6ZBYm0eEhtP$W5 z6QlxVCIJIxz@Hr&f)q}2Zk7W0of*{FqT3iaz`{((QNGRt&#ukH5MkI3tS0(FXG%A` zotBTK%CsF}zc97j7Owwi#@T9-5F7s}OF9@;= z*dG`9fD|9wD=NejH&&rZI&mX5I{dmK+-dqPeR&ER$1LzWlg93L{u|YHZs!+Rk;E>E zhxAdAM-H^QL{5cM45giQ=q@$4aB_Y3>LBBScEx_`c8A;)#XIDH`u^zS*|(V%>YkLe zuthIY-6UB#i5&P+9CS&dFDug5g3urlwNYU>`xbSc;d(}mWouKJ?_G)e6$}LF2Tg`c z>Z~z(sg+|T5z~@mQy~FT-LI$_u(X8qlvEiYhWw8mm3-fY1!#O&aG*WgGE`OUz* z5_iMg*O2B6|<@3Yj~GCO5sFe4IqYQ#P&?4TydbxeONmq zN4G+h@8i)&NR1JQy7(Fr5UZTFQ`t2Uy%LlaeVbNA%t1KC2;l2}X&)lLh^EDfZ<-PAwO5(tF>IS}*JM#;BIjhO7bUG~xHc0#5P*%;viqaw z&C<|}vs`X?W9BxDK}3(gJj1rCbF8SE1{$PEeFNtC-$6)7E6aBHc)mGZPa1{t3Gr_~ zncu4=i)8D|a74iKYO^0Fykky9X9TFCH__LP^?*~WIWU9g#d$KwsR7+z?q?MbdTOW6 z^B*5S;qK?VHLGGC5+VHo*jPc!x1Kv2$A;Q#3T=m(*Xh>=t$PqS2YYdGRN)N^3D3(7 zdw8_FHQbBdi#BG$U}skJRk%~XrT6}6Zrr@ADeuFRvT?%0%ywF+aU!;q4N#V4Qd!1w z&#IKCVX9eXYimWML`p~(-juqQse9wsBIa8bv3Hn}aM>L6yBwZJj4)nVl4=MUZijKG zXq!Yyjycb&i`-8$8P^pYR7lDyhck-dh zND^p%Fv|v8a^SoVQKy*wWXjfhAkuar4XXmQc{TR1I#UEop#=1DADg_3`)*Mve)4=( z95;ExueRx}TR??>Ye#h} zocNMajF;|m+qXL?*p26u>-5K4d+YMs+*61mx1(?LYC_4?E?1jmC#ZI4^;R-)LmRG( zQ6)msYbPk?t(CKfJ>|CvO;$|fL#(U#jT+K+J8$tX-|kFo=g&pH(|V=l$REOlTy4Bc zSnJ9XtrZK=Q{!E8Q03fRCxa%;;4+vnpHz6A-PfPXSW;btOYM%F`~cJtLPq*Flwrke zN#J>Jngn1HMFUpjZWO%%g${_X! z0eipkM#h4f1?9ckwHQuoy$?eSl0<`f^d1}u=}>2AGkyy6s4~UHMpV0wiR-7g&+)If zi=cl&?k|SHHh&R&__;etW%R|38&^64S`-!GNkeIb`&1NO+cz@Ap|-WeL`>gRA#-;I z*G@Kgd2@Sw-uDHs<of=6OYbmJonn|#$5b9xn|yL;<&g?%-Dscj0&_dku0aQW z=~t|!lPXBt#*sH23*i%>^vJinE7asU zOq++xi(0X`9?=2X`8u|ipPu&}?d!mN8>t4D;-yHlg|D1v}9XD+&f~75ZDJ?;WJ;R1uC`ciXtM=lt zn?qL!gC;3RSFAGAWy6)UldZ!m4&N-K&!h{0CK7RdSS-SEI( zL{M0BACaW>=jhO}RSF=dMDPz`{q*ez1qLsnqtMm9(s-7|lgr*0*M0z&kV^z%FYef! z-z!jP*qPb!@w&H$qVTT&vhi)K@1S7ZW<$47#l4Z+g6pR~J5_~+paq9~n$d8K7Ml9A zlRAG%ox%jX!~n|>;knW0Xu`Cl(#7#{#otdn;-*#36M$D;)bqKz?2hBnQ0TBD$0pF- z9X@c?{P9|yM?y&Xh_Swb>UL`0WQfRPhQ)G#aQJ8CXK4gG`&9V8WT^bCW+rK77%A9yI!fNv1=V=u& ze+AKN_A+u3W9pJExmsjj`UVuUk0!hdwmu_7MjMz2D( z@l!OgR!u|EeyO2ZnR#=>Zd}BB&v8iH7)U@Q#%W)&zvJKP&+%^!`uq0%Rt_Pje$&fm zb*vw_MJEQn<=uQ z99W$%LFxTi>TjDSc1*7-zmw9{a^0b&jw07d_49{>E}wVa6a?rb_8QX%t!-K2@Eby@ z8?9iq7Edy&YGOwU(fVf6w6NZvWE7jVv9p#(Idyldpqf1)8$?1X#v#ZLcktfT*Kd9P8Hwnt$^#BVF1 zJXsNfIZ0^VUQ`=&IE+V$Q~{$@BE)gj?=CXg8i9YYS^jRp{{VSY3~yK?DcKBx`LXZ4 zbobixd;=aYv48Cj`N3?`oH%5igWvmvT|hOPMmM zI7zW2f#}KgVEb_R ztc5g%gjQz%S@1_i!UJozj*5A-PtQq}DOI*6C>Zp?KVBv;$Ne$1D_ZdDOe@L$jRSv* zS(Tw+|8R~diM!giif0zRxPdB3?H<~?y{E}3Ym|5vAv4KXUFBV*=V*RSp$RA0QzTJ2QUs`{WZ#sv{r!TKzyjX4(maGdnfLL2rz8s zkNiu!4*!Ok3%VV!^GCkuOLMpuj(yss!7}490Y8tMGX=eSb~LURkdz-ZJR`NrP*LM#J(lT~mtFf0(?a{-Ua9|I=oq z|EJDADMnkRTUT$FaESY)zYBOhP+J;chjs^LKy8;a@;Z5V!_*}l%02bwrOtUf`nQr| z()XmD00A-tVf+@NDu2Jg$p;bvqF&d6muL=QDnQ)yB^@@d%7f^Smybv)KUJlVOs!8h zDn!UQxfDRs^I!7#eQ{(Ns)e;OCGk$;GVN47YO+S_!pzz5xLl7og88)wlaKD`IHoN0 zWMRZ?vYq*2XyECR!ltkfznP~VPgNM`6aC}wHFG>S7T!%PBItLI9@t}t~>Xa=~&|;b`spL!PvZ{Wp=sIBL}GKDcQ_X69uHc1nQeNO|gX zTnv3oqNS7~BW@l^aaC%RC@e9Z5pxwD;U}&q5v74i-lFaQpmbV2{{*mdv}xVPmaIcV;A()-o|2W_4O*a zN)8d^&kB2$y2DF~%t^6WRmg{FN#I`ZLIK$qro7CuRfG*zmKFnIU;{pxbch9{?4~Yv zOowvdYYwD(Wd|`DwFht(%k#k{*lPKjBj&6=@L{YvF{apBjv}IJLyA6n!l*c`xI>O$ zFr#Qg*mlWTwoKXm7%V(dNzkWWr-h={4+APo1JbO>BQdPruZ$ZA@CI;m2cB^H!<2Ak z08%*pQ7kxfQx710ML=O_-65%-O{q?5&T5x7oOc*j8`bBV7Ac!r`CDhG{k|z$oy8kj zZ^;3;&C)%UUe$10$6q|Sy^&WHAN?VOd*Q-OCW-cRNmjV6@HGxcV@p({ogsPvHP})ZC$S?9 z#3sNx;D#Oga*PHBjlg@ILW5-&(-;`n|J{fIHpv0J`t&gR#71FjaJp(toC>CTeQHcG zON^qp=z>KE%bX5#d%hjqgprBjM)hn?e`wjWtkOM8@)R)P`aHx+fWj36w6i|gsVIFj z&vZ%-RF+7KwI)kH(ilD*^8$P2pj*IM=#~jpa1nZNKuaoJ#+I$VUC=VTXUE{=$;>0h z+=UTx1DiWZaR>^OZ}lKaktv{jGP407GHs62W0du7%q=MZ8Ebp zw%B>Tb+`f!_V?djcr3+^RS zp97C#OJzI=UF)+e4o2%mBkq^o*ZdAT zZ$>nkg%a971qOSW4~lfo56)$V*(#tnMUoii^zb*e;I$&DP4n5R;-J$e%@4D)iQP?2 zbLE*c&~GgVIQ!b;Yc~8{isXGLR9nu-L*jcd&SX$w@qGj~+yHDH2hfr*T)8Ta z+2Bb4({AoD*Ed(jtFP#G6KO?Fj;EVuM&1dFr2IjBp~Mb6U3O4 zg*q%$ZsU5#5)FY~tVN0E$CC2X3Ay2L+o}#V&e9dfM_e{f9xRXb4mBi>{Qg#{K8@+| z5HqF?v5Df4T2(_r&UeQeBF;}-yk5>hfkTWs#rvKrxCQ&D-!uf8D)_~Qjp^xYM$l5Y zuG9@!%8tA@4QS5wHGfug;!@7{g%@OiN^9~elw|sl36lm%qADQ;GnY3NST|m2D%((} ztXQHb3EjP|(3eCy6T@(g9Zf%g%6o(EIcJZmb$os?3xzpOFismNS#rcm4Z^G z4&YkFv)5cDw=u%wQ`~1?W@}dAd4m4KaR%qRFzm@LmTnV~>)>N(F9LGqoSC~8s9JIjQvM=`&A zr%0Q4XA~D`qOd`YMs2ddkUlyka+d;(T|yT#NmSv?L&&06GL7tRjVoQtzv2K3gNobV ztgtd@guT>KC}Q*WyELp49nfzCrm2H}ofm>WpBo^y7r3+7^nPU^VSy@GZ1{jYCa@xHNzuw>_5ljyGID@#E@ z2+{0zAODg48;tdYU)(Hj^0!`h9)AX}gbKkY{r{SO{fD-VC&r#&|L2lH^&^4*{|V{m z_@AgPMeCo0n6ZCZI!=<^o6TZ4)+?KOw!nu0kdcw}4I@U0;K*0Pd2DH<8|^)C-dW{& zk4Xg#AbcvvnzmQzRm671N6cqRdk=54CA>#c`g5{0FC{@S zxzfDzzJ}<7%`S=I>ry$}c@JP^sNRy*E>ua5;_DIk@9V{{Kb$T7%jJ)D6a$zopviJj z$Oe>sIybCUU6*1Hrr6F-{y6f#O63c=jGLeq24M$;DZf9eKo!*jC32@#p5n+u;;;fi zh?bOiWJMqwR<<>V(-7x7L|8;~Y4QPZ*H7XnFiv?pY5$<-xIZE9 zR6|7vg+lYrmnL`zm^L`IRJDM*+4*+P+u`ul8vU!&$Yo?G`i%!3gM@pK$(H-TViLNJ40=O7-Vriu|LC{C}yN|0??Hf7mBV)b7-`R51PM zXoFL2gxRW?RJMQmavBChw$O#Tl-9Zw64GVDBk_8h1`<|I%&q+W2!0O)fS@Cp?A)R~ zp0T5aqHkgRy{uJ6Maw9H#BJ}#?zz8zW&J*mw(fv*#^hjy=MOnzDlo|ycjBm_YeyM_ z)Q#IiuO9BjaO)19fu@bzD zCSHJh|DuKxzTW^q3$t9QaSl=LIC(IxZyf7wtT$hnNVv-m)new7zSazt!-58B{U)Nf z#_652^uEEAi;-2jxmj|i@ao>5M zVtbn)l9HvR8y=ckwq*q)?bMK{>I^G6=+Mwp+OgaXt2F_~lSHq@L`eJ(X?JRCls9NG z(^+QgnYOHTSahd`$|I|qHnGZc4TEZSUlR>#Tdlx2;y`DqmFhs;omP=xh7KdD!^U$N zK_;oN1#KNRC{e2kuB?>S-Y$s?OcZTOL-9T~QZ-p6xuG<_@DP4i^*%SUOGEv>Hxl8# zAP^3XV4|$R2&FWVsy&bvjdfX7V_glvC^0kbXccMLSY)Nqyt9+I4;M475LbnR7`Gaj}_g>Hm;`&n4P z-FaypuuPzKv!b5e9a=9 zR3=Ut935oKFEi|*$z&|m-Fjz%k<$j6GwE6dXr`Wvz0w3jm}`UY<(({DrIROhX>e_ zCxRWRe^_EIS`8Mrb8U4Sq?u=8H}*i5fN^yGjw{W;G~Gx%I9SfuByq7>o5N=G-e=Qc zim!y6(mZB14vIe3=E(V!erE%ZTs6~8@r#PmMg4#hGO|9gIpNLMeX!0~BMf6}4R-Z@F9G@=7bxSAl$iCuS*fqypQ64K{B{7no&&AQjdev~0JnmHK>9|`GL zx&#lPXW*zj^F5Bo^IQv<3EXE4!otE1{&a1KA5ZB!yFJ-fVD{!n*$8@K#v^a`>wVZh zu!qFm47%~p2Iyxv@;eOM>P;R&SaE$a!9Z(ZgpUIx@fKYOSps^V zS!S(}f%z@je+*V^zpQWif20n-f20ooj~cIk_mQkpmXbpjfdBGv)n9dn7d|A&C#SlG zjZyHz;YV!H$Tt;8V8Om+hR)iWGxcCv2)LX|2t)JzLuRYXZ4Q|3cKf4ySUlH&*Qf_T zgk8{4(OJ@4Qe*kNc#g^Wb$y@FJAQfS4I6sIi^ju8kpg=4sums0G zVE0VmQF{)qN6}Z1o;Y3>;!v^og5|u&yq-Jz0L@uIx}2}K1hs!)vt!(+loJ%VM$?R8xZQU91! zbP|rj_Sn>I#mr0uy=){19?>5~D0@B$!8kL8D4=nZGd+uNMjeCS);)|Kc>Yh8UxQsFX+D{oUmLUdx@G7{Ll8&)tXLtk^g7~mcUkGl-plV+l z*A6l7*>t#!^b2W$)D)c&r3bThJ;-4H)bscXM8{2JIBx{aJImY`iiN3NZZTYO7Xsr| zz&WfUUAtxXk7=z{n%H?baA zTPFHr!YovVZnNEqO9f^yMvo3@kMTtwp3VUP>t!3p5({Q|Si*P`{*SQh@0VjZ^q#A$ z0^`}~U(t^%gDoM;viBgK5xVi#=<8S~cDUli-c(YBKJkiSP5?m2T&ehVKwm=W+akKT zIypu2Ia;yXB;r$}i#CV51QC7_=mau5Pr>_7YoT2-BEOX&8f^z&el5HJ6Me$q=*7o+ z$3B1iMPdW4HE8GCVwdqL!!c1Xniwt)9`PB=J~}CxwZio&ZQonZ!9^ePr4G>ix$TQ8Yi_p!$>YmHhY!GW@rahX10M`2X<$i&Xx_158$(&JIBaR`yyc zFG8MnMZSxghtv!Y7A@F`Hu76KXl~me{6P8svm?#lYaU7ZHkD%>Y5&*q7leLT+veo; z15?M2ulEOZE?f*!?QE5VY632j%&81Mj8+0vx;C>tL<&-?e+6lE-VE`YGY}i} zBUbC!EXRo(#SFw!s{=CLp%UXRh?v{bA131n#?)q>yu^_K42mQjh{F$m8dIw5tc30v z9g;%4G(=TFqc&L<;)TEaP-fG0JR>>H6HIB06ZR zQ>4hDItg)+?Prx$x{$R~n?_94IU!Ml;$Io3(4%B%;s>xZWAr))7uiye#oD!x*9|45 zzZ9cRTg(E7FENc|ZzAKNfO%{w2xx?zH%~pb-?vV?MyZu{0f9-&Mj2$hLC}kAghQ|< zw%(4K_cN76+#vjh>UOk?rq)FUJ&btQO>vd1@pw zSSQx2ES;UdvT4su5BTqdE>agEB<%xSg7!*Q&^scTZ41X{zsH?-g%$p;@kw^lQO(yA zTtID3ct2-4-gvk5e0zO^>~dru<{C zur*^;7K3{>--yKB!2S&ky$q1|di&iXgbNKTjBXu5h!}lqHMr`&WICJ7NteNuK@&Xw zPBEG$bUkwY$6%?kc&`lRuFr&=xvSS3?YYBd^;jpzrcv1Lf@lD$p=}1P?dl=dtR;UI z%A?8Rn36SU;1d>(r;IyZ4QSidK zl`*c0>nl_n>%a!ozQ^Y*d8G`ji)4S+UeB|BZJt9~#S$wu;ey_Fm!TYbB4v?H-rstc z6cuKY&^GrEw~$Z0R&e7%#Gi0Ima005=Jxk$B!z&P;ho~WhrV2wIoovQD(lKQf6T_E z@nL^z*jPGoKDFcpc~KEq5p4jK;!|FC_eX+NwL;lEue{Jb%r)uw3Ha{73!)FD!g#H& zQq^t(Z%CDWC8QTDlv47wZ|Fz4uij9?xt*g!dam_^Bj7;pDENpH5b>FfScm4sy zeib9bP7@x%FG4DYrmI4u<%BN2_{a0p>Qgfla9hVT{qDME_0$^Tiy#9J`vCY-2;9Su zYlM$_r|079PO~+2_0h}B0#fhWC&%@4+drU?3>O|D??gm5uQ&NXyp|~cdu!5zyr6XjH|1nSC}SYsA==WDP!R(%w!-3pO*Rx;@bB&is=ScMbga`Zm9aJcnXfE_wkH8 zS!cv?5j>%qPqOsOaRRu<#)CEa;=DXZ&DTWRCgR4Q-WP}(4qt78Zl`-UEnKaa9-$q@ zhHZn<1veXwKE?q6gc@G;%h6cyOzwz|=So>@8*)3pimSpYqUXM%4rlKrjY`3{u^I2_ zS)&3rAAG^}P!&tPm);h`7FzO_e*76-i{qsd0giL}p1_k8Bk6$44M+Y9&B0Sh>PZPY z3*R?$k4*gyqkn`LH+OV>(iwC^pg9Sk_?EnaE9+=d`#&AGqv(bj`_ECw{g3nHe+Gs> zcBD=wZchJxus`$U9}D#_R@sALc4i4b?)7=nqc}7c{6buQaq@gbMa@|4r)zfA^M808 zsQqw)+5-6^`@L~MeBq285Hfziz$sa4X|Kn3Q`alDIlMrtgFHYFrI_RfJTN$Hg)R&H z7%hiS&C%)6oI=AeUUbNE9$ljmM!`qZeh>3?f^zCJr?qXKr=PdH#-q{wSM0T8yAQE> zmGD9!VF$hSSJSIvcV%Kerx7F28BMS;Z>qac2yS=0C;gbhUN7tSF`#}+sv54ZP!^UC z^pDyENQ=+t@z&c9=%}1Nr&ri`&Rym!XQ0MouB{iqp0bA%@2jcE@4QiUyans3y?P2h zdoV-B=@J6LVBZU*Lg}Qwn19Peg6D4nBejuJ>Vgh%ZMcAzs-uIWi=$DS=AVV%PgJyP zmcBb9ha4w|ys2Xhm{<*0KiD0*X!Ponx_U=~fzw8Jqr*%pQ^g19>i{MObt=kmzg-nEAeqdK$*0p}1S-bZj1Zar8WTw^kaO&W5d?_2DWBR- zE__Si)18pf(1DSa`89`3IML2t!HAd>S473=M;%ijlFf<}w_sJ#(QB5ZdPWd)37mKJ zo1ReVZ-C&p3I0!nrW&P9502qKpn##PD?PlFeq%{nJK z^)o8Y7$=2MAn>u&;d@mI7CH@fq$ps0SlwxE|3u^!`T`do_+G+xI)e_OF_(M#f z*ix=uwN<&?tXid7wbfLuvbe+X+@-;UMB3=H^F3p>-Ep(+IMelfd9uyL`+PJI1K7)L z5*Gfv{_Bnx%LmUlHp=nt>vv`VpYk1m4`1oNE|&3rH}z%=+}bV2;gJSPUbBF*;SsslJ8nLo;h3C<1GJA95mH_c-`j(n&09L%S_>;Qol=FwamCD#q#}q*FSj+7?r!snlPMbCklYQ8dgx z(0lE9+L*&J*fvu~Vz^Pn!HyQdDWVP*$SIs&5=o3U}b`$I>$m@1Z=s95c z;jJF=D$>W#$STrPK*%Dh3cpbns`~p9DEI25+L#08rgmo-E6B+Z!_qz&BI>4_!w=Ap z-S+)b3&PtzvPWWGH!pyFsP+E@ZQ3HFpgNwA5NGZSW9gD7n;wAV`%5K#l&7_Gwf<}Y*t&POzI(||i?wH4N5O)UE=ga8cSS4Zx)p%| z1>32sheh@mejl(m4KG~(BXVgvl0exve9!hC)Hw=miXI$2 z#QC&c_7U~-dEdRJ2lK0D^Qk~XQZGwP&CppG{|V-W`W_T8RcEzIASS^~@2`K9VmIdVrn7HKJMUEM5Q)!z1+g3@THw0{pTo!$IMdFyMs_SGFP~!g0uP&L` z`y<>P(~^?47fVZ5m-x!mPw<78xAoxlHC8e#_vN9K;r{eLasU;cV zVogN7d}I96N6-~c9s(VLlKRAB{rD6&DO<(R`$zXVE^>Yz;^j6N};n=httg~{47rNp= zbR}StKCwXCdWq4yr$I>ZYzlW~?*>V9MP#DJ(%~t=Muv#l&9!eSOq*Yv&E&;0 zRk&woCmvPJMu}juGK2Os&~PKzZf>sU?a(c>&W#$f%LxAz03#(+rUUoaa@IS;&PTV?sM`DP@oWhsmkV7o#eM!(gDwoEZm?SCi=Xq`9JU&w&N29JPZJ;~NI zMD;0h9F~9eGS?~GQEhKy=sv|3=Qfx~bu}pYRP0--XbXLHcxXjzj~N%_Ikn0EIGrf9Ff2+aIh*aWGoYGA<5%7Vz7saspZxHbM_7 zNLA(WgO?ze*vf-3qbuacUxIOrPe28-g8kUmke7-b4AujLR6w|ML)7IjJxTS#kS({y4uEjyN={JrMP?lo)`!19vu!T~`0;OV4bHwAIEh-{Tzd}8t2hWGX5p+|N(g{PIwzbXk zdo!bt(sgDYKVUsMaDON(&nn%ssV)qu!VCd%)Lq+~n;^Y@^E43K)6A?`;QP?YX~9O8 zA4`@WzJ;)uSGQ1MQKA#FK|~eXh{BMwa7`dSv4O6=i@;>voUbh1Q(53QCsx*>Df z@XbZ2JuW!R8M+{lMmfg_*?YmKN67S^LQ))^nDuI8->SCiFW*9|W(6nvb_rk>kfhY+ zX?iLP^np=I@CS6JScjY{HIm;lhc29-09zR~SIIw3u^7Lz-9Y^aG>7 z&kp3K&0kV2*-0ujWG%_-X34y0LN39ffk7_D8N!x{b~eL}**<<$e%TPjDHN!auA^5v zU7`SSOqEE|tVvjQPsY7DKomC>m6`9dWfIS_@@GD`zWy}^f+TL#fqtv(xj_sCDec)R zGtCWuo5;qpgb_tebj|M=$^fqbzg&Ey4|Xyu`*R^42imlzye2J#`$hgZ@K$YNR^9z-rxfX~9L2t^#}3 zvD&tqQDcUPM1Pw(9Y)|4JKpT#@U8S#jm`Wpts(35R-H{hde2*lYSL?D*SL9{EvCCt zveNyI^cP&4TsZp{P~Q+=^IH@V*w_U0J&RCs_-MS3MADi0L7riFPiE}!foPbC-!hvM z>JHH;efH_CF$jmaRQ?C)+%f|ZX9PZ>IO%Tu+@bPH7foOr&YmF~B7(Nh zP3r@!Ya6PTwk(l!Nmn?=z+)uq0lc1zmK$1QM0B+|4MHfMEOm01E4xrHiUT68sm=l}y>->RXc{ zTl`AYuxAGaHuJ-IWw@zf%l5_6-GsR%mp!5$SGji<#Z~T7NpaESO7}<7-4wZt!b;La z&GuAbT8t7%VI$0#?~vlD?x+{8I5u;`b1c=K)P12L`#!z=oO-1_-Z&3S_%w zpPS{eg_^^zo{1g43d^Kbd|Tr}DYXWimIoj9&C*}mUO@UAnZ23%0h#h2ez%N}LKPV# zua)sNY*C1C>1@)osS}7$3zZViRCWXO$o^taR=@If2~{xqc1P4#SRMZCH5*$ zd3;Ty25iH-y0=#Pu34qCAdD}J39ty`treh9EdPw>i9rkh-e2Bv{=oP#{`exk1P zZJ8J`=%k*%a|V%~=ZZ<-uhsYRAlSZ;jMrfBw^1ScA<|tL>6g$k43BaMiF$e1%-~5n zJ7M?iU<&j-ip?A{yz6X$OEYBBkxZp2$q#-22vD7vGNE^0q3U6Eb2jIN{=^Uyyj zOECGcTRb_*Rdp<~o}og|wF_nl^2$tb!z3+IDR9?@WEh4wk<0qjl}iV4t_73&@Xn$gS#vBI2D(T^+BeN98xdtNpuw>xMShDIE$|>*Ib|BA zkCuYUP&tK0xQtRgii}FI`MCW3;cB>bI%DJ^7_&q$+~js6=X2A6!N0P z$Tl792f3S`5E&mo;^NNaZevO#(C>7{0e&^n1vWpH&U6yX`(L80@k5r9ZHx(uOxqv& z5cIB0m&Y8%KQmpLhj&gcC1$H}Y8NvRu^A5c^ud9(aeK^d;cQ^nhXd1j{mvu>FZU%Xest`35)rJ%-bQ5UvXWe zfpukU^rLt_W)EdW!8sH6}T_r}p38f&17i>i} z-#g~4dl7JRY^6$>?g&@*A6;4Aan!~e>VCDcwF&7^wM24f4}M;aat!fXrq$vFF4@Eh(3fwF*|NtSCJivt~SL zvp5<9U!$VLOlGMnW!ISY*k+hYuPd3YPR(+?AIcg-5O?2=;&IKTMC6K9UaTsln8F2? zIrp*-Zk@*djTZ==(#;`UfJ(L|&BO9KcLl#t$2K0B*-^~>td0sbmQi-rOJLjvgiSLp z73US0IQtvsEfS+Rj<|*dRXoMyNN8QAfptpqq;%=BiN30KGp#(cB%xW}smcJlUN+?Wh5u6Qgi!*42ZFTJ_CC<+x?eK#;30ye% z@F-3Z_;GiveOqHMZsWuPTOlp1!ys`O%b?x8j}Q~)b~zCl8?la(*UbzBd+_xEG%!yg zpx#ghXf3`UVA$}HBM!C+=CQgI%MFQrXbC=0x@VI=|CC;JFaDa9=CI+VHy5tu719>} z^y08oLUF90i`0wNG2TflGdOLeSX9yKEvr7!hGnQtAdd?^#kl5?E`sYwRfqTCmwl*x z8-D!?3vUoZ5(TrXb0MI4`9W&ndQAS zlYNyxtsZS2L^k8IpFYvpIAhTridoku7^C}TKSG@}O+%$)az}(?XdgB+KO6*6S9p}y z%>j%=w5X}~NdR5}Ia8u|>`krBZB@K}5|mDw0WL1y?E{u(k4ssu9lJdmZpWA=rDv`I zEVfLwlGMzu)Eld{GrpRc9f7i>4wg=P2?<^muyrAUwDdM|vTWS7tAvPp5jHsl(x-*G zRGEr&c)isUk;9f3&X$#s!>Xv-{gqbd7^>LiJgrHYVu4LnwJ9doz?83)x#jQEVzY90 zxZ`j+(LX521|z-4R7*JRMtKtR;v@YT$KWMJ79vDycMFZd$1~*j?BA|PN>dZB^Q%@~ zW8@y|T+Ckfd|oC$fRx0No&fZ%kG)@9LPYGvajW8kq#;U*n9na%NUXdD5F;iJ@#%g} zHdfF~)M}IKD%})Baw~1d#swx4w=1wt_`JjL!YOUC7BxVA%kXgyrA}ZBBS)%=&VL&L zcuit3LPBqB4g1K%sIrb0A3s1rcO6v`;RW6>o<{?l^2&(RF$(j%iNEOO`4)IJ%W^ml3+y970{jsDlIH@sfl{F zw3{dyQ1Lyq zL~UAGFo9md+TDk}2kfAfwgE$f7`1`X5KN0y6BC)qr3F^RffFJtt&jo=(0zmh3XB&p z%o*=}$`+2w9qYepq?X@(^Fa#M&N*7ro}*q$fSuc0qHY?G&}lmHWK<=tH=voyjlc94 zso6=zw6(M*E)Ec+N31s8F;0_BB2!rZpcOA>_~arlp)OKFd~)mX2^+k`13ODpgvk%h{3V|F4!`}-)aW2?8$yPZk@8n1R+A>81%p*^S41ePsQG$BVhqa2d2Dr)R&v}D$XXR>XC4P*`izzVw- zx!YDXWrVqov%>)VUa`6Y3l~O7Iq2VBV<5)0sBdJP*Jo^r-h`|9M=^z?N4IqHMBP%# zh_R9qmX=ndcVjzx1jap_U+6&YUI;;w?p`~g+eu!ulsh+l@Asd!uhRz|l=tsMFX}$N zfH{EuzNOT=Oy%F$(W8IqcBNjwAYaX%-Mv)8dR`M%x|t?jNz3o8hp0VbM6gVO@`qpS zz&~Mz4C*tDx*dw6_{&V~M5cnVODIz9fW=buu88(8&X*@@3t149LQN%E`B!1aU^IQ9^epinCVj|pJm za}@Ovr8B-F5k}3Fl>=Knb;l+6CQa%F8QAqg2SDouUWHgNKuhc`vg6hUnAlZxf;TQ; zfZ$zD`mXV}979edA?=8*VlrCJ2;g4h!$4r9ke(}^A2?|=>qL$8}Cl*W#d9J)1|y9tSv_@0}D zdZ?C-&$Gvt!!qS-0Mi-Pr z6m$cI+*5e-iI1E%FnnQ>hnhj?$PRJ7Wnzc%0id~+G7mt@Mbb^YXj=H73j07&r%=O< ztmF<=F;0$5LMr16Sr^oNXRKsh=?>g&6D!U<ZW2}OSUb|n&U&%*@OZXzd5@ylEz6v8K;RfHY?6n*JkV=` zhkjDtHyr%AS4Na*iMD9CE^b)WhC8I(^2TpZTg2DedzQ9zU4^jDd*F`~)1f60%u`NW z=Ztj0%wsBVkZ8^kuyoYK4QU8EtCVyRQ@%21m?2TGY5pu`{o96$g=^}r5IbKrLq1|RF zx2G;I!h^D)Wo>HMmGC&<&%gH10TSRID>P z<*CddN+B)*BbM3F?mS^DD`{5hOs2XSVSPi{1V?YnNxaN&CE&Fs;Hg3i0%J4G{z=hL zP#t=>`Jc5bh7ky@6X&aO}wGmr{{RfLLE(2g)=z=@K_$wXal@xy< zx(GW1=(OpDFeUChL?gj?D9TW0O5opt#!StrfILB_BbLh|noUhmqz}gClpDCgSHu+a z+F3MYZm>()9U+^4k!p!xuRDKmG?;cmha)YA<^e^wHPxA|GGL>(q~{8Uy!ux?S~*R}SfJ7JoY+{uz^ z^6sPDz$C7>80Obe;+AQh@@yonaEoFV>RID8H~|j|?Fq;B-yKMWCS)Wga?f;I*$7e6 z=I1`~MKKwrA49JS$v?SrvR7aG3bSTH=j3MD{8FN>r>ZH-B$NO_Mn$Cw7Ac;;7Qwe~ty^MNKl>!hlCP?F%(q8A_TJM{u=0&j5CFg!6cA|@vy z6bPovv+6tD(WX3LbHP7pjlDMIj3SGFx>HoBW+?+o_cw94{hu*Y7dPe4WoyOnJ=m#l5d9E(Q*4Q2IYCU<&T5MuhN z;b_!F+CHe|ZU%E^^0#;nCa9Yd)lxRr@}(A~qdL+TTeYd16F55bDLNAdMUwBeI9&sb@`gFVyJ9T^@wM!`{@?7ECz^Ii4n;YE8{2(lX{ zJ$Hz^-K9X`0(eH0SmYXDcfimna(%*g%=UX^cA0Ld$6+U-NHan~ZhozIgo_a=p;&YQ zQXkQ+ca)iAx&aY`7j{){KsLy}{u_f@b|IlEV;zL;_G*zr_5MeWrR3x3C@m=U5l+La zxa;P@R0&b5x9`XoPknH}l}z0?Cy$^Vc{H5>2nA*PK%)qF{Xc*(Y51I8;ya5-lg!@^ z%r1)&0|oIw&7-4xDgiE+n-qs1dp}u?f%zVgc-wnWbg0~E@WNCK*sIYEF5!*Os#$;S zS-!;$8gvLYa@JR*abZDp#_P>+z%4w>wO`TZIuMw+e57K_-8lz%7muC13%<@}gzaTO z2ukdy zbzx?)Vx2$&Bk(f$z%DZhSf(T`a3c3=UgRIEq&T}4M#$@;XI&F+?!rhvAV~o3a^(Jl za2%f^X@5R)CBig_G@$TZb|6h4G$p6!JmZlH21rqc@qQwDxuFSEm2x|AqN#ABg(J5h z3wgHs7kMZoqhW(lim?NbnbQJ4109KNq(=sVk2|BcRKzd0dwA}qZnSJzUp!vmnMyW^ z2c(0i$~%v0G#^WTjGdY1z8UyrMx{ z5e)z{$|iV4S%1ewk5*xeKUj%Nb}94HmFh5XY~_tk+8Rxox_DqmNpz$_-)l!emjFA?{pL9J-X?sJITQXpZ>TnIs$0O zW9K_!otLy{CNKw%_qgaZ8F~`t#Vwl)qkHk2V=q9AU9o`SbM&n7+|;?Y@|vMGwCLrH zedb5d=oO7Ze*3``;UVUy0c( zn`}mfB9>>mM2tjp-Yl$TYP2EHN0hacYW&F#B!?6$vzpaG5aUk{*;L@90lRBb5R#k? z=EH2_!HJS2fEtX=LJ#_t5NzrF`B+CTr@)ZC-9p&Sqfh4es-?H*2&056C@R&NkY7B3 zZOv(O-p#r%MvKkk{BgtK>+_SqTA29U9SH~SMzwA>#l&O`r&mF2&#-@nBelvNs^WkN znjdnmP08vGw#tb|5Rij8OGgL#~rg?CmAw2ZNUtFbDWW<^yWemSc?P_Yw4|G%Xxg8*yX>2+x6RZrX$4e$k~4`B#V+-cTbYh zc42`5ae?ej_XCj?Nl@##&5kEuU%MTrFJpYYA87t$wDLtFxzWL(tzc`*5d~pc%y-tX zG{D-x76fVuz2HZ2B;rhRy~G;GH}xBr56YK9u07_fbtivdh}iuXdZ;1j1oLWp-xcZD02G=vzn#jHMDB;5<% z-2ww?73R6+9F^zY8dfhxtJ#7aV!D4-YeVdd3O5Q@zBE&+<$&q|>mm=z*f#x5WK7h% zkYHao=$A?RM0+XXu?SZzy=*9vcNQ@WlX!347h9E)Zm}_dUfd zbm#nAt)rZ@-M(PNqYl9dIi&`F`zAUd#zH?@i>>_bPGQ06$SFaL_-=VSIA{*>Q`z|m zcc6(^S5JjGLz}Njv4@x0R?Cl=|8>((LQjb?GUG@nCw|!bEVO(z;St5<3~6e3`0>{q zEl5VOIW%<1=_5Gm=N~7ZW2@Q^DfO91nc!uCdcP+m*@dsoYLw|+ZhaR{%mJ)M*QTtt ziF0X>$Ih0^w@w+f$a zMNj@#)&uSE6v*SNAJ|1^7CB>s5SiKkSn&4JBATf44b=Gv48P%MT);(Y_3Y`| z%bsY&w@A=x_+omn(f^4MHpjM20iOXTc(anCI-f$21Y;c+5KM+x=9sE4M`073)GM` zP{j~9Pu;q(4rUKQt4TGl86AFJv=LF+Qmg%Uu(3e{7Fz?i*Q4vBStI4_Image&!-Ge z7ZaAec>msGCa&!9^k!Sk4exQi@8`pt+%L5|M`WJXY6I$U)<{?UXu3lOAzHohBPtlA z`)kw8Lt7DqzDDDjQ61Uq?&w`C_fgkieKVluPKYL}YAkIfzNl5s9VMokzDCJ@tcK{&mI`i*3aQ zJ8axi*%yx6xZY%iSEM~y4ai7y8dP&2v55oB2=Zp_%P06{0B ziuV0w?kf7iV7v0j-%wIy=RA4K9<$Y86fyf*$)>D2YyDFJ9Ux{yR#uyPfXzE=5BkZu zoiOpvJ^{~#9vyvi8~ValM#!>(og6 z(nUq^5;VOwQ}`CNnk<`l#UQ`b??N54t4-=V?+bIBle!Wcwq0U)(_Y&%GdLELk ztQbfJsc~l81~ulMz0^^ue5*rJTbg|+)5xQ<|7f8Y@i^a3!DMzd^v&qB3cZ3`DjMdl z7tv&00guC9^V=h#B+2S;bGl4+Uop=PIYnG{nf)AR=G?HU4G%^kM-*U=3R4}|60+9i zF0u*xFwYE$$JMPp;$kI)*xMD4xl4@)PN4b9LXay@>6utUu0f^P9lCDf7n?ke>>F5t z3AzMJbj-5G9R6X1`buq{5t5vfSGW}PSPLq(*_6)FQ)qzA>cx>6v&})JdHtiZbv%`W?}MupLZkWuV~-=J|pd5=^M zACQ=z(Q|Z-QPC@*fLy1YJRg8>tkH1a?ICA@^U?_E%vA%BVuZELAw*FM#-l6lPP>G> z0$S9RI~rT>#Cgf1hIDp>+ezD^zfa*Zq4%se4N!z~>b*H*Ra|miQtX4SiC!XkIe;RF zByrg>V!or5=7W0TyTKFcMc3d@T)g|gtJMFStz%-ge+9-YRcj?I6=WY9HWLC3T}eQ| zW>yqSAb{j%^;-NQ8Hij0{IIIU7Fq)d)a0(SW6*KAGrH50=|z`Prsynt(JIcjJ~&RF zM?LoLtgS#`Mqt1(;~S}I_i4v$$G_LzZ_h(&zeHng`LU`!=b{-f4q(uSI&{TT?M&G^ zQwL@6YzX#+_-wdRC@>W8yi$`H4pt|Z4|wRd#U?c-U*ShOBSFkQ_=oc&iG{L8(c7{K zg7?r{7RoKa4bI!3PXwpdKlYj}e;dm<_ob1#3%0O1bM@0m$w35Y86EQ3s0XL&qeEl? z=RU&*koBuM1s|sxoZWp4*V~XanIyPq8gUn;xiW9qEf2}W2&D?7kw9}9TDE1%PFRtF zZ!-ygWc>aV(47hEXeNNBnwrH6$IxzaB4}QUG_6W)uPP4Jmz)BRQ!zWOSGThto9JIw zyl9`YD}xNmK>ob|zcJ=dFl6kXN7GzvZCPHXVZoAC_nMr5^La9n2t@z5JQ>8TCetml z2Jx9!I!&6+Hf6pR`+IWFHVFtC1jktkCO zNIF`jUuSJxNkw0m*9({ur*ivCx%k##e1sXXP}?1ZW5ncz*tH4zyl!k=E5AfitEoNw zFvy_1L9m6z^J)NSd##eOP$Pj8LI^AKGDrMX`F;DdIh7Svi z`6K4d=yD}Gb0N_eLhiN}tP;y;>j^G`t4^$uI4^dN=&VKe%`%d+a}=A1&T0e~g{sVi zE@;urhHg9^Ep%v7HL`M;8@3zktu0Dzmm{)ukdFeHJE#dSspa%x5n_ zW#`atpMrXRT|n`Tl#w-Z2Q@fV5fO>g*+>8AhM77AV(rXeu_b;I)dujtY*n%grQQ%0 zWj7S7N^Y5Z9I`Vg$<8zQH@VpaytM(K!D6TRVJUl7FV&u$JfC|wEu5d~=8#Db|VpSK?YHW=}d zUp;nT$&tgN{^;Zscg+<9W4aW_HJ*dUMdX#}LqhJQBB3OhI2HUaBp)%e+T(n?hcSlR zGO&7QY@_oxiSKxxvp^(|zk==3X8Wtr9+cMAv^57rvRA}GOBh7Y-l990!XKEM=PO}? z%k`4j!9FO@0K2HjXC$ zbxEirhb4y0Gf=HTpOG3LxJZCk?2Ooeo*e9jvM{(v0x$-lz_08b)~GA`m-HfQ>6*P) zZj5f!vCvE0+k9c=tF+X0I9L!8u%f>6d3&wxIot7g`s?%PneW%;z=44=L&^}iPpuu5 zR9`2gjaDlYG@5IO9bLrx%Ur*I5adAaZx9Rn=saySi3J!S3Zd-gz*w8i&@3G`^O3xF z={6Pwkz`@ZbX}T+k(={18`-WwPgd^5~VV8;J(@!rIVg z%S9(W9{WQ)CJhr@yfH~OWkDjCF^9Ew&`eHJ9%P9FSa+c3|L9YT#Kr2u0mD4cdQ3>QzhovbQ(j+@I0(tPQ>qD5 z(r`B#97IMnl*Z4Nkmw(P+N_TrAP%$~)K;G9#HODUqEOXlVnH2SWj;pQwIhZvuy$i!uz zvXqGOQ_%CAw5y1T&_bIcRa0}S-obv;w)TW*a*+hH8Euz7Ri_lw6$rXrhxnM1D79tp z6%|{ek2C8n3>)_|NX$1w&&7*%F6R5gkwbqgd-EEc9nc6ij1n2gx4jkQcqrgmjyWK5 zZ`~x<^RDWwSRmG+@U77|_nsquWRcYI{ZQI6^ zwr$&XrES}`S!t`%)?}}K*E`d_rsvE32kwYiaZa3lZJ9JPKEiu6WtftCyi4Ay`uwg} z#KCtvN0^M^oP+&sj4@pf$jD+) z$|$pnJo2sym%@cr?OS3H$VKB|bQgTfKB=lY{i@S7kyaGua24r8ZbfswQGz}*E`P?D@+_QIu&AgpC~GmMh)o2Di;(M)=Sfu; zd()eHCCJd7>!zl_Yn=l{M@I)@gwH zwB?s>Auw7f3VFci0hYvHf zcqsu=Z|&rot8}0=hL5(q-~JB&X?=w2QyLA!`fc`@V!>+eOksqwp{c_K_$h=A!gkKW zWEi~7xq}lZs!cMXxK=6tS%Hve*E{SMkfq!A!Be~EHBl=~J*zqjFOO9{Eo$X%lZF-3n+(}+G-Mh4U@2_zwxBcOTKz@w5N0>o|A4+uOXA%9+pxzH1>IiV6S2nRWRkkqu5yZ+`INQhqYyoEfzW`I&??2+e ze6q5~S!HEomNT0y4`xZ0=};623;e?KLsW*70>21#5?R+ByQ93aGJUDRZ3O$_cf*j( z=trA3*ixb9UB~Ip{+Ve?2Vu_v{`g%kNlk}$P}fG;u5Ar z+4d5D@}74Qy3W{1>ah>ZKmQdPRxR+@M&A4+vIY+_4M~M@<;b`&0oU$?)X*RALE=-6 z&s78?G0TH>U+e`|YRO9Bc^VpfI&?W4)wC7U|=^ZmgeG8xv z+T!?WnlmH^?4+x>bodGMD{#B8hOQre?Q_8%C9yIbj>y_cEq2`1>uNII@Z6;X+P?kl zCi2qm#{gV$-093ELv?T0^ufQ~=jPF`Xy^0a%W-D!A*U*OSmimdqv9giR8B`5`WZy= zqq!Q;UY%7M%q$*Bv_MbJ-whtGCA#aM6271>n8B4PMCwr1c}Qmr*zSmcVu+?;PZ-gY zstIL-5FY94QqiC7kCg`!BNT?i0T$V)%ox`obR$S74iN~U%_xmE3)WB8gB@X0JK6VP zD(evyOlXGQNyiUhANz!|t_9;IFGuP3&^2P2sYJ#{?Em#ByT(Q~J7NO@S_}Jst-}Az zC$Y9Lv2|9l`)`+&|18^vy`j8+aM7Fg$wOJPI8rEJAq@zTUz+P+uu(sAQkn!%A_Btz zCPL7p3=U>Oh1HdA+ht2sOI^#94j3Vz`hSKtHdf0kN}CLL5q6alZ^*M zZR~^{cfW6UKL2%^;oanY-hN&8!}q}fI-W3FT%Yv_iekMt!P5T+(vQ8UiEOvv-Uzes z0_~|GnTFPpojRj_yR4!moVLj78wwMOB|Ee9q6Olb3d7VMwq3Q@whGSKm4fGuW#`my zegNnm+0>0U<9T82=?6cE35%iY0xMhEI~0rw)9Fh3lhbc|40uBt2ieVHenI!SqL6~A|VymjHiM&S%$MA+ZyeuQ5ZP~R9KS@0`}AEd zhJXLC^VgIu`E|a-nlSz|64HD2hoWWu9|9h+)9+v|Kb{=^{y#-@xsLTm9~S6-q5RU1 zxrJhoWv};G-;}JL0d)L}FSBP~M7Kxi53gy?uc*tu5mK}BtNO}kCLLWuM0ZpvzQSoc zO7gYE#2>5KA8t#h1l?b}%bq!Oegr~a>HXhBJ7WfrFImnWQ8yl0=iS0-ZaE*kp7&;+ zFZ>-JA$Z?XX}z4UJ2@Zt4|hJEU;ceQ64@_f_vth&I}tkwucvol3`s% zWJm>GA2?`(K>dV~!Q~XgiO3^$>=jTtMItC%BF+rOI?^dk=R4Qs96(glg|AMyhIuS~ zh;%2)DqrR5fmB6kmWGJXKVsMy(vp~VtsSzJvoBGOG|l09iqcXt%O?EeM4QRbkS(Q8 z80Z(}Le8@@fdxTNw9XspbeEza(lp3Y7a@&}k+XC}2n>dCoz>HDn zyEZ6S<|Y>-W|&VM$#hp1S{qM;!VGGipy?l1q|otoH%=ctshX8(`JqeJ;_28Tf$H;u z=mg)eCU$>PGE|D0VMx9cDd3Uo5!1pWYiR7_MVuEerd9l4^E-z_;&%GPS#a0xaLzAu zjC(oa=uS$bV1`11kJzCm?JV{SVA*tkND%4leI=noCeNO~lr?$ptvUNro*t^9ZCW~o z5mu}LVrBtta>%QlYed_TL^M6pY1pTZ#F7uLvfgoAZBVkgZ5edhP(y5KFFgbY#J+hE z+By4d1NW|Pj*t!6ev_2GWl$`Flf!W=4ryfnO!HR3f_m&t`j8`Dh+xIk*p^n+)!9~A zmTIeQE$M2@sx7p%bcYQ*tNB&19z+YZr8ar{SN!R9&f%Khx{9yn&CSk~x>(+ba`Fv^ zR#6^BI*INvWh!jU%WbP@>?-s&|7z&%G_`d&*tqzZ2&>9|CN@h~PF7Z6V;V2p-dNuy zL-6!J7R%1p@wee=o6^|W>b10#J6gEtvIglCN~tg5Q^38iytAdz-HR0V*dtiQ#=Q(= zA$%h!?Zv#+e@D_v3n!R+)VXL<;FvH>t+f3N56LcMeOv^E8?KG!k=|Ye_KYos4qQls zewnlEMm2>A%`eQ@o8PA@`H7q5Ib)(`3CngXr1yr0!@Igv-G^XrP<0Lf^ck?$kSY;$ z>{tYB(KkAtLj&~+Ez8NV&TqV=Czq?qFhny4e>oa5#rLSe><4S)i0P}7JZ+EQLKIHv zdHNYLyla@7Ff4(!t>K4L;lxUVgar>(1y6^1f%*y&Bbncc5Ju4N)22nt5|by%IB{x0bz6T=$7!(R`(Y? z697fVj~Wh8a8q6qXX5kTN-d*bIK6LL2?_i%r>Kg!dTA+G)rNqH<2rVDN%CSJjopBp z_Z6J@tD&+WudWF=umVx#A9;@P*=FXjU~ql}_usO4!BfRZ=089k{&{#44f|xdTvG3+TwSsmD>F#;0JV^IMT+V}s3vkdszJ36& z+y5|XG+b0;icgVXX_o_2uKkc~G}G-9pW!-u1XJ@I@bzTVpD^#_cSN~XEVuS?Dnsub zUv?XbFk`sD;0O&DLuwy1u#B`80dM3+0+l5hS+{UZC`d1K#M(lH;N6bF5TwX8-{+J4 zTN?q%a!X){E~Z-QUji{aa4qPyo%p9ATUL7dL3v8lox{j;B+s~y56ul6KTU1u%*|@rj z34^_%LZN^hEy62^)yPw;D-kV_KTlLjaP)!7l zF&Ny5%ha%hVGZ~u=cYHI!5QMHBbyEQW^oWOnX?yA1~6VwT{*jNb_QZAL(v&lGq@MX zVe@Xmj%;vguP(2IR*xC0J2zAAg6t>`DJqNq~hqFt%E&}X+sV^Tkd9eqjF zuTYwgsv;6l{Iq7#goDo=G8_jpyGGaiLcy9Rtp+tzdQFxf<`6+&MPeajaXn|p9o z&7FO}52BY$kQco~fnZ~2`90GGs+|n)olwcy!>E!yhB3@F+jyfwyqYhkC4gdMZMwJPWmsssY(%c!xeU=JmA`llO5C$ ze@O^ezGl{z3xG|ziA})BVru2s^ID>S59CS|aifqG%S8X0pCX-sXmK7f1xxbEUy#?b znfI3EDTvU;dWUbQ%rfrck?hMz+G%Z%3}PsOa^C$g(k*j|B6Bqw$37SNG{=*1&+!Z# z!BpzUAMQln_{cgtkZK|hzffv&#u(plY2rY|k)b3ubWe_!5HDNaX&Js;@Q-9Gm|sN` zSXUgZ9Wi5YARm~yX|g?y%q!Lwye(a^?UN<-XHgW`FC9`~wwH_5)+^e?e{6ZqJjHxe z9^hFa2js5Uw){M#2fJ0+!C?BKgwDK79?yy4n{b4AAnVUBiS;v@_y$|HvMfoK?`!y> zM3pBJK4ad7Nf;uvkBbl3>+ENdAZ-W9rdX@HYo+DYo;_LDcSnqdp2ukBV;;02gg78i z33LwQ+t^u-a>^9*UtZmbAIu-*1;ffN*%OOAHjfAzzYv#>oY>ZcPi$c?ep~xdmm6st z^7-r;Bv<}f>M6v{7Y*-sEgM9Itl;J<)HcLp+`=!9GVx{{(v@9%Em)z>s1+K1I2+rOmkp@pL^tZkfZ)L$owLr3y5t!80PPh->Uwgr6fuNTqtU`Z}T-K}| zo8oKFF&D2aFHdctPH>$S`$H>$XH%Pmfe5F69i>J_#LVZn(RXUx1Td~K_0B3pi6fcB zp@~&5T#CS~S_0!8f+s0w@E|cd4mYfh_@;}p9AaFo+BwyZQ`;%6YK<+@&_ri}C&Pr2 z^gTH6CXJca1rvn3ok%7Z37Seg1(qM}P@6r>tM$5bc2;lk^`s}D`BxA^G>Fmcf*B=- z9H)hwGYo=4Mhv%h*DEPtNKQu_6|!hLWNDpifq+b>f*}94f-iI5v8^?%9oQf%)_NEj!u7XzOSfzi5_=W6;r*s z4$;C$8h*SVGXnza^L5#Of<-<%H!Kg^fWNAlE*c9rAp>#~JX28hz6Lb4u#V>Xuf92_ zy77LUJ+Ar+imNkRx1zCiZL{NtPaZZ5l||`?>z~t%37uY0F{TSIp2!7uYvJ9$%?UJj4CdOlVsfXo&vMG6_af0- z?5}pXXQVNtYfC1ya$`hxaP#hk)2l7Z$wqWafp-Der&U17($$A5Ghbrpe5v&ohp#nY zDwd!P9}5CrvfXI| zR22XIQ`>aP8b)H7tLoRvu1XPFITzOyhRweIzA^->gXSHTrWCko zro;?7xq`i?AWyGaOyPq3_hv2=gN zbYx@aO>%K6Cmkdzap=iU7ih`PKSV${B6z0_5@jvpE05hp4D$~WD10cViSA27JRSx3L-Fj}K3m@< z{Cg$7S_8HL9(Wa+qQi1WrHtAJgqKV4ldbvW;F3Tj)&qLUXJ)U`?!}(waU)EAMIl@$ zn3cj&X_au8vO$Rb-Kr-s)>oM$rEn3IthT62R!Jk>Uj|q-EK!zTIEH3R)&<#W!?}%B z3K1nY8!$me;AzYlDs0#hET3-Xk)bVT`E1iw*aWyvte+ZAY>itLEpP@Q5j#Zw?!Ss^ zm5Ht938zrAaBmP|X4a(4FL8 zC6O-_!_r?ma_XnSoI2zWh3ma(Q|{-kxCLybcc!iECS_WuGn47&iY!!RJUTxCzjw}j zjeN}*K#)Sg5uW|ZHytt=zsi58MJfY3iNhV;a7Qj$jfUHwrf^AU=0JH;+EUY|a$(~X zw}TCzpMrq-zP@QCDzR-|lE{^@@CzXd+n56hyR9GU77~OC9l*^M;O{fs3htZ>D@^)B zByU<*$7FHxvXQkLPMKWzXwn*%h!ToRg_jN_w1!6XMAR0y;)@#i4kAsG-d`|L^f_YA zO592^lnNW&C0GSKaPt>Gp^!2Sl?$JanpLxS(z0D6O?v3PLnjg<)hTwSO)NJNVS2Qo z*8(;7m)Lg)kLt>K!*5W2&Du$bcAcb{4(lIyNhg0Yr6J^Dp9P{yCatpU+_D|w;DHpy zgZex&w?ksw%%fL`o*yO&#WEn$!b-9BaH7#{Tg`J*` zw%W3WNpG4aL+__J<+n(%67*^!t}_QVIl3V{AN9ANzdUn_`8AZ2&gDAlI0_>b6IlaZ zT(Ji-fr4Cx85O(m+o}!CnaTP?hp9&Zb+FrjvF>u|<*Md+r@X$DX(bIrN@+IcK6kw_+@jmQw^_ zHpvEii1yB&Bv)>+MMj(!mx-K;s4Hf{#Mv%q(tV{!Z;?f~O|{T3-*HJ)sw?oexPE5E zS|UbuDKIOBbvELs{m}yi4lKsdD(QOR$n3&cY=>?d$hVzxZVZE;e{bCpT`-B!HD;&K zyblNyL#ky_^LL{3%n|$X$tUuLKe5&P4zi;wr&=0+0b0^qnC~;B|`()u3#5t3gLx3qD9;gVB0^ zrV67q_t>25aB(HXPCCp*c`Xu2I<^()ub>Z=v}5ECa@xSsyqp!K!}#D~QI^Xi+9TF! zXX}y@yz8T8*e+08kh4ZBiY^>C3T^;33nNqJr z8h6aaP@9 zIgH@q*niU++{7uLq^8tbuhkT_TALc(-l8tbPD=R5=ufC)9Fd&SDxTL5bV1knK4%;& z&jz!sPmP!sb=+4;a0$z#31Jf$x1u&#%t~ulisGAbEAOzIyag2{<4pyOGYf(<4yp8- zD{J-}70pM~nQ3aP?5irNi}~_K*8vupMm1dwXQm)oxUF(3zwDfy2276w+z|8Zi+^D+ z7fk=nwX@A$cc#huift$-EFO#^Mw+40cqyv8pW3Kr2tR;5_(-?|3jH+YPuM;|AVZ$W zm5XcL3RB?Xs>?u{(<}+j+$eY@Mt$)lz8a{LWV|E%D-s{1XOtCx`4k)kB`EQ8n;v!H z4Ixs#d%wl;(WeA8dc7G~dJX(6#nhT!i>|!|TJD<{su=a{Em4N1#2w;lS!@$VV$(k; zb6L=9@c4|@iaenB>~BGsdHKYEexXQG#k1BGN+h@|UCtvT!TD3q(w~1fE6K&jWjF4d z0HipeYV)f#TJ2~7^|7=d+PTaJ90Nf19L?4!;bMVqWXYWfWHo!Brskz&xL;$O@sv(6B`|?aU!xkB5GxhvDBaLf!$0^l zu8Bs|0;gO`J4_JC=9>n0=~7B`rb$RZOB|CC;u3{r^D|bm(M8V8xknd^N;ts3c$oOj zE3Q9fCv!4Z#vCW>U`9PkCc(2AQUPL_ma(W2V%|g_fs2kmrHmygRgiX4C_t!CtEu5m zd(eER;PoD4grrwLWbz|)IK&X`@+qQaef0;4Q=@_j9_|gQg@Z|CS;Ig2}`z`hvks=Q_(RQVaAp&5q}w16!duA zdIAI2q2>{MReTdJV1!-_tz`Tg?hoPIi&O^WfvlFVY|KQ23=`igcL$fuI~@d~Pu5V0rnib2HLSz$jh9K?{9rVzn@fSk9tm57;9%c}B&T^) zl8Prv%2hLlbZ?vCTBP|HHnav*t_ll(?y98vzxiJklGw|LMJ=_A+(u$MpZJK<06tq> zb}TS*=J$_m)QU!aCH%t8lBWzDN+t9hlb$$jJ*??jWhg2c9CGWIzmoZXBgl7GcW zi6X?m=H?gwnLCjOMGC8;c|yh7NxxF5NZVbabKPCC)y~ozMoZmA{Jw$o#=E2lw??cIbN=_hXIyk-5Kf8kAA#G8i0`f5T64>kadXbQ zv?Te_N=ocJX`YnhGQCyO-j5Er^rzCy@1QoQK1pT<_8C6`M~aAF-wP_lEPe&e%AOgbda{()z_<1 z@&t2->f=e{K73eXSehZjjJ|(AdP_b1O^$&n<_?)*W96aPAr2sGAdxkZtswlZF@!hc z>R3YAy2{@zTOh7AopTW}xREEbtA|e-)5W{>&9=MG^#sEbm%3xB)t_CD)t}+43oWq? za4US{LzdpYS=i?r*NWpJXpywO`y2JC{6rV2=rlCf8A4 zjyE+rP#13a{nepeL8wu@{LwEV>n-8Ows!jrH>kWzuOLdRvu&w6>vTtK=U|3xF#@l{ z3>N{N01h-}b=2L_D&F{RY_VOZnTkMO21oYjfje`mlYgO%8Z(7=Yg-JzClAVb0PJlr zjwbLjG+aQ7(60SORR=@z29EGJakWuT{V3Tok9|vl;)M7H_%a7`O7RzKaNrfT`I>H! ziKJ^O?z&K%Kd$C81t{V?h`)0{qIDpedjUy#xD^JVEOlmpYGQact`dP(BM6;C4WQKl zPJ7~PNbNoEHf*}SnjR?mzScd?HfX)j%5~LWE(!g7uB@G*5Kz*q4c9=*#TRRjeX3`j z98E$gwg&8hDx_F?kneb@P64=reHK_&3v04iof#I^l_M>CZ zK(CQAQbE$gLpgzl#v?cx#I1p$6*qN;QGvS6aAXR0%i4<0w>@ocwBD^nGF0Kxv^}c~ z1a<95isLC>d&$)bRTbGAl~T0LwOI#a4kS-Jl$G0M8Pur0;JkBnaN}nICfc_xFsXK7 zGF_aGM||doHzX`qp+|PP zveTfy0MN8l6kG!=LmPTSZA`cg;5I{%WS+IxgPhr$0%ZjYL2hWIuH*qcT|h~@W)!#d z1F-H;XnExvn0kWKFL2oqy&=rItSsD+{g8G7>|GHhN3?CfwnHa(b=#1>pjQWX6#sky zyX}3B-tb+9!tb8k5DLBi(*8o$3zM%qGShg2*UFg9fY7g-w+}z+2e3hXO`0-~OkkKD z$>hyC=CwK!J<&bjWt>trtQFH>yV!wYmEt_{vLR7o#VkdOdX_ZcTJv}X%No!#uzN+w z8rL>RUJ`J}ekS0~ZW}JHl~%>$nv!NWo_SMb^*64|`0`{;N3BD7lVuH_)OmD8)9y;I z32hI_9am~{@+Ya<<5wQ~s#VkUvofH(G6a7jxabl+)-Oz&j`!Du%BV^i(Pxmx@Pd$D z$~_TF91NTC#!LxJMH-CP5gmAdcEWs8g@JoRbY|IzM|tpi<$PlJG#h(VC2R@%+~n7# zZbj)YCO1P3p8j<9>faZB3ztI(K7oe|pWZLqWI{l~_uoF)qiLNEzqo;g`U`7bP+14V z)j`{P0?UROFimoUrKt2O2C;_aBh+3xA$WuVa-lvr&@-Fg*Fj56dXa8PC-ovhVwk&g z>b~fT&)~HC3IDMt7u%9I74|cQOS*z<9huP-4?K>B@#RK6#DDkGK5+yS}qT7{rAVc z%0Yxp7zA!W0yE%_rW78{(x(wFBcLg~JTQX?=$x9Fn4Vd94|JJ_g!RkD_!#Oh*4|xM zw_Op|OS=MiP0vAeQ@=vD_4w!ip_p*F3*K?3Xx-ZYqyZ^U*9B1${jS(s%fd9fy*k*XN{v+L{eR)1NT&>pTmfM5OAw8 zqPG^44m4^n&a2~4U)Z!8B2Hokpcs0BLw}~6;?xErQhc;aEMmCg$_$(WusWfR^Cx*S z@}o@Lgm^o#GuL_RGPhvN@?WeC;Dy3@!4z@o=~NP(;+LZ0k<;pZ>~S}1-Iv34GydCEEv*wr2^%%>tEb>S02mDjy#{zmGG%P!AwNU77o^gDi)A0C7CTTAuNo3_tPYs zkD|vj5+RS?Q9dW1p14>$ho_+R6S?~?np=)>Wn5Zg z#z-G-B9SF*kr*G{Vt~IsQT9OBu^+59Epi70PL`1ZhU;P|pX=%%dzO*Rz9di(4D9+T zo_?b=xB=L_;L#es8==;Sq6DL0At(pH>q5exn9=HKC7=mq`P^QC#~KbEL2*8K?G?LL z^M{n4;Fn^b9n$%m=CjQnO5Wo8#Gx+_IV+Q}>wd$H(15uya<2K+8~Vf zs%)PfVQx4?gKde~2QSz%^4lBO2x0Di}Nn8!__4I{mnf5VMw+d6~y-GVgyE~RVzHjDuguEHo)dd=W+NYB&lQ<)KZcCu;zX0-~le~P70Dy(N zj1iIyL z@QCaxY9>z37K)MaH^Y!5WjcYz?$0r855|}uaN&=vk;;C+4ovn=Sd#xcA?S6|E2#M> zo(T67g3JlG0h;*ZNgM&ZTffq_5$64P-T}%;>6B-TB-E(;xqR6I1gWqf-bgz{gEP;a zJs8zr>`U3CGPgS1=D!**C?EFJGGrtPf86+>`GpQ;bf9iKZ?3jB_rR)JdGoj9kT153 zmaq%({tbt{CokBBMRTcAcp8Q=fmS+vAdT#D-z3G){s~n2Vo|v>o3rMJtbB#3 zOZ|pj+3Uu=#(tT#8El=$>WP`4!4~Q4OWJQ?`r=Rltg+DTkhqn#St#%cVQ-313jp?$yT8=X z3V`*4oc{Ep!1U{Xoz$OS{Djkda?^;IExm{Do8$-M|Nh1G!cREx4UT>%zi0V{X?>vI zcjexTUHv)uQAf+N2B>!mn>b;-8B}`u9U3oY9uL8h6{&E1&iiDh9H}QfET9gS0xmk7 zyy@*3J4nOJOddlNfHQn$X7rcLPn;9=;L*u}zMZeA_BE9*%LHDV zwW+mkv_VylD9?)!8bc735MVqEM>6)KltE!ONKJ<#4__a9L!L)T?YFE)kV8kEBcwu2 zXhi(Pv9HAB$e4^5wGICqgyj{w^ud9ykzzp+J7okrBy4zv?De9tw2KY~T3Y#RY16P^@-h#!b2oo+l{QxhYqdpBMj(NB$N^ zzVoxhD8hm;=J-80ZI0X$NM{?cw-0HKZ5uSd?}|a}`)hG1hXaLwAb%}Z*a4m;(rZt~ zdWQ}#Sau)KCUEILIV{(v$OFe_1$pX2VDdF(Ck#>3v! zrw!M5ukZ$Ox9+nsBo(g1Yr1xLkzk14pzH;8;!B$1y;scW18EA4elTJmbu+ne%1{S0 zO#)B$=EM>5=tv+14a93wnyeuJ;0n<2dc*PwHEpBd(+#6v8G9|f4Ka>Tk8X`?^A=PZ^qEWeQLpr(i}$S zN+i4D&Q74r?eA#R>w*Ih_~R&k?VbjNhGdEO5xS-_-LXYU8AC>6GQ+cdOtRF?Y5Phf z?$1E5PwAxqE}TSRZ43L~MoXVN)eNY;c=@%=|Cmy_8Zd`Y!1VtaMQp?;_^6P7*TM)D9O_9QI! z@x<7HxQ8ne(Xrw$WN@cXdK^I)ujTXu-14Q4O!tLbY#PKW&SvC2gAsP;m4&sRCJLfA zO9aV=UYZCWpwI^bD9}#(ju0?t!}`HEamXfRSiUik#&F6~hyl$waCjMze4J=(V-5(3 z2ZU7Qec+A-CJE$y4q_!3g{QaP7^z_Hbu8It6^h++`>P>hw(HUUFKG((Kpx2^aF;g6 zeROpc**35ay1hjxSH^?MqIg;ut3!I3WKr=whGWUa3`%lgJe;55jf@ZM@!bTR67tn~!Q`HQa|1=++r)??!j*Fo@*WqNv zQ-;J#CtR@RO)3*e=SEi5hD0=ME4|TRj5whnBesN0kc8k3ULU-Ui6~~7hi_28H2N86 zPmtRXz{U$|19B8SWnamyN>s74EO4vnw|u~VYb=6Pva!(!GU zYJ?t4B}it>Tk+TDv(BvI&q{>@ctGV+%=*t3K=sZ-*w&$a*G&~8o9^c)CeZspa;+A+ z`U^aQ1RD#SS!B({%b~6~m~<`$Zcq9w*e1_fBV;DLrZV2D2JlkDoEz$4$Ec}2{|>v( zcBRE^N~uT$Me_fv`&-B;L1;fFXFu6Us2`fIA_geAY*27JAUMiU45x)N|D6ab^`gP| z8nwLGpQPmJ5SbW_b=*VRa?8t?I050D`OnX-> zXp)Qyl9?ROxIDYL3*+bl34@eA==KhpWREIKnX(>%juG9c{lBO(rjM>k@&HK9AsAM3YZ9A%v#%g=Eg)=d$Z zN5M!QT}!dxy%RmxkAeXoYiIyh$`e{1jlmh)SjoPzsu?rux1L%f;$Ou(s5`G5-TF<>x5CxxSi`P4*Uc{ED* z5jw^EeiD7ck)9C`C*tN|yg`@`%~t%63mB;s0Op20;W=-jzTo&F8u4V zAR=+zWUkaf8FA1lN17nfSTU=nSjd>!!$t&BXFP8Kv=%8S=Af)h9jXyN~g5q z`d4!s{;+yftgMWH>&4wps)Ir?)oA{SbT zEei=<7^PO|67CfORkHz{(KCis2M868m5s8=x-x3U@+_;u8YW7Ye;6+0zM|*HPX)Hy z0!tnV9co20VN1 zh@36D7C&|xM4^xi5s^W*Zp@6fez60tzUo9K4Vl$SQNuu4~B4* zv;mF|G_oS$e(F4482u6JEoJ`@2W0=ae0}milwwDU>-Y8YN~XQi^(t5RO0VGMMdK7! zjDQDXYZW%_u;GwjpJ(NNJd*{txO2RLKK z)c$CoOgAyN^s`-YY}cH}yo+u1bSqPAlH)xA&rUbKz}xgg@5AoBB2tXH$zvw*bofc~ z<9`I`;;6P{4|EA$$hKqr{uE;Q=GTayQc*2ETDxpL{GSx?e{lV(7f}6dKU_cO57#gD zKT^Q|+qC#!xPAv06DQ~YE7q^NDTl0xqHAV4F{e~tP~a|%QlGqW>kC|DSZJt34;*Mm zHpq}KUV5^Wp&TNA3;F?szcd6{SnC_~{WFzSM);2zx13!l!h*}|&z6s-*OgDn^{QSk zusyK)qQrqS1ZH-<1DkM|)0@4X6}q*~(p_SV12!_OZpBF9UJ~qZ1#DW5KQ-!$qO8;r zi%@&R`Hd&B{XffQqL3Tj;o>=mBprL!;oZYlB#w?g1J%RC*}CqD5Wh}M{f9vhH%09-j1Ce;0%M`GLqeo z-?2u`x5$$*w8nq3dpQ|ZH_AlLp)@HDKD|?<#b2bVx%8%scl*kl4x_14K`dpVk7~;z z&Ox8+FTiRvT>sJVaxgzg=umoYW;=F=wf+?o@;Tm!JYi?4Pl%BW-L9La zK@VSVYQXgTa;cgB_hy7Cl_?tflNaBc$cV6{8x3V2jxiw%4iv4vat>dy&B4%n_WS!i2D##XP(>7q=B`nmy5t=~r zWJnNofN@5^V8Ii`BZgV?ah+pCVYBovr$j4Rwm!LuxBHMSSss{s^S!+XldZ&JnVU3L z;vWwCR#aE+-7eXBHKAv_=_%`!BPTD^f>ND1PIn%*U}-1ADX1~D5q%$YtpQJIQUnff z=NROO_$5Ji?@nI~yyD+x8&auE}Ncc6v0*vLy@_ATn?2s;kL ziv1FpnCu%Q18p|Dayru$#@jktu*<2*<=_{FBPOIhgKbr`Fh)^}tjs<`Xqi@Lz2m|f z;@eZ-TWmI5V`(kAxRD0zU}`aY>hIL;RgDFrkzTY@3j^5UVEM4a@ikZIPKl?4R5Bm( z;p{$>WU&SQ|HkK=6pI29e**!b6956x{J(dmvWcUsiKDoqos0c{f~>_FKO*Z@m#^BU zg(@{-1Q0?P;>P2nl=yff%aRkbB@e!(1g3|KwdzCTsMjwpvf2||ELqd4SXXHsbHpw6MF?+p%{{s82*!u=X=2wr-38_U) z5qJgBj^CR=c_pd_MnM)&m=5KaDoMaGn<5Nh+1gk?i;PS?vw~!4cDXdaxVglPbQ0=# z8ESWiYZfZN=JML=3h?r9=U87qK!#T+4QF>AX0mkYiJMF>QfwF0Tf#a9+UoM)C{_)k zROMaX+G*+Vpibj=8kWRmTIg7iW=3(UZ?34#d(b{8olAGBGPLNgLt1lOZ`@KIa2l=@ zw8(e~TdO|9CD6q*D8`yI5dZxwYOyJ$@eICF4jDKSjC@YX!DsDJNEJt`P@Qm%DU~rS zE1bvNW8W)=O9yqFRmrhGnWYoYEK(V1Q9PB`+5&b`4)u6_h>ublszK1aXS}d@`>Zyx z!Bs#=wIY?CCO2ZIp zAhb^4U~;liPGhy2mYCq|VZYxpC14s=6knAs4+80$UUhL{brJsJ`0@<%{OJ7RB+|hF zc7UCQEq6!o!~Se?d7Pgf=!sXxsj*_K3X>aXo-!{;B zPZNN8D9GXrHCsKbc+#@3Ey*AWbsBmD<>)BzFkx4I+4E?_3#*B6dAu&cd~v>v9tz{t zsqCN-(dpi*r*Z)^!*|f4M~z^*E}0R|!gC+om!4qms5b~XQytzbJQwtU2Z{ozV} zbJ#LH7OkRS2nIm0q{ypalulk!F?UuV7QyHh4JOJx77;-UTs&Db>qbRq>%_Y}v%S_s zd3;R~*nPv^-E>S)SxbNC`I{n&G5o2SB))C1A3~iH*`@w0ux$eIu^ejOr{Gr^K?K}f zN(rBpL`l?vKV?c{u>o*F=kPJ1QTqj89s(O5w#Xm6mR(7T@Gb!n$eM!X28N1gMtXKl zGia=3y3n0jr69;NQC;4VSjJ+;0ZYZAd8f+}fFR4rSykcr_82whOOkk7ad`pPRk0AA z@8BQMV)XdRD4S3;=>lcK-w7Vh>oo)SsoD@jE*;=W^%cdWYSgl!_Htzj$5sEqx1b}A zAgUp~>z0^R=t(wH8KLA}?Ez0)m@_%mUjrOt|9&o zRvaA<5ilaB_$qRhaUL~=xC(xtT3flwWS8M5@w8*wDNJG_PjDt%82MF_tD@m}WE(Qz zm;+bY6o~I~-efG5%Cy*m_h(&ldUAu#m&yKN=E6A{b_>GhIcGmE>uEzr=fk<`RTWI; zRn^O7PwDMqDhNxZ6~vt76)@#$DpcX~8cS1^2Q~4)PEX`c5yjR^OT zm$K$Nh113F+Ml2*3K^G*E3(Mjb3c+j;!ex4UoOf8uI3l5wXP6o4O(>+T+YmCwoBnJ zY;KTj?&f{b_y#~Gg;qeIAagk$_H=)lHEQKJ z_)==O<_iMM(tj?n6&8M`P=1@A^hkSodlZaZ#s@beBk1gRR@0lpOgeCVn$_R-uzHrA zl%}PXbUV0%Jy@tud}tIlv<}-+tvuJJUr6JOYAU!Vzrry#<3nLTk&Ugg9OcYB62ljQ zyk9|GONV695%A-^Zw5(e^ZbSEh7uY%ub8ZANxdjneP{(WSiFd?UnQ#nEv^iAG`Ph^ zZWCrlU^SCJVTLDes$3kP(r<@oT=_2Qqkz!AAFFf+DTQH{;2a&HG=U!iJGKlkf#b|y zu5eWVvi~4#!DnjHU)g^#97$lDSZCY{=2~^=6EHeypVE0fr2T!AZDDvww5%$tC7e}= zK13s*f|6mIdC(ji2qG5Q_8&!r=rjuZOi>PO; zlKjhdIze99v5~b7Lh)T)t*p1|#@K!1sO5+GNTceOoPD8`g zYVQhX*heSHPwv7p>M}uhlx1n$`T7`kkx5O~_q0DDk;SblY;!#LGRj=TS@SrAh?j6E zfJq5^Xj~quQxBRJUc**3sjJ4c;|xvUZgm|7)uE(0eRjo2-OBF}xBiY9ax5qX15u}e zu(`h}4nYRBxnT8wL53WHsdpwH=un`4vyZ$?qSwTZpu98P&);`@>bvdaZLUmug>>B@ zy3xh&+`rx&aq4(09MFw7Kn=sL{2hLH{agIdUHt+RM;uXLIl}hF4j8-B50){_&!ojW z#=A=?P6DsnW0_n0LD>ia%vOp{$`vsSOun`PCd%noes-N-41=V)>G*req}C9SNs5A` zwy{hPa3b9t2&t6oh|DSSiVDY4q}3{McW9Ou{dd_kF=sf3o3ArYQG`g?12~vlpoeSd z!Qsy-8uotceiQP}2giK$1YC<)LlT?h&ILf#tG1l`C8q`gDmUFUlFl8y8_b~k1-(6H zz0}(+BQ?`nBB$bz^$dYi=_ug&r#GqSL>3p9)W9Zfg~Fsp**!s3E_|U?n>A;6ygJz= zSBH0?H@Km7Zy%)cw<&`49un*q)v?Z$T3`!kC(H$qiS2>ku>=Xiy85zbS@)&Bc1%g# zImEg4K+1ea>5rUdeWP)X*NUNJxf3b=fkU><5A1`>a!|E8aKp{XyZGf>{qm>ImE(FO zXCLkk9%q;UCtPaq@DI@k>b9uai^8zYfeWjMVsWe&w9S5a|4qG4MDGMG)9G(zZQ(+# zfeacX!J(?1_=jAu(o%5K-1`VmN+3+)x_030Ie)FG6m{xs{J3DFQUX0}ttRVpMkbsG zk=8fXcibUy&&dVHHj}wvvZ}*Gn<+CVZ1HMY!Lnd!7@GoT*=&7)YM$PO_wdh5j?gZo zY<(@aq2)wfhg{}c+Va6g3zE8O;CjZeCrA=miUt-b{Qk8hlUY~9C;ElM1k0bTHIg~a zaMT@ZDt(r3S1^pH-JRT*r0B>r`O5sV zs30E~s{D-a4mODGIHlYmym|8!hgueaEgkV!`KO{a@3hR zyY}yt*HR#xPku(N3k5b%;67K&^$wxgd>vTD0}Tgb6gf$K)H9wXeqv zdpwfA?%m#29I(6~s$S`vcXiA$m}FkB%-o?jy92M(MP4zR zJoqOscS0Y(bo$`#s6J9Fc!p$d8D@MvI7Mb1?4F3<9yl;M0OnN=V(v&L^<@mCtfPg~ z=x-vjT?>Aa=I?Q()V&cU zHax_$4mVHC(i9vL1+qGTSjZ7eaucZ#**j|wBgV__dbnxwxL)t70@mh-{WX2TxOCGe z4@mKlb}jlNPEjl^7dL?od6T1}Xqik}q$9Klc8ub*Vk!5eg7Cz*P2XLr(MjjpLPt5R zdvnl07{n#kE|ZXeJead5!1e{!ilgg(0iPb(39a`~jK$6k!_So=`HR&2_(qj>b}&0~1!P7{l3YPDDj zRoIv5+G0CRWb;b4Fk9P;ToHG6wOQsEGG@mH(&pAv43k6=e8y2zIMW<$HMr-B>dw#` zPgEv0OVH%jX(NPH0!*KOZr%Xk=z=s_v-p3X$fx!@Lb}inF{1zO4}9Z^o~&Q^_2 z2&sz{@D>E*>rDxpmWT#z+{dRc+|P@984{P6_IRuug<#ez$2&Y~_t$1hz|E5^isc}u zTpOhXH^GabwU03XD}>5IxqhQ;&b=I(G_{48es~FVYFG{>GOHp9;rRvo{W9Qcxl#Syq=xBA9Smz#IS^}Qmh|c_h|JGZY^C-_X z9|LhuC^gR)?f8NAZ!ypI6Z21oY}e~Qv2OgsT%`GLV_v{i&+G?~_b*ZZ9|?KUb-3T@Ar&|KJ7xAx&D1iAd69%NiI88LgnZ{l$sA|C`QHpg-X0JO14=2D)@-@A(7Kcm7U*32U~wDp7g z;mTlF^3rf8hWI&W6(R|BiVXNelZF2rGDhE5j+302bg(SdOvQNqP3A)ki#n$>d)3tBbl+S&j?CEX0B{aoqKmg`2Zgv}u#C5=4O98attdIW^XZml zrL&4AIzX&hr?>0Q6n+NyzDnn6p=}K5a$y!WRq5H*7G*dQ5srH z^jZ{QBcj_hcoe)CXG|7vO0P1^NfV@5iWSg%>^{~Hf_yMljWr^gQPur*9R)5%QyURn zEIM_fkSp9OK2sCHCT7-dayjaTrWE2T*yMwcv+J99hl)|>l;a?ek4_ho#CO69oF>Ia zi!TgoYi1bXN8XD_+wRc~84EIeZlewv`)PNwg%GalnvAVtpjUL8>0Bls%7b1{$SF=2 zc_JKsWXqw-Q&KUik_PGO4CnFGXS#q5z$BP@Yo?~@5z=vP@-zpt)eQL3&$(}Xj}-io zHKS_p+%b@4;L=j0F zlOLuf;Xi)_%^Ym?91TqW^-We$!{#6EH^kaE%NbS%Sb(fl$o$~VNG<}R8uoZZg(>Kn z$Ye@<{$Rw@>)Vc922<4<__A@W;5hJ&zTv$5{Gzj9+2l>KDsq<)FiCHe=@VSE$4eAj^liDeUnNUiq zr5e*7wBy3WFi0i_Rkr!zj`*Q11%+-EBimTEdKX}{(vUgv1?H)Qc_AbVRUMCEv~yjA zcyo@}vbMZm{B3|9_E&vCe;fBcrE2+Ikn>mB)8Y6M(x$K4G42YInd4AXUAiH z-zslnD=tWd28bhsb2W3bp0Xz`98TFr3~rD*ku-ks!RZ2ov%Hz4`le@fyws7qP;oKH z=zwNlOg#j0R2yB}Ge%@1Nb_#zQRkDu*M*3i-&W_0d z?btLOTMfCkYj;^i^(oNoLUf$uAkkT-V6L~^4*=>R)Mz-waYnHN+EIKOOW#*(vKFx~ zgfN7f?Nkfr1v{VWU<*AH*Of)5mg;iLiHe0a0s%#Wo!Ors5RXVhdY6xAL`jeJp2K92 z`bh)*t$lN)TI6z^spr}90UefU?ze4D0p3hO8{g5A{nwhvx??u{vo|Xx-bS`=D%{jM zvzq?ULF;#E;?25}aqW?mun(G?Y?h`=3(wx8bmTg1awmWGal7mKkUu0{+i_JhsYo!c zGKdsfD>TGYAu?jjJly!NCmdDwD)-Ui{0Ley7?x+_+R}<0u_D(y!o1JIvw6G$tf9gCla# zh#{$irwmc@($+G%23D)$?v)!(Ubju&ToPLniu+i z+t4hf4f!8#Etfz&rI<1=FNh*?+Yu-Q3xE)O0C;*X2r^tZ)mSVvHAib&u4lN;ZUUUL z8<}UV=QGO(R7K~bbu1|$sC?2{cJ(!PmzS}7_s8oiL@zo$o*+Ej055(dX*{0#+W@*R zMxPV3@N5{K4aPDZA|H4GyY(r$NvRTu+-3JPZG5uzc4Lq{GYx8?;&C#C&Sk2;!vwQJ z^KP_yTnv|jI6LeNIbN0qG7lM6UNQP`eu)^oh7owNVKf6{VbB1YM25wtR^75?J!6s4 za=i+bit9U}l*kn{#-$*&un;x__nALV_arok#K0s3^*dB;|H4&y$1 zduEp@N~IJgC~>Q_hepbz&(CqEBlWeCO`}r|K%d~)pEVdYG7fj&AaTTC)g@QtHtUHK z#qNC?()tVV!M1Rup-eSp;LN(_kL$D4A88h^k@7yeNW6OGut*$;KE5^akqvXC>46uM zq~a^E%+IH;bojQOvQ3Sfgwve{n{T-{xXEe`ukFOpN)1_>dq9cr*iqKMU1*$*CStr7 zV-eG|x6p5*)k+s~f&CgiwNDG145*>iL>Kl2X41efuY`OanzL7+{Z9#-9{W6WONEW` zi=L(9SBhEw+(nFGKZ7x_ADbZzaSV*JXQs@83t zWOClQ1ZWenjN&enutB7o-u*DRQnv#Rra5&9=~?$V$+y4tnChYd zHEw66bgjP2U4}IXzQXqSU#OQ{fEY5}LbqIvT8s3Q&o}%gu3^sd=jhx7jtr})lElsk zu)9k$H8_sFA=kdrvviAQc8sPFjB%3YVv**b=qsQf@%zBpg(9^uSA__d-gZc>p%RLU z*q~;OK=N+KsL^`@=IKISa$o@)`@@qF&~eyKKL`&eVd^Z2CS(C&pD z{(b-M;QdFBEP+3CrSp@RXa9R*{!53fX!B3$^WRM+F#l`gr*!s@#QX||sT4y69)z+H zl=83N=i`J=`hzG1_*-1!n@Ueqc_eG`8u&=g6VONFC`je+#>y>K<^Ac}s9yM=_;Sma zM`xc0sTaqam7E(MAkhP9hJRlOO%y9g$K6L0+bq?$S_~}7A)RXrak1-N zvG0o?sltZ3YQe9au`*^NLpf!~sz^+D#LC!A%5n&n+hxHa%yj+mRP9DHa!fh)wFZ_j zXPt$BqWR=sX#qN7PvI+FEsLcfn{Aj1Yu{RXM zDK&?fu|!CdObiK72M%CftWjH*#t`5> z&uh@9t$`V)PqNZw-;8ByKoJh|zG3sfC>)k-{Yv*<2; zbowS(eEFxsk&yfE^a$hO%=q2*@=exsShd%()4c>!54TXF8}w6;jGBR_%;#BM`sY&C zKeqbx-d-JNT|%9l&ryl1g1)p)L61TkD;k%RUCnoyRLys()U|`9xgISENYHEQ5+1dj zSmHf=WfyE6RWF5ZaBE!}&578)0EPn=DQZF- zdGdY88`>Nmb`zHtD)mX1kj3kgp;HB6h?lp z&0*B9?RUTe1Lu3d?8g%qfr^f80{SU)i-CIiHympkc8r`)bXagl5QL(_r$|+GO+;Z^ zgdJiQBA+XM5~neO-a!BHJbk~1D=tF&86x8O^^5j@K2QJCbIw1LbxIw|6-()f$E1GD zl6iqpDua2b(Q<=#VT&=ZF_h5?Z>j)BYCd+Wxe;XCm_e+0>(bK2ctg0dvoO~ml3W&K z2n^Yc^p6yo5P;k^`KzEd_pM(kijZgi*GwA&2gjO7J;G-<5AK@B$#mDr$Mi$CM~TeW z#a9hrZ`r&gTql~zgz5nR#7Sa5H)piZb{|g@{WMh&UFHb@M$8F9O^ElggAKqprK3Ss zB+2bO5?3qug^}hYgD3r4o7HX(QIRbkvwNs?LL|xEs60zHuGpEjQEZBPO zPShSf7H^Ud=oahX6>U%0Xlp>&%_A?G@D?k+!6Z-@Ylexbb>u|r1Q4HOtDH+gUt)sN zuh(n(&R;tR!(N>C+vL2Rp&n=q@e-;!DeZS&)}509?|1j~oq#(tsyw}=Jfj9G^=H-l zb#Qh!1Do&QFV)TmOgJB;-jO2Q(>yEpw@#ZK+QUHBAHXg=V*xCQdr_}sUw<7jwgYqa zwoTez*s|~4Fl>_VP%+@}Nwexw(@mp-9krH>I#KkLbIM1WQmd_{1)&9^oGj`>^N0*T z0QsGA+9}G;g^w#X;EgLWm=w7lhOQp*g=%DAU{-0ac}wdCO+(-Fo8Gkw!ns}S>y zkm5`gzy!uh>!xYFS(B>G4G9?K^C3?Xz$oU5ZV;2A;)*9OvMd`Cd zEkjA;)Pmdt;t=u$t-*`hajarsg!CUdODsf8T})|!%<}h&d2=T`g$&2TwEMw}&6rR? z3kb@uAkfV-MH4F{WB)1>1YVTj_xtGPRYkDiwW>D(AeQGx0H2CQKURe4mhy-bC~2v) zB5xs!3%;)XcElJ!@IpK?Zbi-rCJGPCPc}1-D&hPsBd5a-Qcn?(HB}MTOu-kN4_|?% zY!)7@FCc~a<}zDoj9OzVh^wzwuZ=HBz`B>UmDf77HI=vw63_+i9pV9-@wJLf%oUUo zEEXbFDGC;|e``zMjHGv07!jy2lGLR7_5&+kftlJl<-{Ax*cpz=GSRzUrH8Kmu^Hni?$vhd!f3TgN0S-l=-nt2qxum zndc}@dIS)KL}7L=0jvW}FIC@o3MDVpm@UAL%LQph$5z@@Tt9oSS)I(n;6$iqRM}Ho zhM3gZRGMu^4ur5pcgjq<1#KxBZ*0hfDjhjo)>6)G)4X=Bo6d+YH?K80?kB~(f{|B9 zCrJ=TtJWtufZU_84ZD=|w}BSy@cE;xiv{tdQFQFwYV0st!x0`;ayp{Xj18^-!!iWv z<7u&4pn>LfXFo^K z5d|fZlARj@_>;rJPmnBYcM}BagMdwV$FGh-QvUsM4qmXb7eL4gG#Gh6lT09UT~{y* ziMDhpI%p5Fy*X|)D2UmnG>7?jjPknbf;z}4S2`5?KEl(AAuTt&R<7?TMI1GkU@ zPH4}7R>FpfdV~u+&-Bx3LC!1ioy}$hqQ8mfqsW+|DGaZjEmW|=R#VhiYtt9XTRJ|s zv;tZ6lJ9pKerqzc?3Lddx5VA$Jb^GB6I3O-A>L(Rz^aK$i5+-}eRrocrVeZ2in`)V+mcFn;uMkV;v-g9tP=qFhiZN zh*1Z}k%7WyRVosLVRh`gFd0l?F0mi0nD_C~NW<~Agb32|0NlG$s%ZF8+7anx?P7Zx zMbUsFdjJ?c`MWB2d?2{^7rO(tUI4(Cmu}h-dZh$*pa!Pe+|jA31I=4q!?vTUg&qW( z3SEbP^!m@2K(E;9@`P(xL`zJQX)v%uspvZg@?15en8;t5I0J9zTKb5JVa*(24Vn3$ zDzBDdxVWyW`j9o=a!?-?5Pzdobnv(D$s#F0xDACR|0-ObA6~3)D`Hq(YjEyhYW5m% zmjLeX$>`#Za+89Ab$u7wX=PXsB~kvs`(!6R;%3lZQTStRzvsunUm!wNTp zDCszlQ&mMl#;y$Y7i|JMjNXPX!Vi!O!vn$9Yna5$A%0hc6ksowBg%>lBRAE{F%QJ2 zGfooiB1GM{3UBk*8L=U~h2NCM@O43<03y9*ik=i9?VHh5qJ@*onLAfb@pziLw14456FO=E;SL6E^zD^Pky^LH^lm&CSXPW=0ZNXhZfy z(2>72ay2q%dou*_u{=J_na!g|#Eg``8)?Y`F-~NzmOV&Jc8sF^Nc3})2czuv<|?bL z+|;MhBjq{B(6rOOKR<)yU?RN6Z}pbFMfqThNr+@$OQo-*tAsg4A$pAv|1b)Q?2*4! z`e=%*A$!IAplZ|5FzJQVs`2j`FkpOo;XH8y`TjM6+#1cWkGqGC!Vf^McYuGSZe$^p zLuzn^fUzTcEAv_$*_iYJ@?G9*Wy>Li^(EEUbHIb_s87}gGBvGAXf7C3fZNv%-3i;NQTzSboqH^Je*apy-^ zDBrDe?}YSgf0-ZXvm{8 zv>LsqM`2@Mc{P@VcNGya&mu^j4`@QIz6*I|JcQEi>7^igdVNjUjuc&9al%^@C}4PM3}qUdAfz~e?rfJzs$L-J zB%v$l6tYQUUk>j-Zz3tYJQiE$ zqDdoDF9$`7*h>^)sex=>y6WZ}=E=_OlP^Vk4prMx_5Z!eFFP~8r#SpjST3hyLV(C9 zZGY{iCe~!K`B+;vGE#d$cq5KwWr+af9z=;y*cyZwNS_?16aYuH&*645a>aLl%NVT; z-NqD0#{?bmY2{O8KZ1KtL1+ z*H9L;Szx_N5q{*QpG^5Zt%V;G64!$sCg#OzQ|umHBXmKS(dcOOh~_@Da%|TrIof=z|52uxfswrk>7*xlTbpbFoara zBQ27E^9tAifp(^$nB>&ycv7=NGCSy_M*OQGg?J)tg?ie1<9E0)kRorKx3R2}S}bQG z97*=ceLuG=%`aD7;vHcH8{!?jh-dTG;C1HiT!gEUJ$3VyTQ==Ru*#PlUzzY{(AGG0 zw4eW7lx$1gV(`9Fa&18oJwn&^yP(gyAQw_ClCc9*<9;H)i^K6jM2%~Bc6;=Cp`WfD zJjC#&)$GBOcDIG-u5UHAgL8}YknodzS`)dK2oO~Un4bn7*s{IqVlwuz)nZKtE$ni> za!%c+Y3>=fg77}VBDy1UB`Y9uB{zaw7j^4*bzpS=F>HgeZXs-qCfr?{@O<&FDBpZS zDP5I6gp1@Wy5UZpe!U6W2a>&h-~m=Lpgs8GS8_c`SK6%+tA9FzfZ&Twi=8hEM8}G= z4=fjwfJe4FO|Q0Uo6?7EO9CJ&pkd7So}Wwh*HHbAsC5E3Oh(n*dy56Mq5Z~hZ8Mrr z>cGk$i&Mr&G6 zvVGuOHlmpT9Zt`1?6K!ttr}L$KD!E!^j~4H@J$l1mOZxgy4rF(L9FN_l_p)GjK^d< zg5P{X@*&@BlK1WJR^Zhg1B=CNdAM+cz(mE-eBuxyaT>iIPt2xblrWU=O<>s^B#2Sas8=<c$l*d zhar_oxxDkIw;24a3*m^6QN$GDq`K0G3MtVJHEUaH0WfgeQk=yK?rdAAgOcDp#dA4v zPda#b-h4MYK}ok3=}+XDLRP+&DX5gDP^goLl&A2O$eK_`zR++pf0T73f-sEu6?P;( z`_E(ycOG&55{M>-Qq;;z44XZnrPn;+#noO)ET<=deF%?w0F-V?#({0(Wj;Zq{d?GK zshjMmn>xv(9L$7?NsD(xMwui-P3GK-|CC^4tSt--h-MIo!wT0=i3ZmUung11Us=AA zawhY2Pa=M1A(D{{=-fs9od73@Pz9?ZaU)6Dp5b5MAj#k95C-2 zDpa(#YjfHR6?+%Uct(wIW>P!RGT;YPSu#_j9AERRLp98VVi@aMuqh zYHL2H7=n$;f1wihm>yI#vtwwOY5`d>k*sEoDzz_OC1Pw^haLv4dzicSbO(Zw!3<#d zeH_gPRnM~t&CtpQXmKj)4y;Z_8O^_u96T`F-G5Yb&I)KjbYFP3m?dztf&w5UO2nn) zbpMb>y~;Vl1bT5(Ur-d+2}}#PU`I09PdYh(pc+bdTL3!M3bjrL&{aC%#tO-C2Z;A& zkJL!@MLjOQgV2AC7#=HlqoIFc69W25?HSWrq*OnFpo2qd?hS=HI$Nwt{>DA^2|y&h zu*z4#O3DMNl^=Zej2oOS*>LG1DA*QNu}LpMUE>AoZD{ApA~tZWxm&Yti|pQl72FWb zi)%KmgTe~gN7WRfSHKo~*3ZIAvf4)Ux+vWEvVFTx}7OUV4v`u6Wl$)G@Y15=ZTWy3j|&-%oPTseqm zp#1bo9x`qa#w)t(ot^0*$=F0r{S`}qb9l}Ijz|c5IlebU58|#0+hgy3YJ)b)u1eHS zr34kp7t?2#uu-^STPk5;8C?)77z9fnHwy^ILR~fh95+6P?Snr4W*QtiTp9F9{Uy|O{n;+(3JDU3}HN4(7eLPg&CK^T* zV2SjgdOd1F(8xy1*6}lY^h(VWihVu1I|rJ?DC(AAlX}Q1#Cya3k@QGJl=Y)lP4)5+ zxQ~mH-`*sDU&^9C4jyf~TWCMiC8WthN(jCg04d(Rw)YzX4@%cWn6CcJ|Baf-4gX6E zD!{$I9C9`}PsM($2ArGx13a^=^YuqAOait*Q53DnQ)UM`mY|Xqsft+#HH#8xk+5u) zplmgZmB301l>Q6k2pLx=NXwsChHSsFx?`eOQ>@O=KkHmbdo8Nxh_Ga50%yk6T4+t0 z1K_pK0#wdzb?XbP#p$kW^av7y}G993&YWVr#p z!S;=9x$qa)U3C?wIl9aW|Ch)-8jOBR8=O7>2hQ2wU#_B{SAVj~hW|_>UW$j+Paqee zCi5{wawLo6+56EhN&w9g!t~RV0p7$r^D;D1EjEjDVCy%n={FgLEir$ot}8Y&E6}=P zOxS}+;WL;r-cP?4@(qB(T_(s3DwdN|{#o4p`1#6K>(NxOqqKhYT}jnPxh*QZLq~ zl{xqeFT(YZ+#7=j+Wz+UzkBlkhf+u9pt!a0GoqCZ{l7}+|D96zualfb$`%Tnis;_b zsG@4}tNdqDlto2X^+BNGASmidRLG8btAEIs%tvvY75L+cNszsRaOvqtB zcj0V5q@r)cnte5$fA*$Mp1E%xvR|B^Ykai7Aav1Ze$V-9m>JTphI(%%=djG9|4b2f zk@46R-7yQN(}r`HZ4Pl%0e7wh+DVSic(t*V>5C7&L&M}-hHQO8w?Jvj&SPtUhlCi- zAhqMVT3obu?Q^_UW=^|-{^8S$a))5%}$ex8J z*?H7AC~N`}ea?R+8|y~{*c|5avX=c#(xy8xR_(RcDifl0XNyJUVqGR_4;!)Ahl|?5 z#%RneET(2X5-sQ#L+)XjbUSP&ZKDnGOIW*yt3+?Xu3yPrg!&#lgB6=i{PGA8Xz_R8 zT+yZFb}bj&MstKYk)g?DVxd*)xj;4+w5SK$aUeG4&X|>vfeU4GLIsgUyM+g++ln=5 zH7lafr?!Y>hv`&MBaB^wB#gCPnu*h(O$Ou>ZJn_Dn-dO^E!@^0DdwbNYScDUwjq@~ zc`XJa03&2p?`scydAB|FtJ4#C52}w`^RAMM+ekfxP(Xr_7!Di6XpnzP=P3zb7Bfxm z`UR_bmhR_)0y+HV?(YnaxeE)IVWQlP3!h>1j29!M7q+G077MG z-Olfymjza-E6fY52gOWb`%17DqrFbZgSWS7@+1`lHe# zqAfJ5rZHBosi9(_>n!GaN(cS zW2VGB)Xx(r2L0tO5t(jA1cG!XJxu?YRU1$)hig#v1kt4}Z@m6wgMF%9%|lQ_9g4cA zkUaNqr|Fto3(9sw$p*#E3$|#Twsq?eS-UQ8nSA2^=$B<-N|BUs?PFK#s_&9Vm^0wN z*|!&@y1pTF{FaMl+#h3|>%SJXHw;O|1Ee=O{Ik2+J`>}TDyuy5e91MH5pA%#2&q&l zf55uvg-)%UGC(vw3jJwsm=@`|Z>lWwZN&-`?3_M@7sUR%X)|i4&%Vpchxc#PGUW7Z zi(g@`XFvnv43Rx+2ox`8!ka3m2Ml&#Y{QCO93x=XU?%P3JZVwl;!MY*H|E7s`~p>% zmPedZN8HX;K;?juW?qt@aAUm5KpUDaO{{ouJIo?UL$IMNi>*FV6j>p2>~xnPQZ0m3 z-vd=Ulpy$#2O|YfuEJjgwclWgIkbWv8^q8mlBdyjDh%P0=iy{fjN&VeJFA0Y!8LQ5 zbzzle$=T9Ff>ZMr<20s<-a}?bZj~RBfSdP{9QCJo{hE>bC3Xbe%%6jWxz9tJEO{dy zpO4s~E^l_(!^-JRfBt$v`uRHVRIPsFkYNho7<>c%n>zZBQc2Ms%GCHXN%#)`|6MBo zb(*zE<=q8S1m(-v%EZbjgB4Vge``=`QQezRJbk{<&is7To-&q-B|d>2U~|bF-==dL zp@V?qc!}RHnV&3?CGn*o5mnT|e?9>VlE==S^#kk!-~$N@*2Q@xW;I#o6l>~Wx@)KF zVJod-j_1qcMC(_HZ39TioguUcZRvp~G>mAI?k|CIu@TzH2XW^49|Fnmfst4xsDdf< zg}4YkESV;RNueT#G7Om(UBna(TM*osJ*3w{M42;J;$Y`g_Heq(kfK1Mq5+hTCG_!B z<=kfT>arz_C02H0r⪚VW+kfd&!*>?g45xtM|JD=osT56>0Y7MA(;-pxCi+l4=^l ztF`b1ER_NOQ3so7OAtKOc~onjwVWm`4OrUF_*IDBVrGp+E#(Obh5N7T2xqWDl zhUSTp@&=)6l*xR7_~y!5$&>uEHFF#YOcVs@m@8ehJ0wBDN%eGwM=KK@XsK>Uccg|T z4Z~F#cBPWU?&+%XLpBz!5v??o{QlY4)9%UK2ivec(R>bzh{A~?O;P2dD?&2OigP!^ zIIQaN@{(Un6{EJcYIUM`uk#EPV-67nKkKI-8Vm)-MEcc4HYr*Pe6*aMZ8;5GK;hM$ zrS7P>%_#gL*!nSA3@4J~y6a6?dmGkni4$gW^LXg#Bds(dfiy6jfgv!Ce$88Ta;M@a z3ZR^?poHb@$Iz1p?S3Gh>LVu5o~StscWyvGi!VSry=WLXs*yufF5+`%V0TW_8}{uD zvA<1Bl>msb7pO=ahAaw8e^9wP{V8TalGJuYb7^WkXE%m+e1Iztkm-N7|Br~3M( zxd%o-JG~U_-DbNQu1X^S}X(%Q(WuRf2dXU6DX84T;%+pD)ki+ zzp)R|y(3o2x`~&?jL0wF4PLS371y-5al@29uPf=%i!C8+{G4k?+C}QW@KlYOjs#|# zK+DwQ#Zn3lno~*3GAGxFhQ_lU5`rET$yu0_rBUqB&~Y~TFTpO#4$1Yr=4AtS|&OgybccvdFtSIw`r zL|Mor-P~nyLY?sySvrNc9hOd7+TsZFXI0tca*5w6;xVL8OCc8vGptz>%QPy~Md*{R zHfSmyag~j>#)GAlaK)*m`HD)91{Z861r)`Pc)5!^2Z|#jo!O?LEkmcwmAebOc`A!` z7gmeFi3UT38BKUposY4!8b;W3FgWqCFfHE&`|TXSv44%)y1Jb-bC4Lj(pyZUN)UJ1 zPgX>{xV&86OOC*>XDD`=D7t;0jE5ru1i}^4#(8rtUg~J1o@1b*l6#s&*5q(z@D-Z2jdXsmNDB}F~Wiuo|c%;pF!ub1QWGMeYwpdsd( z07OAD+7xb|o_#W?%IwT-%x)LA1>=~z#Gy7GoEF*1l!kC)f%wPu8}yx`#~bDekJ#bg z-hxXD z8V{Q}AvE$TF|IvH<&nM(bTTEbe?EMe?tf2=jv*dHbjOx4?1AgLL^O$bFUziSOP0M9 zUjXJO#*~p1A!TB?cPV1(#4TInyfx_=>#regmg7k8`y}jTiJM7Rria@$Qg(5^XDnQH zpAbc%aL1St;15<6>slN6PFmvV`ptPhMR{}DsNY(p$M`qG2DSW<}Bv%a%* zpi>;KJvxYZpq;ou{XMYU4h}!HWzj+sLGH!+9|ymnec^;XRmvD}0LB=YIxw6YDJ0=! zWhG%{>jH%Jfq|1Azasin?<-;p69^1Wi0Cpgwi4@QL+*208Opgf#Kp-IkrRmy1e-xV zrIQjmzgffC(6_i1v)+KQE=gEVNR(fyJ`Y;@X1bfSHDy}ob+;a_FsPJ`pPz9KldLy2 z&}4NuZ?C0U6~ifbKVsFWU^=&}M!K3$hB)}ej-X(aC}CD@p>>Ir$HX=7fk)zRtNFB( zJ&m)=pL`BdA)s&@x%W0ua#xZd^2I}ScPbT-9y>{%;?0N66oe8g>qFotY2x(qZiay} z<;QLIqfrm44<&hstFHw~Iq`~Sh*#DSlYDlZ3f-eB&&Z*KR2Shn-{ohFt9wH*k|}11 zo^Bilx^a>G|iO+bp7H3;ZYF1zE0SMBgnuB`WJxrh#V^&+qU>;Kh_4heh6g<8wf# z=MVzKrPg1$h7eEMcE!OyN$0tgo6rA>6yO)qeB!_!KVsFLqME~m z?~5gDjLLD-J}u2VrhV!-WNZYC8`m)&;Nw0q$-+{acayGAuv?QN^T}#tUf6ors4e|Q zmEnU70>Qor?MwPrljdP0vT}}BJ;))vQ8VKomOCQ&Zltxkbj)Fw+Lc%} z8B0K)5N9Qo15s`dk9e<@?9J0R83+bM2>WE0gIzbNdU}07vByP!tqp$sU}2FZJP`|D zE<1}(DT*krxVHM<++VFVVBCT{`hVHj}mk?#+ORoiQ$B)gwWVCwX^yHex_`yqr z#$@dKT@`VScJ9>N#ba8<0w2Xb*9Do@Nrx({2V#~bFy2j#rwn%SuoH1v)^+c6mGfSGC0~d}k+*C`_CCE3t=s(4#86?s@g|X#p8~u0 zyKp6z{V|(48sU~SD$NmZjjlpN)6rawx^Eb#Cki_}52afHr+5r}XwP+yQnrp@6%$8W zDArHGH> zjC4zU6kihMje`RFl9L@&r8}5uYs8W^-!GZ!jnjTTXcUHUyB%w+UJqVFwU))SY~n8d z_;zbq@~$4%!LeZ7$o*JUkX?C^17Ex3J@(JN6IVnoJ1NDk2b#9zKU{eql`}gjw1je6 z6fsXqGVp+TBGUy_^btZ}Mm)i~}Ig0OUg)33(x~z0%*N6SX3P%K3#QE$)2GCE3eq5W>a`BirzmeA;OcMB$+~K^I?~szweNfl z^M7?v1h2o9c1`~o&Gh;lqNl3A?LIJhWomSx{954uh3;z|Ip|PG?^vnvk=mi=${{wg zckTx>6z_srd~c4qXY}3+?XNb7EgEfc4|^Wvf33aZvp)CeYb?1>n|^v<{mSEV@XhL%`Ut|d!&_TebGaEPZ>kMl7) z*@f&P1??n?Do@D7-#4_sg=@ysnioA8D;t_jBsU?y;W{Ko%AqXllhIY6P-$RWagji8JQ7a z+6QfWl18=2#WV>~whG%ZPD4a;PO@8VUDKdZFZcyF9LFJ)JL7HvgiKSy$fbd9<`HQP z{s!G@bL`J>hN43pSLLoe7~oL7pI?%!`?*j>Crkse>|IG3ui&dL8rR9yDzJOk!}bD> za+64^N7>fkJzMS=Ek#HqMI<(A#liA>H^S~g(>()vQ;Z;q%INZHAA|aaS?Sr(!YL_& zu6`y7Zq^XWOeWTs)F9`#^9la4`QD)+a<)oG_xBye7PF=p5@2S3~>;5I<1k47)oV#6+< zZ@Q%O<;0?mQ2n;+C<&E}hubOmOhVm6%-})FB&7g9fQ> zDL*$bW$}Dn|E=T~vRej>??tcD@rW=JSIv#d?3mG04U+UEmcx(24 zcjcH7m+>#5_7v$aM13~MYYid&$U2uPpLjW~B}|D^+4qv)K!-Od>7mJeJfoLGdkM&& zNAp*-&=Cd3zHU~bPCYidQmcJi9puOQ`sKYmOXIp>^7MyfBRKav5h5)$@}f6GTltM! z!D5N&cml{qLe7hjvPji^Dm0qPgl-}HAjEMDDtOE?PxhwV)Z z%3J;H(5;qRnUi4M04^tq)T{Tn@?x|R(lx@DxA+ADG4AzP(3?EwDrtSuEpTZ9C1P*X zcghTLpeJ1WdDKpv-$o{bx^~lpWdb=$(e=w~7-M8T6&^=ZC(? zRu;>rhJ@b{AF@mp4xC3TepwR#UV4zB<5T98*-pBwr(p)Y`6vRLbMY1!S3M6>ZpqP4 zyW@XrU3EoUTfjW{S_quEM4w4Z(6*S|VoK z+=w;K@3}_frNJ$rRhQ+aVK+-lLjw_+c(BZ_BA@ewl`xunkQYnWVd_2sWm!m$Hx~X;WF0aXIh0IsPZR9($ znzzs1qYL`ymD&MVbTYxg92U~!(ba$c%uGa5r}KQM;m zd7-I1Z&wQ~P5Z)^#|ajug>YAMm0p?bv~@=(<>v*qSdbZBwO1NYQ10+5%ckFarW{E! zThl1e&B=Fki}6imW-F1DgT%~WbUf4LLoaL$zN7ckpv>6A9a9H}+?;9Oep|N7RcIdg z`V;-+&NzBAHEe!ryF~<~$4!@R7IN^6&AC-ayzAmubEM&}D{|Hr@`>DSGO4`j=$#g` z`s8_L*ys)N$nfkI9%n}Tz7_6bfA$e$aas|DJD8m-vJF$}k4pSTs24RDRj4_sS3 zAdEGG2Q4WLbOi`{K^9*}i~4YwCYFQ=>+HsW=L-4R$?%NG?(AD0KUHGYM=yY@*B$LH z7SO3yYCL-Bu&X{Ra?%?=)cHyzLHwD zc}1rbRk1_?^dh0OWgH}LaXy*)C>0mmNF4jZ zluF7bl(9VgjjkbGDe9Z9yYXXpzFzMEWk#^7l2EaCex)KN#Sc91if%INHe{p`f_Qz z5=X?WkrBUV&pw32oiju*Ib&MJE2GU@y1vGNfGU>PsMdbBG zG}G^4;;qUe%O*MH)J527NF40^;}6*y47HVglb#DALsfb(g=Wq@G^1e_<{Kj`Wd~Jj&S>S4AjP08 z8v;vl&ERe)hA?{m<_eZIfiSjSt-Mu-=fV}?z-kf48ZLeXD6a_GS|ycVA6-kR-iB0R>TI^y1IbJFX7Dmy+bFJ%N;C*A7-nr2 z2_3Gfit{IT?<&bt1jvouq4uJPwPqT$z8sq$&s!Y-{$U>)pFQW49X8#2`L4b7ZBrf5 z@9*Z27AD(<^L4zgyUaPar;#!Sk8SU-N-f=5BG7xpt@I3St@7Q6$h^Jo(Z+9<$=7tF zxaaPyI9&;f=)a#lTSG&PM*g{BB1t9M9$D0lOdREHPtj{nltufT5AF!uv=z#Y6Mh3r z|1h|Q?2#-sJr(v<>Qj@lIK)jsGsAUyJTu9_?!%r|ynw^(Gk@VM2`+ zxy@%sbN`!eO(pTu5-@U9D&pR2-Kq9A_qzf<c*=C{eB(#P2L%(b zi>-sDI@rR>@#h31QvJRv36R+#A$hHVO^52bzw#{!=1U{Atn?4D;1LPASc#R4EO@Iq z`atnx3Cr?t6hkrUzBVw_8LT(HbtF5ytC90{htUJAXfjt|%ByF;&T)CL`u6wzPcCrW z>((f>6_6$m*SkTKrsJ$Zs}i0DbHV+d<}H$+z7iCFifc>4d_Eed*w~mQ;c41{%4IXI zSz<4HgEz}FV+jGvXpR_u#ITSKp-N|=Q_kWxP4hRs0wMWV#PhXH!T9u!g6i7tlH%}l zHrH*kP-RyABb@z(vcf@y$CUZIVL@Ptm3HBZ>H_tf3AlD;8BsYlS0Ce5uyB1A+$M9g z&|ld`X>D3GrKOmQ*B#J2fIUI@9U&vdl?}_fjTM*i~xoOG1nz)Ux z!O027CNBZ+o^a_JtCGZ%(WLDd{qb0k&XwBxx3Ki`Fiisv3xzGc}P(qAn3$8nwLz-rRj4pS6eV?8K9 zy#jqCdWNZ%Ej56zZI!vM#J*P;Z;v#OxLbmvpmGDfuIU|m9cv?5!vb7wt|)xku_L|P zvr@mxSP$AQk}g^G_f9_VFvz}{>aD)%eLiMX7n|TMPHcT0WjmR3R&9%kgFASo@ogfH z5o48ejX4w2f{O5GX?@9!YOfo8pF6$0aw+YD{wbjJXTr_LkH6E*wKv@I$@<}H?i+(U z#GLT?x!M{&mtUwb3v(5BvD^&ap3A7$Se{a{$?>{(FyT(qBiMO!qF`0#Q5e1AmRd;X z#~F<0`;<4jT9i|k=(^SI1h_XCT5eC4ym-z=$iT-cwETqB?oxoxL|0r>SmUd9yaxAR zh-g77`h+9{)1-bAanZZPtg@N71vV|LU~wHYx$ryt*FuLwjWppEiyFIm{g$Mv?maTN z+bYkT-)@ernaD5k_G@~j1-GDr=?W6*UC=sgBWah7?@Hza)_!#Au@0Q8>v)_LLp9w~NT&7(;jUMiCH6Q zZ(_7!8!;+19#^+Zqphtl`yM4xtA29mN?IbS=bp(#{mEJbG~3GuUkPp`!1h;wJzCX^ zZ6D_J>c81uj6h%uTN_~)kb?>IHy{Pf>D({*>RPHlPNP#YQlg5XbNXHliM!Ht%YpVr z*o`p6LX@!AZ?kU7aiJz!O-}h968iWa+(2>VU;h|T-|>1)>(;$lKkc0H<v9Ok zYH|c1v*}MeL!Sil@C%sEUvo*Ck>1{JKfX~viWT59ppALWNt%LY5oOE-bbHezmT_k@ zu(HKkbVWQ(e-mWRBur63*WBUA{S>5RMvLz;Fds$n#^d`?hs$@A=P1~kMKQ0D=lbL4 z>GhWqIvlIYK8#B!kbAkeaMahxRHR8Vh7(SVM;r6+UQ*3NjrHqhq1Bq<(b>y>=BvWK zIk~8nI;cbqceCP}yvZC(;2%MN2 z)d7YL!raBcIl)4bdyNmnw1;w#jMRd{h;WT6G7NNDttXXP{+VT_R+pPe_4gPsN&xNF zmj!%GX1v-wsvp>gfhpQvvfg3CvYm|gyuezGi~k98+@dgkRcc0Z)Kg3EZ!;!uk=Sor zNiz7$;oq0V6qzjBU##<+0THgT#bV1sMDSUcTMTc0kyo0qO*Z!i&ycZLMnD#36z|F| zL^U4GTN`Lbk#$%>CM-AQ>HH3}zJ+vdFCq#*6-78Q_w=*VMCTCb!8OL1yXLhj?IBk6 zXr#(@4_)(6fPPkhZ{6B03T-=or%WH~14E2{+T)Vq5=qIvz%5^zj_X)F{)@NPxp345 z?%+%#u8sxyP)2`^2yS_gIwS!fih;D2>Od(}El92Vrk)DR0P|Q%+3k+w7u7++*hTA@iiEI}#@Ae5VbMEAgqtEMRaJz=n{>|7Lh*r|s;i zVzt6$*6T^#bIdyMshOF+h=a-`smLN?VIt`_i0GFJJ)sUWvf(*os=%1q#%IPd%SD$z-+Oa-Re5SBOtB-OCMIz;o31 z@Q#&z`F8NCNYMv;{TyN=+!^!F`$tAyJyemPXN)DAX8917xSZ>@ye%Z(0%do#HL=sw z|1ph9wa94V=hir^Uf^jgMUIS6mnZnXA`#26+O84&0)A%w%YNXN?k6_iK4Ib^3UI%y zI{wiUzBkdfcD|sdTk@HEO2(})!xn?<<6+x?^vZzkG@gqksAle90y0*zwY36v)l4nS zoE(1mtY1r{G5rsKEtBA0W0&F%Q_Dd$%S5hHb-HdnuyCM1t~k8RP4gH3=qZ*B8m~Ch z$kC`zcc3DKe+a_(AR20B`i!>2RM@ts>(Jx-mJj<{ul}?TT*FQN?S>!->V!INvw*HM zc+6?04iy85agf%~h|1W9l2D-fmQWNjM_OF5*p9ej7zX(?%6`<5g?UuzC_asx9y{+= z(cu#s9RUi1Pvwfpqonq2EE%2HyY3FW4GMQ2DqDcX#pYD$D+SF`^Cd{k_&=lYUNb6C z>ne~C$?l^JK6D@nu~1QbSV0lvD3~ObTOk#NR1z%bgi`Ss=~dZL%1dSCiJ9;A-;Uvk zkk$=%dG9&BPs-KuKW_^t5(Xmr)&17(=;>Ek6tK<-*HC!D!c~`1d<26x) zTtU~Wp%*eA`s?o^_*J2!8zo$8<_j&JF24Y z5ORTKBlitI$IBW@uO@x1bGKT*LW;N=xb!CE@>3UuNpbHwHKRDgeZDv2%*ETH?&IkH z%D^W9ou1f!`F1fo=X9fR&OWd6Gq6En4oFb(Q_ACa{UsoYybS9xq}o9svxSSJbe>j> z26KnIU?`{LfP`wHZ+gsQtN9q7V#=$Pl--_KW>NFV2~l{_Lu@hfb7KcEDUo!<;d4ZR zPVgo$02aMilVCbQN)?kI_rRzC>LqV$V*$4PwJnjMc3%}+8t1z^8yibRQ))#E5C~o5^g^{WUnKgfzTx`ik&p*`RwgN&rNi7L07k(-me&W0s_~3KH#-kv-LcfOA6Z3C1?#&&?&J;#>Qj5U(wX}50Nk% zM~_n8n~I)hp&TVjG&)?{HV3E3s|?-I(}NGRBp$D;-$=u1l}Av1QNX$`!sllOA?$jc zha8+Db3Jr_L`Ja4IVUNEs#uy>DS9=i7%Sqb8tEXbnFyEf;p=}+AJ4yZfK&BG#8(fn94`5SA# z&$t)z@P|cGsVS&5)N>rBJw9&qg|8gi>LhpHb&GN28Vr2?rrCxL4V+(dJzpJ!05 z%F8tAJ;@)%FNaUwZ@|bW88j!@M9r5%U@+vBf)`=I7FTi8I-(2iX${7=6>;>DbT#jM z=IYdg{ZK2O7WEz}&*-WFxp}(c7p(e#n@JAQ?Kgvu_;dmSEDpQvK0cSaA0UI?*7VHY zy09u!EVbGM)Yj)eV$ zK1!EHCSIBamypO2C6TcJ3+@<*M{pCQZkHEr8eAVA912@r-EVLW6CA*>aR=SCkm5{^ zoKYMg{q!sa?W2r)%bWXV$8zzz(TuovZ|xCG*=$^PSY?@dJd3!?-6M(e z`f+^xJ$Jm@eD~gMBxa<~aE<*jgLiyq)EtuJGvb>_2gM@I3L}<2vc7*Yt=aCof#o)b z8{EMh(=DwKoy5VVqRrg882Sc8ax?qNHbWy;)U2jVUf>)7rO0$Pge{k5fV9|bM5LYV z$T~@`pXJab;h-{Oge4zQAuYNT9B9lsMJ#@|LvX-q07I#Z@a-pbm!m&YV?qb2n_pFy zNC0m?1bog9o{$2A?S7c(&(ui2rl?AtGM9lZ!hU|aS&Dwzlp5s3a8x~hR~6yO>q=7V zbz>YIZBFj-%U6y#F}!`rsdkyeuZr8D>kjJ5t9N^P*419FXi&yJqDDuHTB7V{Od~FX zU`dZD44BP6C9pyakitKFj#_$yh@WU%E!D6-C*@e+B@N+yHXaN_3g;~rS#h>aR8wTf z_S>&!lBK>YO}5RC%ojY}n4LXTsjacoGgWDK=Qqg;({&=t(0ilTZ5ma>&7-_wQWGUA zizT7mmc;*9tp>%3W6XG_VqGJ{fQJ!h!bq<&&}PtZ^!V{y-gOS1qkHD^>IY^;$sv1# z8Q+17;RcsmErz$zvM+@>amZL{9BB-f_c0d*e8O^}pKR3&)!kO>FwkE`M6ZLncBhb9 z);R+Z@H!BKaDFZuF&jr!6QiFJKD`+msq!QG;5)kR9Zd%D2GqC1G(vM%jG8XDwa~Uu zM^YE;`jvnB+^3*rmJmO)`)XUdIRJ=15a+M9zTwyQm1W6uX*1b#$(WhB_ZV)pO&bl9 zY-wq1zF21>MMAh%2K)D-9Q0!qdg8|*^076^Ji0Au z#yIZd*m@;-t8aBeq8X-(x!(8{XPIpVY!t~DEkr&2mRi$2_T_pYv0>AQ`^)DfG;E4; z_u3jQ2B$1+t~p8|j2UB3Y%2x1Xtgo+u4S8f(QZ!~I#?T!zRQ-*{*;pW;CczCo6=6T>P=lNne#Ij#(=Jx#q3$gYr5@L>KxW=c@Hm%o;NXyu;Gkhi--WOf z6o6h&5%>VV{`;i+LI0E&R}*HER*<+YFRUOfA+D;%EHCjB0R=z+(jEZ_|GonJ0Yt9+ zdalEL67~iD{uklT*Ptf-`#(azfic{#2l`qT@VBjl+3kzo00N5tc%$Rj8&(!zu$76U zxveeu)Z4Jd#QXg+9F%YGjJNF^Y+c)^MOhj8Sp4D zC4mL|3H+znPjvJ(FDttyP@dZW3^Y3A_ml3Y0{n8e*#FEX{j($ZS=^tfPz9`v0E2~q zaUb`ujC&`j>%gyPqyA{j^AclnoXxXiy+0!kAhQ0&^APyuf8b#|o9FVOvz8sOkdufB z2gmihGQfAb9~J6_JU_b3lRSbymv;Wd;r~6d{JpToJMl!@RgaqZ8UtctZrdfOih@SN~$qykl z0onNfljq-=X?{b{NHsU@H8)if#0ysuTumkAVU3st!A*CtdHGpv50{U{g^a((&*t1Iy zWstD20zwcSPlY1FV#8l~{q`eJYAe8wX-<_s707jdHnzM4*!ol^_&-6RChW(aMf(hJ z#MwZqYCs16KIwkFKt8^+L4TOAn29OK$qEc3p1*Y-O0t*>wNBP{0#g$;nCK=kmrX2onZp3zf-~gDK;pRP|dS(TcAdB zf7J-f@PA@D!}CFTBppEh)&P$cps}YVH)irb@th$!XbYk9j94oIJn%q$gnx?-_)hmr zvG{ME6VFE};s!Qx{A)H3D?S9h^jsUDp^$-wQa?o}XZ_!FXEc-)uzv7k1s$r7z?j<3 z*2d99%*4pn_;;KmY!OhBCg`^SY7fAgpqqBTpL9PayYq_hho%0!Dd221RL3~Lj09lU z0D+!%@s{@ILBqr(pAB5EG1A2g6jT8CK)-)K>3+hF|6jucJ6mgJI|o}k69=$`i6g9N z?x_~hv;yVl2g(ntOaBCiYFdO2jo%yq{2I_S=oIPqlkPX? zbRPK6F@vp*jR_FBZEK?n27yifmJk#@{Ghs0l3~E3w~#0=@wq^|_Gdhd=wnDt}wV zg@y^O7{Y##t02J00r(sCQ;cK&7c!oZLC;>Of=$loAfW_z3kmnJ|V ztpJ5QZAnI57xKVb(m9ScV_=|I1CUh~-~mrhHk^7d#6Rti&Kt%#y!yV33lyIi5Y_2H z0MX!i@W81d8(@6l00yc6wl%V~`nv_7E$u_3-~R+?>0JOG+F$>E(*4|r&x2OCv9z&u zvH6QZ+||g$4%+jbP30&tagPU}dHk0dSiC!r>aP=Wf7%wb{IU$LPZ=rT;8cJSI&^pN z_ml3oICdWB4>LGNQ~xeHRDU=>e#UbL+V{aMiOkj zsKIzOjeww5024pmb&FlPbk5-Br+EW|4l`Q^3wIOapWC4lAR}O=>GpTUpyJ!XTdi#Y zXg2;bKpn&jY0eQJCHLPvPywQAe=LVi5YhkvO8#ym;5*&V74^S){t)2rA;SMfhT8Y; z^KJpU-2qha^gLPy<2=$o{O-@O^M!p;l>=%s3!u_%0K;kRdxUu&!(Rt_E}Z;A8|e!% zw%G!(sxTS?%Yut@9?MT%IQwFkvzthL6}gcMXd+&qi6l-n5ulqFX&kJN{Iys5e`z6; z3~^8l(DUNofP(`@TK_)jek%$Wa{kGu*sCE< zc%It+H_wR(&(<{9EL11x4@3SN{ftG3bEE~E!sUdgIO2ceIb$paRc_eh@h3d>vFGue zd076>W`F|2o~k|po_Ts6FwAZ&=b_9`14Tz%hu0U zB-r@x6Q+Ba=P~`T^uMFQ|EvVmqG7{JPoPzEFNB8iw*NYj{|YvREdXqo-AMtu^8cp- zzy#g>$p_Un*r2o%KJ-@?@?99B_9qKetgrz~CoGyp7qY;J_1y3!SVGw7ixa}blJf|m xBc>mGf5u|`2@I7NY{bC{FsST2;Pc}Tlw=Wri5xKK2mVcv!NI9j0HZv({|7u$TWJ6Q literal 0 HcmV?d00001 From 9ef5cbc36426e4741252b1d3628357ce45cf9d7e Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 24 Aug 2020 13:16:46 +0200 Subject: [PATCH 39/41] Added ELC logger (#36) --- browsermob-core/pom.xml | 5 ++++ .../bmp/filters/HarCaptureFilter.java | 25 +++++++++++-------- browsermob-dist/pom.xml | 5 ++++ pom.xml | 5 ++++ 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index fe4c6e211..b6d130d63 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -69,6 +69,11 @@ jackson-core + + co.elastic.logging + log4j2-ecs-layout + + com.fasterxml.jackson.core jackson-databind diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 52f3541d0..7d859eb5c 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -32,10 +32,11 @@ import net.lightbody.bmp.proxy.CaptureType; import net.lightbody.bmp.util.BeansJsonMapper; import net.lightbody.bmp.util.BrowserMobHttpUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.ThreadContext; +import org.apache.logging.log4j.message.StringMapMessage; import org.littleshoot.proxy.impl.ProxyUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -57,7 +58,7 @@ import static net.lightbody.bmp.filters.StatsDMetricsFilter.prepareMetric; public class HarCaptureFilter extends HttpsAwareFiltersAdapter { - private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); + private static final Logger log = LogManager.getLogger(); private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); /** @@ -796,14 +797,16 @@ protected static void logFailedRequestIfRequired(HarRequest request, HarResponse if ((Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) && (response.getStatus() >= 500 || response.getStatus() == 0)) { - MDC.put("caller", "mobproxy"); - MDC.put("http_response_code", String.valueOf(response.getStatus())); - MDC.put("http_host", request.getUrl()); - MDC.put("request_details", BeansJsonMapper.getJsonString(request)); - MDC.put("method", request.getMethod()); - MDC.put("response", BeansJsonMapper.getJsonString(response)); - log.error("received bad status code"); + log.error(new StringMapMessage() + .with("message", "received bad status code") + .with("caller", "mobproxy") + .with("http_response_code", String.valueOf(response.getStatus())) + .with("http_host", request.getUrl()) + .with("request_details", BeansJsonMapper.getJsonString(request)) + .with("method", request.getMethod()) + .with("response", BeansJsonMapper.getJsonString(response))); isAlreadyLoggedIn.set(request); + ThreadContext.clearMap(); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index 6ae3e3396..221cd5b83 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -45,6 +45,11 @@ logstash-gelf + + co.elastic.logging + log4j2-ecs-layout + + org.apache.logging.log4j log4j-core diff --git a/pom.xml b/pom.xml index b1588f803..88ed9836a 100644 --- a/pom.xml +++ b/pom.xml @@ -239,6 +239,11 @@ ${logstash-gelf.version} + + co.elastic.logging + log4j2-ecs-layout + 0.5.0 + com.google.guava From ffd4b115ba19e9aa592e429f460bf56d8e0e941d Mon Sep 17 00:00:00 2001 From: Kirill Bilchenko Date: Mon, 24 Aug 2020 14:17:47 +0200 Subject: [PATCH 40/41] Revert little proxy to 1.1.6 (#37) --- pom.xml | 6 +++--- resources/jar/littleproxy-1.1.6.jar | Bin 0 -> 121955 bytes resources/jar/littleproxy-1.1.7.jar | Bin 120645 -> 0 bytes 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 resources/jar/littleproxy-1.1.6.jar delete mode 100644 resources/jar/littleproxy-1.1.7.jar diff --git a/pom.xml b/pom.xml index 88ed9836a..abd7e82b9 100644 --- a/pom.xml +++ b/pom.xml @@ -177,11 +177,11 @@ false install - ${basedir}/resources/jar/littleproxy-1.1.7.jar + ${basedir}/resources/jar/littleproxy-1.1.6.jar default org.littleshoot littleproxy - 1.1.7 + 1.1.6 jar @@ -315,7 +315,7 @@ org.littleshoot littleproxy - 1.1.7 + 1.1.6 diff --git a/resources/jar/littleproxy-1.1.6.jar b/resources/jar/littleproxy-1.1.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..927e769a3135b71661acf641d4eb599eb2883798 GIT binary patch literal 121955 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 z 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 literal 0 HcmV?d00001 diff --git a/resources/jar/littleproxy-1.1.7.jar b/resources/jar/littleproxy-1.1.7.jar deleted file mode 100644 index b5130bdf5db05ba4194387c97707eba164c34eed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120645 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⪚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 From aa7c1952e3c3df6b2353e3739019c84cd447ae3c Mon Sep 17 00:00:00 2001 From: kirillbilchenko Date: Mon, 24 Aug 2020 16:22:52 +0200 Subject: [PATCH 41/41] Update ELC logger --- README.md | 2 +- browsermob-core/pom.xml | 8 +-- .../bmp/filters/HarCaptureFilter.java | 64 +++++++++++-------- browsermob-dist/pom.xml | 6 +- browsermob-legacy/pom.xml | 2 +- browsermob-rest/pom.xml | 2 +- mitm/pom.xml | 2 +- pom.xml | 8 +-- 8 files changed, 53 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index d65a5bae7..25ee51d33 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ When you build the latest code from source, you'll have access to the latest sna net.lightbody.bmp browsermob-core - 2.1.37 + 2.1.38 test ``` diff --git a/browsermob-core/pom.xml b/browsermob-core/pom.xml index dfd9b1d83..daa1d380a 100644 --- a/browsermob-core/pom.xml +++ b/browsermob-core/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 @@ -70,8 +70,8 @@ - org.fluentd - fluent-logger + co.elastic.logging + log4j2-ecs-layout @@ -168,12 +168,10 @@ org.apache.logging.log4j log4j-api - test org.apache.logging.log4j log4j-core - test org.apache.logging.log4j diff --git a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java index 0d1bc17bb..e4aa0a582 100644 --- a/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java +++ b/browsermob-core/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java @@ -6,28 +6,48 @@ import com.timgroup.statsd.StatsDClient; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.*; +import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.codec.http.QueryStringDecoder; import io.netty.handler.codec.http.cookie.ClientCookieDecoder; import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.ServerCookieDecoder; -import net.lightbody.bmp.core.har.*; +import net.lightbody.bmp.core.har.Har; +import net.lightbody.bmp.core.har.HarCookie; +import net.lightbody.bmp.core.har.HarEntry; +import net.lightbody.bmp.core.har.HarNameValuePair; +import net.lightbody.bmp.core.har.HarPostData; +import net.lightbody.bmp.core.har.HarPostDataParam; +import net.lightbody.bmp.core.har.HarRequest; +import net.lightbody.bmp.core.har.HarResponse; import net.lightbody.bmp.exception.UnsupportedCharsetException; import net.lightbody.bmp.filters.support.HttpConnectTiming; import net.lightbody.bmp.filters.util.HarCaptureUtil; import net.lightbody.bmp.proxy.CaptureType; import net.lightbody.bmp.util.BeansJsonMapper; import net.lightbody.bmp.util.BrowserMobHttpUtil; -import org.apache.commons.lang3.StringUtils; -import org.fluentd.logger.FluentLogger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.message.StringMapMessage; import org.littleshoot.proxy.impl.ProxyUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Calendar; +import java.util.Date; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -37,15 +57,9 @@ import static net.lightbody.bmp.filters.StatsDMetricsFilter.prepareMetric; public class HarCaptureFilter extends HttpsAwareFiltersAdapter { - private static final Logger log = LoggerFactory.getLogger(HarCaptureFilter.class); - private static FluentLogger LOG; - private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); + private static final Logger log = LogManager.getLogger(HarCaptureFilter.class); - static { - if (StringUtils.isNotEmpty(System.getProperty("fluentdHost")) || StringUtils.isNotEmpty(System.getProperty("fluentdPort"))) { - LOG = FluentLogger.getLogger("mobproxy", System.getProperty("fluentdHost"), Integer.parseInt(System.getProperty("fluentdPort"))); - } - } + private static final InheritableThreadLocal isAlreadyLoggedIn = new InheritableThreadLocal<>(); /** * The currently active HAR at the time the current request is received. @@ -780,17 +794,17 @@ public void serverToProxyResponseReceived() { } protected static void logFailedRequestIfRequired(HarRequest request, HarResponse response) { - if (Objects.nonNull(LOG) && - (Objects.isNull(isAlreadyLoggedIn.get()) || isAlreadyLoggedIn.get().hashCode() != request.hashCode()) + if ((Objects.isNull(isAlreadyLoggedIn.get()) || + isAlreadyLoggedIn.get().hashCode() != request.hashCode()) && (response.getStatus() >= 500 || response.getStatus() == 0)) { - Map data = new HashMap(); - data.put("caller", "mobproxy"); - data.put("http_response_code", String.valueOf(response.getStatus())); - data.put("http_host", request.getUrl()); - data.put("request_details", BeansJsonMapper.getJsonString(request)); - data.put("method", request.getMethod()); - data.put("response", BeansJsonMapper.getJsonString(response)); - LOG.log("failure", data); + log.error(new StringMapMessage() + .with("message", "received bad status code") + .with("caller", "mobproxy") + .with("http_response_code", String.valueOf(response.getStatus())) + .with("http_host", request.getUrl()) + .with("request_details", BeansJsonMapper.getJsonString(request)) + .with("method", request.getMethod()) + .with("response", BeansJsonMapper.getJsonString(response))); isAlreadyLoggedIn.set(request); } } diff --git a/browsermob-dist/pom.xml b/browsermob-dist/pom.xml index b6173ced1..221cd5b83 100644 --- a/browsermob-dist/pom.xml +++ b/browsermob-dist/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 @@ -46,8 +46,8 @@ - org.fluentd - fluent-logger + co.elastic.logging + log4j2-ecs-layout diff --git a/browsermob-legacy/pom.xml b/browsermob-legacy/pom.xml index 5238c035d..985c60154 100644 --- a/browsermob-legacy/pom.xml +++ b/browsermob-legacy/pom.xml @@ -6,7 +6,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 diff --git a/browsermob-rest/pom.xml b/browsermob-rest/pom.xml index fdcd0e80c..6c01e56fe 100644 --- a/browsermob-rest/pom.xml +++ b/browsermob-rest/pom.xml @@ -5,7 +5,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 diff --git a/mitm/pom.xml b/mitm/pom.xml index 01d5dddb4..a0738f622 100644 --- a/mitm/pom.xml +++ b/mitm/pom.xml @@ -4,7 +4,7 @@ browsermob-proxy net.lightbody.bmp - 2.1.37 + 2.1.38 4.0.0 diff --git a/pom.xml b/pom.xml index 2436e5384..abd7e82b9 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.lightbody.bmp browsermob-proxy - 2.1.37 + 2.1.38 browsermob-core browsermob-legacy @@ -240,9 +240,9 @@ - org.fluentd - fluent-logger - 0.3.4 + co.elastic.logging + log4j2-ecs-layout + 0.5.0