From 40e2536d5336cd781c6dc59c36ccdeef87d70ad1 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Tue, 26 Nov 2013 09:43:15 +0100 Subject: [PATCH 0001/2220] Port #424 on master --- .../providers/netty/NettyAsyncHttpProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/NettyAsyncHttpProvider.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/NettyAsyncHttpProvider.java index d67821c497..4b820aab87 100644 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/NettyAsyncHttpProvider.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/NettyAsyncHttpProvider.java @@ -55,8 +55,9 @@ public NettyAsyncHttpProvider(AsyncHttpClientConfig config) { @Override public String toString() { + int availablePermits = channels.freeConnections != null ? channels.freeConnections.availablePermits() : 0; return String.format("NettyAsyncHttpProvider4:\n\t- maxConnections: %d\n\t- openChannels: %s\n\t- connectionPools: %s", config.getMaxTotalConnections() - - channels.freeConnections.availablePermits(), channels.openChannels.toString(), channels.connectionsPool.toString()); + - availablePermits, channels.openChannels.toString(), channels.connectionsPool.toString()); } @Override From aa42d85261c632049ed99747cd3705e5d6c842a4 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Thu, 28 Nov 2013 22:28:16 +0100 Subject: [PATCH 0002/2220] Upgrade Netty 4.0.13 --- 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 9b884d134d..818df789ec 100644 --- a/providers/netty/pom.xml +++ b/providers/netty/pom.xml @@ -39,7 +39,7 @@ io.netty netty-all - 4.0.12.Final + 4.0.13.Final org.javassist From 19644726ce7f7fe10d14a1e560d0cdc325cf973f Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Fri, 29 Nov 2013 15:35:22 +0100 Subject: [PATCH 0003/2220] Allow Multipart with unknown content length, close #427 --- .../org/asynchttpclient/multipart/MultipartBody.java | 4 ++-- .../providers/netty/request/NettyRequestSender.java | 9 ++++++++- .../providers/netty/request/NettyRequests.java | 4 +++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/asynchttpclient/multipart/MultipartBody.java b/api/src/main/java/org/asynchttpclient/multipart/MultipartBody.java index f72aaf62c1..99525d0a21 100644 --- a/api/src/main/java/org/asynchttpclient/multipart/MultipartBody.java +++ b/api/src/main/java/org/asynchttpclient/multipart/MultipartBody.java @@ -49,9 +49,9 @@ public class MultipartBody implements RandomAccessBody { enum FileLocation {NONE, START, MIDDLE, END} - public MultipartBody(List parts, String contentType, String contentLength) { + public MultipartBody(List parts, String contentType, long contentLength) { this.boundary = MultipartEncodingUtil.getAsciiBytes(contentType.substring(contentType.indexOf("boundary=") + "boundary=".length())); - this.contentLength = Long.parseLong(contentLength); + this.contentLength = contentLength; this.parts = parts; files = new ArrayList(); diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java index 5c049d70ba..3a83fcc695 100644 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java @@ -439,7 +439,14 @@ private Body computeBody(HttpRequest nettyRequest, NettyResponseFuture future } } else if (future.getRequest().getParts() != null) { String contentType = headers.get(HttpHeaders.Names.CONTENT_TYPE); - String length = headers.get(HttpHeaders.Names.CONTENT_LENGTH); + String contentLength = nettyRequest.headers().get(HttpHeaders.Names.CONTENT_LENGTH); + + long length = -1; + if (contentLength != null) { + length = Long.parseLong(contentLength); + } else { + nettyRequest.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED); + } body = new MultipartBody(future.getRequest().getParts(), contentType, length); } diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequests.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequests.java index d5821471eb..3827789185 100644 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequests.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequests.java @@ -260,7 +260,9 @@ else if (uri.getRawQuery() != null) MultipartRequestEntity mre = AsyncHttpProviderUtils.createMultipartRequestEntity(request.getParts(), request.getHeaders()); headers.put(HttpHeaders.Names.CONTENT_TYPE, mre.getContentType()); - headers.put(HttpHeaders.Names.CONTENT_LENGTH, mre.getContentLength()); + if (mre.getContentLength() >= 0) { + headers.put(HttpHeaders.Names.CONTENT_LENGTH, mre.getContentLength()); + } hasDeferredContent = true; } else if (request.getFile() != null) { From 895adc259fd3b9ef2f1f63b7dd026a92b6e82b15 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Fri, 29 Nov 2013 15:38:33 +0100 Subject: [PATCH 0004/2220] dammit --- .../providers/grizzly/bodyhandler/PartsBodyHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/PartsBodyHandler.java b/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/PartsBodyHandler.java index f4491f391f..5dcc1bc710 100644 --- a/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/PartsBodyHandler.java +++ b/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/PartsBodyHandler.java @@ -67,8 +67,7 @@ public boolean doHandle(final FilterChainContext ctx, final FeedableBodyGenerator generator = new FeedableBodyGenerator() { @Override public Body createBody() throws IOException { - return new MultipartBody(parts, contentType, - String.valueOf(contentLength)); + return new MultipartBody(parts, contentType, contentLength); } }; generator.setFeeder(new FeedableBodyGenerator.BaseFeeder(generator) { From 81d59c1dd45a51359913d0b907542f6fe40a37c0 Mon Sep 17 00:00:00 2001 From: Jeanfrancois Arcand Date: Tue, 3 Dec 2013 16:24:29 -0500 Subject: [PATCH 0005/2220] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82921e4652..1eb2503dad 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Async Http Client library purpose is to allow Java applications to easily execut com.ning async-http-client - 1.7.20 + 1.7.22 ``` From 01aa462959ef98e64f8019856d5009813fcb09d8 Mon Sep 17 00:00:00 2001 From: Ryan Lubke Date: Tue, 3 Dec 2013 19:41:54 -0800 Subject: [PATCH 0006/2220] Fix compilation error. --- .../java/org/asynchttpclient/multipart/MultipartBodyTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/test/java/org/asynchttpclient/multipart/MultipartBodyTest.java b/api/src/test/java/org/asynchttpclient/multipart/MultipartBodyTest.java index 1e8ba2860c..ceb62a8dd0 100644 --- a/api/src/test/java/org/asynchttpclient/multipart/MultipartBodyTest.java +++ b/api/src/test/java/org/asynchttpclient/multipart/MultipartBodyTest.java @@ -79,7 +79,7 @@ private static void compareContentLength(final List parts) { final long expectedContentLength = mre.getContentLength(); // get real bytes - final Body multipartBody = new MultipartBody(parts, mre.getContentType(), String.valueOf(expectedContentLength)); + final Body multipartBody = new MultipartBody(parts, mre.getContentType(), expectedContentLength); try { final ByteBuffer buffer = ByteBuffer.allocate(8192); boolean last = false; From 22cb35acf9f55526917a93c7bb5d37933d6e44da Mon Sep 17 00:00:00 2001 From: Ryan Lubke Date: Tue, 3 Dec 2013 19:45:17 -0800 Subject: [PATCH 0007/2220] Fix for #429. --- .../providers/grizzly/bodyhandler/ByteArrayBodyHandler.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/ByteArrayBodyHandler.java b/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/ByteArrayBodyHandler.java index 9ed538e5fe..c995adef2c 100644 --- a/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/ByteArrayBodyHandler.java +++ b/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/ByteArrayBodyHandler.java @@ -46,11 +46,7 @@ public boolean doHandle(final FilterChainContext ctx, final HttpRequestPacket requestPacket) throws IOException { - String charset = request.getBodyEncoding(); - if (charset == null) { - charset = Charsets.ASCII_CHARSET.name(); - } - final byte[] data = new String(request.getByteData(), charset).getBytes(charset); + final byte[] data = request.getByteData(); final MemoryManager mm = ctx.getMemoryManager(); final Buffer gBuffer = Buffers.wrap(mm, data); if (requestPacket.getContentLength() == -1) { From ed9f9b3b2758ab6b545ff8f294f4eabb604bd338 Mon Sep 17 00:00:00 2001 From: Lukasz Kryger Date: Sun, 8 Dec 2013 22:32:07 +0000 Subject: [PATCH 0008/2220] Nitpicking: "it's" -> "its" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1eb2503dad..561933cd2f 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ Future f = c.prepareGet("http://www.ning.com/").execute(new AsyncHandler String bodyResponse = f.get(); ``` -Finally, you can also configure the AsyncHttpClient via it's AsyncHttpClientConfig object: +Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object: ```java AsyncHttpClientConfig cf = new AsyncHttpClientConfig.Builder() From 8373cc31ac81498c45a6471163df43c6a0db6029 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Thu, 12 Dec 2013 12:14:26 +0100 Subject: [PATCH 0009/2220] Implement onRequestSent for Netty provider, close #434 --- .../AsyncHandlerExtensions.java | 38 +++++++++++++++++++ .../netty/request/NettyRequestSender.java | 4 ++ 2 files changed, 42 insertions(+) create mode 100644 api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java diff --git a/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java b/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java new file mode 100644 index 0000000000..858d14201f --- /dev/null +++ b/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010-2012 Sonatype, Inc. All rights reserved. + * + * This program is licensed to you under the Apache License Version 2.0, + * and you may not use this file except in compliance with the Apache License Version 2.0. + * You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the Apache License Version 2.0 is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under. + */ +package org.asynchttpclient; + +/** + * This interface hosts new low level callback methods on {@link AsyncHandler}. + * For now, those methods are in a dedicated interface in order not to break the existing API, + * but could be merged into one of the existing ones in AHC 2. + * + * More additional hooks might come, such as: + *
    + *
  • onRetry()
  • + *
  • onConnected()
  • + *
  • onConnectionClosed()
  • + *
  • onBytesSent(long numberOfBytes)
  • + *
  • onBytesReceived(long numberOfBytes)
  • + *
