Updated Branches:
  refs/heads/master cf1273af0 -> 90c679c6f

CAMEL-6327: More work on new camel-netty-http component.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/90c679c6
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/90c679c6
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/90c679c6

Branch: refs/heads/master
Commit: 90c679c6fc604f402c0c997d6de5d5bf1bfe746a
Parents: cf1273a
Author: Claus Ibsen <davscl...@apache.org>
Authored: Tue Jun 18 17:18:26 2013 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Tue Jun 18 17:18:26 2013 +0200

----------------------------------------------------------------------
 .../netty/http/DefaultNettyHttpBinding.java     | 20 ++++++
 .../netty/http/NettyHttpComponent.java          |  8 ++-
 .../netty/http/NettyHttpConfiguration.java      |  9 +++
 .../http/handlers/HttpServerChannelHandler.java | 17 +++++
 .../HttpServerMultiplexChannelHandler.java      | 11 ++-
 .../http/NettyHttpBridgeEncodedPathTest.java    | 66 ++++++++++++++++++
 ...NettyHttpBridgeRouteUsingHttpClientTest.java | 72 ++++++++++++++++++++
 ...tpProducerBridgePathWithSpacesAtEndTest.java | 54 +++++++++++++++
 .../netty/http/NettyHttpProducerBridgeTest.java | 50 ++++++++++++++
 .../src/test/resources/log4j.properties         |  2 +-
 .../netty/handlers/ServerChannelHandler.java    | 12 ++++
 11 files changed, 315 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/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 adef7b9..90ddba3 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
