From: <rb...@us...> - 2016-08-15 18:20:24
|
Revision: 12899 http://sourceforge.net/p/htmlunit/code/12899 Author: rbri Date: 2016-08-15 18:20:21 +0000 (Mon, 15 Aug 2016) Log Message: ----------- use a static WeakHashMap instead of a ThreadLocal because there is no need to access the stored HttpClientBuilder from outside this class Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2016-08-15 17:43:10 UTC (rev 12898) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java 2016-08-15 18:20:21 UTC (rev 12899) @@ -137,7 +137,8 @@ private static final String HACKED_COOKIE_POLICY = "mine"; // have one per thread because this is (re)configured for every call (see configureHttpProcessorBuilder) - private ThreadLocal<HttpClientBuilder> httpClientBuilder_ = new ThreadLocal<>(); + // do not use a ThreadLocal because this in only accessed form this class + private static final Map<Thread, HttpClientBuilder> httpClientBuilder_ = new WeakHashMap<>(); private final WebClient webClient_; private String virtualHost_; @@ -206,7 +207,7 @@ // Calling code may catch the StackOverflowError, but due to the leak, the httpClient_ may // come out of connections and throw a ConnectionPoolTimeoutException. // => best solution, discard the HttpClient instance. - httpClientBuilder_.set(null); + httpClientBuilder_.remove(Thread.currentThread()); throw e; } @@ -522,7 +523,7 @@ * @return the initialized HTTP client */ protected HttpClientBuilder getHttpClientBuilder() { - HttpClientBuilder builder = httpClientBuilder_.get(); + HttpClientBuilder builder = httpClientBuilder_.get(Thread.currentThread()); if (builder == null) { builder = createHttpClient(); @@ -534,7 +535,7 @@ builder.setDefaultCookieSpecRegistry(registeryBuilder.build()); builder.setDefaultCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager())); - httpClientBuilder_.set(builder); + httpClientBuilder_.put(Thread.currentThread(), builder); } return builder; @@ -975,8 +976,9 @@ */ @Override public void close() { - if (httpClientBuilder_.get() != null) { - httpClientBuilder_.set(null); + final Thread current = Thread.currentThread(); + if (httpClientBuilder_.get(current) != null) { + httpClientBuilder_.remove(current); } if (connectionManager_ != null) { connectionManager_.shutdown(); |