+ */ +public interface AsyncHandlerExtensions { + + /** + * Notify the callback when a request is being written on the wire. + * If the original request causes multiple requests to be sent, for example, because of authorization or retry, + * it will be notified multiple times. + * Currently only supported by the Netty provider. + */ + void onRequestSent(); +} \ No newline at end of file diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java index 3a83fcc695..364c36567a 100644 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestSender.java @@ -45,6 +45,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.asynchttpclient.AsyncHandler; +import org.asynchttpclient.AsyncHandlerExtensions; import org.asynchttpclient.AsyncHttpClientConfig; import org.asynchttpclient.Body; import org.asynchttpclient.BodyGenerator; @@ -501,6 +502,9 @@ public final void writeRequest(final Channel channel, final AsyncHttpClientC // FIXME That doesn't just leave to true, the set is always done? and what's the point of not having a is/get? if (future.getAndSetWriteHeaders(true)) { try { + if (future.getAsyncHandler() instanceof AsyncHandlerExtensions) { + AsyncHandlerExtensions.class.cast(future.getAsyncHandler()).onRequestSent(); + } channel.writeAndFlush(nettyRequest, channel.newProgressivePromise()).addListener(new ProgressListener(config, true, future.getAsyncHandler(), future)); } catch (Throwable cause) { // FIXME why not notify? From 31b3f44079ff5cfa7be277d6e793e1c129e4189a Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Thu, 12 Dec 2013 12:17:07 +0100 Subject: [PATCH 0010/2220] Fix deprecation --- .../org/asynchttpclient/providers/netty/channel/Channels.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/Channels.java b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/Channels.java index bc1f091d02..b5bbbb51dc 100644 --- a/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/Channels.java +++ b/providers/netty/src/main/java/org/asynchttpclient/providers/netty/channel/Channels.java @@ -77,7 +77,7 @@ public class Channels { public static final String WS_DECODER_HANDLER = "ws-decoder"; public static final String WS_ENCODER_HANDLER = "ws-encoder"; - private static final AttributeKey DEFAULT_ATTRIBUTE = new AttributeKey("default"); + private static final AttributeKey DEFAULT_ATTRIBUTE = AttributeKey.valueOf("default"); private final AsyncHttpClientConfig config; private final NettyAsyncHttpProviderConfig asyncHttpProviderConfig; From 18b73b7433977f6a58cd17b67599342e99bbb8cb Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Thu, 12 Dec 2013 12:20:41 +0100 Subject: [PATCH 0011/2220] Add new onRetry callback method for #435 --- .../java/org/asynchttpclient/AsyncHandlerExtensions.java | 8 ++++++-- .../providers/netty/request/NettyRequestSender.java | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java b/api/src/main/java/org/asynchttpclient/AsyncHandlerExtensions.java index 858d14201f..1991d0aba1 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: *