@@ -356,15 +356,35 @@ public class DefaultNettyHttpBinding implements 
NettyHttpBinding {
 
         TypeConverter tc = 
message.getExchange().getContext().getTypeConverter();
 
+        // if we bridge endpoint then we need to skip matching headers with 
the HTTP_QUERY to avoid sending
+        // duplicated headers to the receiver, so use this skipRequestHeaders 
as the list of headers to skip
+        Map<String, Object> skipRequestHeaders = null;
+        if (configuration.isBridgeEndpoint()) {
+            String queryString = message.getHeader(Exchange.HTTP_QUERY, 
String.class);
+            if (queryString != null) {
+                skipRequestHeaders = URISupport.parseQuery(queryString);
+            }
+            // Need to remove the Host key as it should be not used
+            message.getHeaders().remove("host");
+        }
+
         // append headers
         // must use entrySet to ensure case of keys is preserved
         for (Map.Entry<String, Object> entry : 
message.getHeaders().entrySet()) {
             String key = entry.getKey();
             Object value = entry.getValue();
+
+            // we should not add headers for the parameters in the uri if we 
bridge the endpoint
+            // as then we would duplicate headers on both the endpoint uri, 
and in HTTP headers as well
+            if (skipRequestHeaders != null && 
skipRequestHeaders.containsKey(key)) {
+                continue;
+            }
+
             // use an iterator as there can be multiple values. (must not use 
a delimiter)
             final Iterator<?> it = ObjectHelper.createIterator(value, null, 
true);
             while (it.hasNext()) {
                 String headerValue = tc.convertTo(String.class, it.next());
+
                 if (headerValue != null && headerFilterStrategy != null
                         && 
!headerFilterStrategy.applyFilterToCamelHeaders(key, headerValue, 
message.getExchange())) {
                     LOG.trace("HTTP-Header: {}={}", key, headerValue);

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpComponent.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpComponent.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpComponent.java
index 6d8183b..e76f524 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpComponent.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpComponent.java
@@ -28,6 +28,7 @@ import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategyAware;
 import org.apache.camel.util.ServiceHelper;
 import org.apache.camel.util.URISupport;
+import org.apache.camel.util.UnsafeUriCharactersEncoder;
 
 /**
  * Netty HTTP based component.
@@ -36,7 +37,6 @@ public class NettyHttpComponent extends NettyComponent 
implements HeaderFilterSt
 
     // TODO: support on consumer
     // - validate routes on same port cannot have different SSL etc
-    // - bridgeEndpoint
     // - urlrewrite
 
     private final Map<Integer, HttpServerMultiplexChannelHandler> 
multiplexChannelHandlers = new HashMap<Integer, 
HttpServerMultiplexChannelHandler>();
@@ -87,14 +87,16 @@ public class NettyHttpComponent extends NettyComponent 
implements HeaderFilterSt
 
     @Override
     protected NettyConfiguration parseConfiguration(NettyConfiguration 
configuration, String remaining, Map<String, Object> parameters) throws 
Exception {
-        configuration.parseURI(new URI(remaining), parameters, this, "http", 
"https");
+        // ensure uri is encoded to be valid
+        String safe = UnsafeUriCharactersEncoder.encode(remaining);
+        URI uri = new URI(safe);
+        configuration.parseURI(uri, parameters, this, "http", "https");
 
         // force using tcp as the underlying transport
         configuration.setProtocol("tcp");
         configuration.setTextline(false);
 
         if (configuration instanceof NettyHttpConfiguration) {
-            URI uri = new URI(remaining);
             ((NettyHttpConfiguration) configuration).setPath(uri.getPath());
         }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
index cc71f9f..cc7f154 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
@@ -35,6 +35,7 @@ public class NettyHttpConfiguration extends 
NettyConfiguration {
     private boolean throwExceptionOnFailure = true;
     private boolean transferException;
     private boolean matchOnUriPrefix;
+    private boolean bridgeEndpoint;
     private String path;
 
     public NettyHttpConfiguration() {
@@ -117,6 +118,14 @@ public class NettyHttpConfiguration extends 
NettyConfiguration {
         this.matchOnUriPrefix = matchOnUriPrefix;
     }
 
+    public boolean isBridgeEndpoint() {
+        return bridgeEndpoint;
+    }
+
+    public void setBridgeEndpoint(boolean bridgeEndpoint) {
+        this.bridgeEndpoint = bridgeEndpoint;
+    }
+
     public String getPath() {
         return path;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java
index 64c1441..95ca27d 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java
@@ -24,6 +24,7 @@ import org.apache.camel.component.netty.NettyConsumer;
 import org.apache.camel.component.netty.NettyHelper;
 import org.apache.camel.component.netty.handlers.ServerChannelHandler;
 import org.apache.camel.component.netty.http.NettyHttpConsumer;
+import org.jboss.netty.buffer.ChannelBuffers;
 import org.jboss.netty.channel.ChannelFutureListener;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.ExceptionEvent;
@@ -75,17 +76,26 @@ public class HttpServerChannelHandler extends 
ServerChannelHandler {
             // are we suspended?
             LOG.debug("Consumer suspended, cannot service request {}", 
request);
             HttpResponse response = new DefaultHttpResponse(HTTP_1_1, 
SERVICE_UNAVAILABLE);
+            response.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+            response.setHeader(Exchange.CONTENT_LENGTH, 0);
+            response.setContent(ChannelBuffers.copiedBuffer(new byte[]{}));
             messageEvent.getChannel().write(response);
             return;
         }
         if (consumer.getEndpoint().getHttpMethodRestrict() != null
                 && 
!consumer.getEndpoint().getHttpMethodRestrict().contains(request.getMethod().getName()))
 {
             HttpResponse response = new DefaultHttpResponse(HTTP_1_1, 
METHOD_NOT_ALLOWED);
+            response.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+            response.setHeader(Exchange.CONTENT_LENGTH, 0);
+            response.setContent(ChannelBuffers.copiedBuffer(new byte[]{}));
             messageEvent.getChannel().write(response);
             return;
         }
         if ("TRACE".equals(request.getMethod().getName()) && 
!consumer.getEndpoint().isTraceEnabled()) {
             HttpResponse response = new DefaultHttpResponse(HTTP_1_1, 
METHOD_NOT_ALLOWED);
+            response.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+            response.setHeader(Exchange.CONTENT_LENGTH, 0);
+            response.setContent(ChannelBuffers.copiedBuffer(new byte[]{}));
             messageEvent.getChannel().write(response);
             return;
         }
@@ -95,6 +105,13 @@ public class HttpServerChannelHandler extends 
ServerChannelHandler {
     }
 
     @Override
+    protected void beforeProcess(Exchange exchange, MessageEvent messageEvent) 
{
+        if (consumer.getConfiguration().isBridgeEndpoint()) {
+            exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.TRUE);
+        }
+    }
+
+    @Override
     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent 
exceptionEvent) throws Exception {
         // only close if we are still allowed to run
         if (consumer.isRunAllowed()) {

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerMultiplexChannelHandler.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerMultiplexChannelHandler.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerMultiplexChannelHandler.java
index e00faf8..fdfdc4b 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerMultiplexChannelHandler.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerMultiplexChannelHandler.java
@@ -20,9 +20,12 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import org.apache.camel.Exchange;
 import org.apache.camel.component.netty.http.ContextPathMatcher;
 import org.apache.camel.component.netty.http.DefaultContextPathMatcher;
 import org.apache.camel.component.netty.http.NettyHttpConsumer;
+import org.apache.camel.util.UnsafeUriCharactersEncoder;
+import org.jboss.netty.buffer.ChannelBuffers;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.ExceptionEvent;
 import org.jboss.netty.channel.MessageEvent;
@@ -86,8 +89,11 @@ public class HttpServerMultiplexChannelHandler extends 
SimpleChannelUpstreamHand
             ctx.setAttachment(handler);
             handler.messageReceived(ctx, messageEvent);
         } else {
-            // this service is not available
+            // this service is not available, so send empty response back
             HttpResponse response = new DefaultHttpResponse(HTTP_1_1, 
SERVICE_UNAVAILABLE);
+            response.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+            response.setHeader(Exchange.CONTENT_LENGTH, 0);
+            response.setContent(ChannelBuffers.copiedBuffer(new byte[]{}));
             messageEvent.getChannel().write(response);
         }
     }
@@ -139,7 +145,8 @@ public class HttpServerMultiplexChannelHandler extends 
SimpleChannelUpstreamHand
             path = path.substring(0, path.length() - 1);
         }
 
-        return path;
+        String safe = UnsafeUriCharactersEncoder.encode(path);
+        return safe;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeEncodedPathTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeEncodedPathTest.java
 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeEncodedPathTest.java
new file mode 100644
index 0000000..71c0580
--- /dev/null
+++ 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeEncodedPathTest.java
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.netty.http;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class NettyHttpBridgeEncodedPathTest extends BaseNettyTest {
+
+    private int port1;
+    private int port2;
+
+    @Test
+    public void testHttpClient() throws Exception {
+        String response = template.requestBody("http://localhost:"; + port2 + 
"/nettyTestRouteA?param1=%2B447777111222", null, String.class);
+        assertEquals("Get a wrong response", "param1=+447777111222", response);
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+
+                port1 = getPort();
+                port2 = getNextPort();
+
+                errorHandler(noErrorHandler());
+
+                Processor serviceProc = new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        // %2B becomes decoded to a space
+                        Object s = exchange.getIn().getHeader("param1");
+                        // can be either + or %2B
+                        assertTrue(s.equals(" 447777111222") || 
s.equals("+447777111222") || s.equals("%2B447777111222"));
+
+                        // send back the query
+                        
exchange.getOut().setBody(exchange.getIn().getHeader(Exchange.HTTP_QUERY));
+                    }
+                };
+                from("netty-http://http://localhost:"; + port2 + 
"/nettyTestRouteA?matchOnUriPrefix=true")
+                        .log("Using NettyTestRouteA route: 
CamelHttpPath=[${header.CamelHttpPath}], CamelHttpUri=[${header.CamelHttpUri}]")
+                        .to("netty-http://http://localhost:"; + port1 + 
"/nettyTestRouteB?throwExceptionOnFailure=false&bridgeEndpoint=true");
+
+                from("netty-http://http://localhost:"; + port1 + 
"/nettyTestRouteB?matchOnUriPrefix=true")
+                        .log("Using NettyTestRouteB route: 
CamelHttpPath=[${header.CamelHttpPath}], CamelHttpUri=[${header.CamelHttpUri}]")
+                        .process(serviceProc);
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeRouteUsingHttpClientTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeRouteUsingHttpClientTest.java
 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeRouteUsingHttpClientTest.java
new file mode 100644
index 0000000..ff7958b
--- /dev/null
+++ 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpBridgeRouteUsingHttpClientTest.java
@@ -0,0 +1,72 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.netty.http;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class NettyHttpBridgeRouteUsingHttpClientTest extends BaseNettyTest {
+
+    private int port1;
+    private int port2;
+
+    @Test
+    public void testBridge() throws Exception {
+        String response = template.requestBodyAndHeader("http://localhost:"; + 
port2 + "/test/hello",
+                new ByteArrayInputStream("This is a test".getBytes()), 
"Content-Type", "application/xml", String.class);
+        assertEquals("Get a wrong response", "/", response);
+
+        response = template.requestBody("http://localhost:"; + port1 + 
"/hello/world", "hello", String.class);
+        assertEquals("Get a wrong response", "/hello/world", response);
+
+        try {
+            template.requestBody("http://localhost:"; + port2 + "/hello/world", 
"hello", String.class);
+            fail("Expect exception here!");
+        } catch (Exception ex) {
+            assertTrue("We should get a RuntimeCamelException", ex instanceof 
RuntimeCamelException);
+        }
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                port1 = getPort();
+                port2 = getNextPort();
+
+                errorHandler(noErrorHandler());
+
+                Processor serviceProc = new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        // get the request URL and copy it to the request body
+                        String uri = 
exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
+                        exchange.getOut().setBody(uri);
+                    }
+                };
+                from("netty-http:http://localhost:"; + port2 + "/test/hello")
+                        .to("http://localhost:"; + port1 + 
"?throwExceptionOnFailure=false&bridgeEndpoint=true");
+
+                from("netty-http:http://localhost:"; + port1 + 
"?matchOnUriPrefix=true").process(serviceProc);
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgePathWithSpacesAtEndTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgePathWithSpacesAtEndTest.java
 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgePathWithSpacesAtEndTest.java
new file mode 100644
index 0000000..9baf2c8
--- /dev/null
+++ 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgePathWithSpacesAtEndTest.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.netty.http;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class NettyHttpProducerBridgePathWithSpacesAtEndTest extends 
BaseNettyTest {
+
+    private int port1;
+    private int port2;
+
+    @Test
+    public void testProxy() throws Exception {
+        String reply = template.requestBody("netty-http:http://0.0.0.0:"; + 
port1 + "/foo ", "World", String.class);
+        assertEquals("Bye World", reply);
+
+        // and with more spaces
+        String reply2 = template.requestBody("netty-http:http://0.0.0.0:"; + 
port1 + "/foo /bar baz", "Camel", String.class);
+        assertEquals("Bye Camel", reply2);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                port1 = getPort();
+                port2 = getNextPort();
+
+                from("netty-http:http://0.0.0.0:"; + port1 + "/foo 
?matchOnUriPrefix=true")
+                        .to("netty-http:http://0.0.0.0:"; + port2 + "/proxy foo 
?bridgeEndpoint=true&throwExceptionOnFailure=false");
+
+                from("netty-http:http://0.0.0.0:"; + port2 + "/proxy foo 
?matchOnUriPrefix=true")
+                        .transform().simple("Bye ${body}");
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgeTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgeTest.java
 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgeTest.java
new file mode 100644
index 0000000..95109f4
--- /dev/null
+++ 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerBridgeTest.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.netty.http;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class NettyHttpProducerBridgeTest extends BaseNettyTest {
+
+    private int port1;
+    private int port2;
+
+    @Test
+    public void testProxy() throws Exception {
+        String reply = template.requestBody("netty-http:http://0.0.0.0:"; + 
port1 + "/foo", "World", String.class);
+        assertEquals("Bye World", reply);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                port1 = getPort();
+                port2 = getNextPort();
+
+                from("netty-http:http://0.0.0.0:"; + port1 + "/foo")
+                        .to("netty-http:http://0.0.0.0:"; + port2 + 
"/bar?bridgeEndpoint=true&throwExceptionOnFailure=false");
+
+                from("netty-http:http://0.0.0.0:"; + port2 + "/bar")
+                        .transform().simple("Bye ${body}");
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty-http/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/test/resources/log4j.properties 
b/components/camel-netty-http/src/test/resources/log4j.properties
index df84584..7d3c19c 100644
--- a/components/camel-netty-http/src/test/resources/log4j.properties
+++ b/components/camel-netty-http/src/test/resources/log4j.properties
@@ -22,7 +22,7 @@ log4j.rootLogger=INFO, file
 
 # uncomment the following to enable camel debugging
 #log4j.logger.org.apache.camel.component.netty=TRACE
-log4j.logger.org.apache.camel.component.netty.http=DEBUG
+#log4j.logger.org.apache.camel.component.netty.http=DEBUG
 #log4j.logger.org.apache.camel=DEBUG
 #log4j.logger.org.jboss.netty=TRACE
 

http://git-wip-us.apache.org/repos/asf/camel/blob/90c679c6/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
----------------------------------------------------------------------
diff --git 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
index 1a66cd5..2fa1bd3 100644
--- 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
+++ 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
@@ -95,6 +95,8 @@ public class ServerChannelHandler extends 
SimpleChannelUpstreamHandler {
             exchange.setProperty(Exchange.CHARSET_NAME, 
IOHelper.normalizeCharset(consumer.getConfiguration().getCharsetName()));
         }
 
+        beforeProcess(exchange, messageEvent);
+
         // process accordingly to endpoint configuration
         if (consumer.getEndpoint().isSynchronous()) {
             processSynchronously(exchange, messageEvent);
@@ -103,6 +105,16 @@ public class ServerChannelHandler extends 
SimpleChannelUpstreamHandler {
         }
     }
 
+    /**
+     * Allows any custom logic before the {@link Exchange} is processed by the 
routing engine.
+     *
+     * @param exchange       the exchange
+     * @param messageEvent   the Netty message event
+     */
+    protected void beforeProcess(final Exchange exchange, final MessageEvent 
messageEvent) {
+        // noop
+    }
+
     private void processSynchronously(final Exchange exchange, final 
MessageEvent messageEvent) {
         try {
             consumer.getProcessor().process(exchange);

Reply via email to