From 7d285b5ed15439c376c7ba3c2aa3c89db80274eb Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 07:46:20 +0200 Subject: [PATCH 0001/1868] Upgrade Netty 4.0.23.Final, close #667 --- providers/netty/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/netty/pom.xml b/providers/netty/pom.xml index bc9e908b63..57510c4cfc 100644 --- a/providers/netty/pom.xml +++ b/providers/netty/pom.xml @@ -39,7 +39,7 @@ io.netty netty-all - 4.0.20.Final + 4.0.23.Final org.javassist From 550ce1cc02628dadcd5f976c50fce80548064579 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 07:48:21 +0200 Subject: [PATCH 0002/1868] Fix MiscUtils: closeSilently should check for nullity, close #662 --- .../main/java/org/asynchttpclient/util/MiscUtils.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/asynchttpclient/util/MiscUtils.java b/api/src/main/java/org/asynchttpclient/util/MiscUtils.java index 1943f9939b..55b5ba12cd 100644 --- a/api/src/main/java/org/asynchttpclient/util/MiscUtils.java +++ b/api/src/main/java/org/asynchttpclient/util/MiscUtils.java @@ -52,9 +52,10 @@ public static T withDefault(T value, T defaults) { } public static void closeSilently(Closeable closeable) { - try { - closeable.close(); - } catch (IOException e) { - } + if (closeable != null) + try { + closeable.close(); + } catch (IOException e) { + } } } From e33026d481671313fd4c1d35a51c9aa38371e09f Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 13:33:47 +0200 Subject: [PATCH 0003/1868] Append char instead of String --- .../providers/netty/request/NettyRequestFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java index bd2850be64..0e24e441a2 100755 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java @@ -189,9 +189,9 @@ private byte[] computeBodyFromParams(List params, Charset bodyCharset) { StringBuilder sb = new StringBuilder(); for (Param param : params) { UTF8UrlEncoder.appendEncoded(sb, param.getName()); - sb.append("="); + sb.append('='); UTF8UrlEncoder.appendEncoded(sb, param.getValue()); - sb.append("&"); + sb.append('&'); } sb.setLength(sb.length() - 1); return sb.toString().getBytes(bodyCharset); From 3014f512f2764ceb5b7893684e278fc536867927 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 13:34:37 +0200 Subject: [PATCH 0004/1868] 0 means empty file, not chunked --- .../providers/netty/request/NettyRequestFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java index 0e24e441a2..62cf4e89bb 100755 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java @@ -280,10 +280,10 @@ public NettyRequest newNettyRequest(Request request, UriComponents uri, boolean } if (body != null) { - if (body.getContentLength() > 0) - httpRequest.headers().set(HttpHeaders.Names.CONTENT_LENGTH, body.getContentLength()); - else + if (body.getContentLength() < 0) httpRequest.headers().set(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED); + else + httpRequest.headers().set(HttpHeaders.Names.CONTENT_LENGTH, body.getContentLength()); if (body.getContentType() != null) httpRequest.headers().set(HttpHeaders.Names.CONTENT_TYPE, body.getContentType()); From babb5be9c7dda2adc2fbf646dff952b48f8802ae Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 13:36:40 +0200 Subject: [PATCH 0005/1868] Don't use replace but addAfter+remove so that first frame is not lost, close #471 --- .../providers/netty/channel/ChannelManager.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/ChannelManager.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/ChannelManager.java index 6fb3b03f3b..43d8aa9bd2 100755 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/ChannelManager.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/ChannelManager.java @@ -385,8 +385,10 @@ public void upgradeProtocol(ChannelPipeline pipeline, String scheme, String host else pipeline.addFirst(HTTP_HANDLER, newHttpClientCodec()); - if (isWebSocket(scheme)) - pipeline.replace(HTTP_PROCESSOR, WS_PROCESSOR, wsProcessor); + if (isWebSocket(scheme)) { + pipeline.addAfter(HTTP_PROCESSOR, WS_PROCESSOR, wsProcessor); + pipeline.remove(HTTP_PROCESSOR); + } } public String getPoolKey(NettyResponseFuture future) { @@ -416,7 +418,8 @@ public Bootstrap getBootstrap(UriComponents uri, boolean useProxy, boolean useSS } public void upgradePipelineForWebSockets(ChannelPipeline pipeline) { - pipeline.replace(HTTP_HANDLER, WS_ENCODER_HANDLER, new WebSocket08FrameEncoder(true)); + pipeline.addAfter(HTTP_HANDLER, WS_ENCODER_HANDLER, new WebSocket08FrameEncoder(true)); + pipeline.remove(HTTP_HANDLER); pipeline.addBefore(WS_PROCESSOR, WS_DECODER_HANDLER, new WebSocket08FrameDecoder(false, false, 10 * 1024)); } From 429cc63fc92ae720e0de31df4f77f8b202952869 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 13:38:55 +0200 Subject: [PATCH 0006/1868] minor clean up --- .../netty/request/NettyRequestFactory.java | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java index 62cf4e89bb..ac3368d5c3 100755 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java @@ -266,63 +266,65 @@ public NettyRequest newNettyRequest(Request request, UriComponents uri, boolean nettyRequest = new NettyRequest(httpRequest, body); } + HttpHeaders headers = httpRequest.headers(); + if (method != HttpMethod.CONNECT) { // assign headers as configured on request for (Entry> header : request.getHeaders()) { - httpRequest.headers().set(header.getKey(), header.getValue()); + headers.set(header.getKey(), header.getValue()); } if (isNonEmpty(request.getCookies())) - httpRequest.headers().set(HttpHeaders.Names.COOKIE, CookieEncoder.encode(request.getCookies())); + headers.set(HttpHeaders.Names.COOKIE, CookieEncoder.encode(request.getCookies())); if (config.isCompressionEnabled()) - httpRequest.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, GZIP_DEFLATE); + headers.set(HttpHeaders.Names.ACCEPT_ENCODING, GZIP_DEFLATE); } if (body != null) { if (body.getContentLength() < 0) - httpRequest.headers().set(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED); + headers.set(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED); else - httpRequest.headers().set(HttpHeaders.Names.CONTENT_LENGTH, body.getContentLength()); + headers.set(HttpHeaders.Names.CONTENT_LENGTH, body.getContentLength()); if (body.getContentType() != null) - httpRequest.headers().set(HttpHeaders.Names.CONTENT_TYPE, body.getContentType()); + headers.set(HttpHeaders.Names.CONTENT_TYPE, body.getContentType()); } // connection header and friends boolean webSocket = isWebSocket(uri.getScheme()); if (method != HttpMethod.CONNECT && webSocket) { - httpRequest.headers().set(HttpHeaders.Names.UPGRADE, HttpHeaders.Values.WEBSOCKET); - httpRequest.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.UPGRADE); - httpRequest.headers().set(HttpHeaders.Names.ORIGIN, "http://" + uri.getHost() + ":" + (uri.getPort() == -1 ? isSecure(uri.getScheme()) ? 443 : 80 : uri.getPort())); - httpRequest.headers().set(HttpHeaders.Names.SEC_WEBSOCKET_KEY, getKey()); - httpRequest.headers().set(HttpHeaders.Names.SEC_WEBSOCKET_VERSION, "13"); - - } else if (!httpRequest.headers().contains(HttpHeaders.Names.CONNECTION)) { - httpRequest.headers().set(HttpHeaders.Names.CONNECTION, keepAliveHeaderValue(config)); + headers.set(HttpHeaders.Names.UPGRADE, HttpHeaders.Values.WEBSOCKET)// + .set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.UPGRADE)// + .set(HttpHeaders.Names.ORIGIN, "http://" + uri.getHost() + ":" + (uri.getPort() == -1 ? isSecure(uri.getScheme()) ? 443 : 80 : uri.getPort()))// + .set(HttpHeaders.Names.SEC_WEBSOCKET_KEY, getKey())// + .set(HttpHeaders.Names.SEC_WEBSOCKET_VERSION, "13"); + + } else if (!headers.contains(HttpHeaders.Names.CONNECTION)) { + headers.set(HttpHeaders.Names.CONNECTION, keepAliveHeaderValue(config)); } String hostHeader = hostHeader(request, uri); if (hostHeader != null) - httpRequest.headers().set(HttpHeaders.Names.HOST, hostHeader); + headers.set(HttpHeaders.Names.HOST, hostHeader); Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm(); String authorizationHeader = authorizationHeader(request, uri, proxyServer, realm); if (authorizationHeader != null) // don't override authorization but append - httpRequest.headers().add(HttpHeaders.Names.AUTHORIZATION, authorizationHeader); + headers.add(HttpHeaders.Names.AUTHORIZATION, authorizationHeader); String proxyAuthorizationHeader = proxyAuthorizationHeader(request, proxyServer, method); if (proxyAuthorizationHeader != null) - httpRequest.headers().set(HttpHeaders.Names.PROXY_AUTHORIZATION, proxyAuthorizationHeader); + headers.set(HttpHeaders.Names.PROXY_AUTHORIZATION, proxyAuthorizationHeader); // Add default accept headers - if (!httpRequest.headers().contains(HttpHeaders.Names.ACCEPT)) - httpRequest.headers().set(HttpHeaders.Names.ACCEPT, "*/*"); + if (!headers.contains(HttpHeaders.Names.ACCEPT)) + headers.set(HttpHeaders.Names.ACCEPT, "*/*"); // Add default user agent - if (!httpRequest.headers().contains(HttpHeaders.Names.USER_AGENT) && config.getUserAgent() != null) - httpRequest.headers().set(HttpHeaders.Names.USER_AGENT, config.getUserAgent()); + if (!headers.contains(HttpHeaders.Names.USER_AGENT) && config.getUserAgent() != null) + headers.set(HttpHeaders.Names.USER_AGENT, config.getUserAgent()); return nettyRequest; } From b01e94ffa0b4295ede2950736b5e132bce45f789 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 13:58:04 +0200 Subject: [PATCH 0007/1868] Target JDK7, use getHostString instead of getHostName, close #672 --- .../asynchttpclient/providers/netty/channel/SslInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/SslInitializer.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/SslInitializer.java index 31819ee86b..0a938b1f5f 100755 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/SslInitializer.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/SslInitializer.java @@ -41,7 +41,7 @@ public void connect(ChannelHandlerContext ctx, SocketAddress remoteAddress, Sock throws Exception { InetSocketAddress remoteInetSocketAddress = (InetSocketAddress) remoteAddress; - String peerHost = remoteInetSocketAddress.getHostName(); + String peerHost = remoteInetSocketAddress.getHostString(); int peerPort = remoteInetSocketAddress.getPort(); SslHandler sslHandler = channelManager.createSslHandler(peerHost, peerPort); From 6918cced9415327adf2d636d66d84bb8d604c6fc Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 14:12:35 +0200 Subject: [PATCH 0008/1868] Do not block the WebSocket from receiving bytes or text fragments, close #660 --- .../providers/netty/ws/NettyWebSocket.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/ws/NettyWebSocket.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/ws/NettyWebSocket.java index d93e3ef8dc..3cdb818a50 100755 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/ws/NettyWebSocket.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/ws/NettyWebSocket.java @@ -179,10 +179,8 @@ private boolean hasWebSocketTextListener() { @Override public WebSocket addWebSocketListener(WebSocketListener l) { listeners.add(l); - if (l instanceof WebSocketByteListener) - interestedInByteMessages = true; - else if (l instanceof WebSocketTextListener) - interestedInTextMessages = true; + interestedInByteMessages = interestedInByteMessages || l instanceof WebSocketByteListener; + interestedInTextMessages = interestedInTextMessages || l instanceof WebSocketTextListener; return this; } @@ -192,7 +190,7 @@ public WebSocket removeWebSocketListener(WebSocketListener l) { if (l instanceof WebSocketByteListener) interestedInByteMessages = hasWebSocketByteListener(); - else if (l instanceof WebSocketTextListener) + if (l instanceof WebSocketTextListener) interestedInTextMessages = hasWebSocketTextListener(); return this; From 21660bae880b13b4909a2e018648e3e9723ef2e2 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 14:15:08 +0200 Subject: [PATCH 0009/1868] Wrong javadoc, close #666 --- api/src/main/java/org/asynchttpclient/Request.java | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/main/java/org/asynchttpclient/Request.java b/api/src/main/java/org/asynchttpclient/Request.java index 597931456f..e292e8b5e8 100644 --- a/api/src/main/java/org/asynchttpclient/Request.java +++ b/api/src/main/java/org/asynchttpclient/Request.java @@ -34,7 +34,6 @@ * .setPassword(admin) * .setRealmName("MyRealm") * .setScheme(Realm.AuthScheme.DIGEST).build()); - * r.execute(); * */ public interface Request { From b0ec7416912eeb0ca835bdead850f38c7e6e8851 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sat, 23 Aug 2014 15:04:53 +0200 Subject: [PATCH 0010/1868] Add handler callbacks, close #673 --- .../AsyncHandlerExtensions.java | 24 ++++++++++++++--- .../netty/request/NettyConnectListener.java | 27 ++++++++++--------- .../netty/request/NettyRequestSender.java | 19 +++++++++---- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java b/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java index fd4a5bf79e..1d81570b0f 100644 --- a/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java +++ b/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java @@ -19,7 +19,6 @@ * * More additional hooks might come, such as: *