CAMEL-6861 fixed the camel-netty-http route cannot proxy the response which is chunked
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/9d7d54e7 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/9d7d54e7 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/9d7d54e7 Branch: refs/heads/master Commit: 9d7d54e770a6ea1019ee8a7a99da6c9abb726fce Parents: 32f32b9 Author: Willem Jiang <ningji...@apache.org> Authored: Mon Oct 14 16:20:53 2013 +0800 Committer: Willem Jiang <ningji...@apache.org> Committed: Mon Oct 14 16:35:33 2013 +0800 ---------------------------------------------------------------------- .../netty/http/DefaultNettyHttpBinding.java | 5 ++++ .../http/handlers/HttpClientChannelHandler.java | 2 +- .../NettyHttpClientChunkedResponseTest.java | 30 ++++++++++++++++---- 3 files changed, 30 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/9d7d54e7/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java index e64b800..84d315b 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java @@ -346,6 +346,11 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding { } if (buffer != null) { response.setContent(buffer); + // We just need to reset the readerIndex this time + if (buffer.readerIndex() == buffer.writerIndex()) { + buffer.setIndex(0, buffer.writerIndex()); + } + // TODO How to enable the chunk transport int len = buffer.readableBytes(); // set content-length response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, len); http://git-wip-us.apache.org/repos/asf/camel/blob/9d7d54e7/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpClientChannelHandler.java ---------------------------------------------------------------------- diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpClientChannelHandler.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpClientChannelHandler.java index fc508e2..497ed45 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpClientChannelHandler.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpClientChannelHandler.java @@ -85,7 +85,7 @@ public class HttpClientChannelHandler extends ClientChannelHandler { // the copy must not be readable when the content was chunked, so set the index to the end copy.setIndex(end, end); response.setContent(copy); - // we the all the content now, so call super to process the received message + // we get the all the content now, so call super to process the received message super.messageReceived(ctx, messageEvent); } } else if (msg instanceof HttpResponse) { http://git-wip-us.apache.org/repos/asf/camel/blob/9d7d54e7/tests/camel-itest/src/test/java/org/apache/camel/itest/nettyhttp/NettyHttpClientChunkedResponseTest.java ---------------------------------------------------------------------- diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/nettyhttp/NettyHttpClientChunkedResponseTest.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/nettyhttp/NettyHttpClientChunkedResponseTest.java index 88cd3be..f9a6c4a 100644 --- a/tests/camel-itest/src/test/java/org/apache/camel/itest/nettyhttp/NettyHttpClientChunkedResponseTest.java +++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/nettyhttp/NettyHttpClientChunkedResponseTest.java @@ -25,12 +25,22 @@ import org.junit.Test; public class NettyHttpClientChunkedResponseTest extends CamelTestSupport { - private int port; + private int port1; + private int port2; @Test public void testNettyHttpClientChunked() throws Exception { + invokeService(port1, true); + } + + @Test + public void testNettyHttpRouteClientChunked() throws Exception { + invokeService(port2, false); + } + + private void invokeService(int port, boolean checkChunkedHeader) { Exchange out = template.request("netty-http:http://localhost:" + port + "/test", new Processor() { -// Exchange out = template.request("jetty:http://localhost:" + port + "/test", new Processor() { + @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setBody("Camel in chunks."); @@ -38,22 +48,30 @@ public class NettyHttpClientChunkedResponseTest extends CamelTestSupport { }); assertNotNull(out); - assertEquals("Bye Camel in chunks.", out.getOut().getBody(String.class)); - assertEquals("chunked", out.getOut().getHeader("Transfer-Encoding")); + if (checkChunkedHeader) { + assertEquals("chunked", out.getOut().getHeader("Transfer-Encoding")); + } } + @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { - port = AvailablePortFinder.getNextAvailable(8000); + port1 = AvailablePortFinder.getNextAvailable(8000); + port2 = AvailablePortFinder.getNextAvailable(9000); // use jetty as server as it supports sending response as chunked encoding - from("jetty:http://localhost:" + port + "/test") + from("jetty:http://localhost:" + port1 + "/test") .setHeader("Transfer-Encoding", constant("chunked")) .transform().simple("Bye ${body}"); + + // set up a netty http proxy + from("netty-http:http://localhost:" + port2 + "/test") + .to("netty-http:http://localhost:" + port1 + "/test?bridgeEndpoint=true&throwExceptionOnFailure=false"); + } }; }