From 08f56338bf7be0552974c636582ef7d8ed7dd169 Mon Sep 17 00:00:00 2001 From: Laurent Querel Date: Thu, 10 Mar 2011 11:45:39 +0100 Subject: [PATCH 1/3] The header content-length is not well defined by servers. --- .../ning/http/client/providers/jdk/JDKAsyncHttpProvider.java | 2 +- src/main/java/com/ning/http/util/AsyncHttpProviderUtils.java | 5 +++++ src/main/java/com/ning/http/util/UTF8UrlEncoder.java | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ning/http/client/providers/jdk/JDKAsyncHttpProvider.java b/src/main/java/com/ning/http/client/providers/jdk/JDKAsyncHttpProvider.java index e19f7012fc..07534d406f 100644 --- a/src/main/java/com/ning/http/client/providers/jdk/JDKAsyncHttpProvider.java +++ b/src/main/java/com/ning/http/client/providers/jdk/JDKAsyncHttpProvider.java @@ -317,7 +317,7 @@ public T call() throws Exception { int byteToRead = urlConnection.getContentLength(); InputStream stream = is; - if (byteToRead <= 0) { + /* if (byteToRead <= 0) */ { // content-length is not always defined properly by servers int[] lengthWrapper = new int[1]; byte[] bytes = AsyncHttpProviderUtils.readFully(is, lengthWrapper); stream = new ByteArrayInputStream(bytes, 0, lengthWrapper[0]); diff --git a/src/main/java/com/ning/http/util/AsyncHttpProviderUtils.java b/src/main/java/com/ning/http/util/AsyncHttpProviderUtils.java index 120950a3b2..9a32b8e03c 100644 --- a/src/main/java/com/ning/http/util/AsyncHttpProviderUtils.java +++ b/src/main/java/com/ning/http/util/AsyncHttpProviderUtils.java @@ -431,6 +431,11 @@ public static Cookie parseCookie(String value) { } } + // Normalization of maxAge (LQ) + if( maxAge < -1 ) { + maxAge = -1; + } + return new Cookie(domain, cookieName, cookieValue, path, maxAge, secure); } diff --git a/src/main/java/com/ning/http/util/UTF8UrlEncoder.java b/src/main/java/com/ning/http/util/UTF8UrlEncoder.java index 9077a783ed..e06d9ee08b 100644 --- a/src/main/java/com/ning/http/util/UTF8UrlEncoder.java +++ b/src/main/java/com/ning/http/util/UTF8UrlEncoder.java @@ -74,6 +74,11 @@ public static StringBuilder appendEncoded(StringBuilder sb, String input) private final static void appendSingleByteEncoded(StringBuilder sb, int value) { + // The space char must be converted into a + (some servers doesn't support the %20 notation for space) + if (value == 32) { + sb.append('+'); + return; + } sb.append('%'); sb.append(HEX[value >> 4]); sb.append(HEX[value & 0xF]); From 72035989d993b0bc454321c60f9c8b067bcf0980 Mon Sep 17 00:00:00 2001 From: Laurent Querel Date: Sat, 12 Mar 2011 16:54:15 +0100 Subject: [PATCH 2/3] Improve logging --- src/main/java/com/ning/http/client/AsyncHttpClient.java | 5 +++++ .../client/providers/netty/NettyAsyncHttpProvider.java | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/ning/http/client/AsyncHttpClient.java b/src/main/java/com/ning/http/client/AsyncHttpClient.java index 18e65847d8..b90ceced51 100755 --- a/src/main/java/com/ning/http/client/AsyncHttpClient.java +++ b/src/main/java/com/ning/http/client/AsyncHttpClient.java @@ -202,6 +202,11 @@ public AsyncHttpClient(String providerClass, AsyncHttpClientConfig config) { this.httpProvider = loadDefaultProvider(providerClass,config); } + // LQ + public String toString() { + return httpProvider.toString(); + } + public class BoundRequestBuilder extends RequestBuilderBase { /** * Calculator used for calculating request signature for the request being diff --git a/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java b/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java index 00fb389e24..a2ea35157e 100644 --- a/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java +++ b/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java @@ -202,6 +202,14 @@ public NettyAsyncHttpProvider(AsyncHttpClientConfig config) { trackConnections = (config.getMaxTotalConnections() != -1); } + // LQ + public String toString() { + return String.format("NettyAsyncHttpProvider:\n\t- maxConnections: %d\n\t- openChannels: %s\n\t- connectionPools: %s", + maxConnections.get(), + openChannels.toString(), + connectionsPool.toString()); + } + void configureNetty() { if (asyncHttpProviderConfig != null) { for (Entry entry : asyncHttpProviderConfig.propertiesSet()) { From 0ae90b5b287953cf7fd78e13597b6b83e59939ac Mon Sep 17 00:00:00 2001 From: Laurent Querel Date: Wed, 16 Mar 2011 11:41:59 +0100 Subject: [PATCH 3/3] Decrement maxConnections only if remove returns true (to avoid multiple decrements on the same channel). --- .../client/providers/netty/NettyAsyncHttpProvider.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java b/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java index d5e03ba06f..c846327145 100644 --- a/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java +++ b/src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java @@ -147,8 +147,12 @@ public class NettyAsyncHttpProvider extends SimpleChannelUpstreamHandler impleme CleanupChannelGroup("asyncHttpClient") { @Override public boolean remove(Object o) { - maxConnections.decrementAndGet(); - return super.remove(o); + boolean removed = super.remove(o); // LQ + if( removed ) { + // decrement maxConnections only if the channel has been removed. + maxConnections.decrementAndGet(); + } + return removed; } };