Author: davsclaus
Date: Wed May  1 09:02:37 2013
New Revision: 1477935

URL: http://svn.apache.org/r1477935
Log:
CAMEL-6327: More work on new camel-netty-http component.

Added:
    
camel/trunk/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpSSLTest.java
    camel/trunk/components/camel-netty-http/src/test/resources/jsse/
    
camel/trunk/components/camel-netty-http/src/test/resources/jsse/localhost.ks   
(with props)
Modified:
    
camel/trunk/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerPipelineFactory.java

Modified: 
camel/trunk/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerPipelineFactory.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerPipelineFactory.java?rev=1477935&r1=1477934&r2=1477935&view=diff
==============================================================================
--- 
camel/trunk/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerPipelineFactory.java
 (original)
+++ 
camel/trunk/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerPipelineFactory.java
 Wed May  1 09:02:37 2013
@@ -21,6 +21,7 @@ import javax.net.ssl.SSLEngine;
 
 import org.apache.camel.component.netty.NettyConsumer;
 import org.apache.camel.component.netty.ServerPipelineFactory;
+import org.apache.camel.component.netty.ssl.SSLEngineFactory;
 import org.apache.camel.util.ObjectHelper;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.Channels;
@@ -48,7 +49,7 @@ public class HttpServerPipelineFactory e
     public HttpServerPipelineFactory(NettyHttpConsumer nettyConsumer) {
         this.consumer = nettyConsumer;
         try {
-            this.sslContext = createSSLContext();
+            this.sslContext = createSSLContext(consumer);
         } catch (Exception e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         }
@@ -66,11 +67,10 @@ public class HttpServerPipelineFactory e
         // Create a default pipeline implementation.
         ChannelPipeline pipeline = Channels.pipeline();
 
-        if (sslContext != null) {
-            SSLEngine engine = sslContext.createSSLEngine();
-            engine.setUseClientMode(false);
-            
engine.setNeedClientAuth(consumer.getConfiguration().isNeedClientAuth());
-            pipeline.addLast("ssl", new SslHandler(engine));
+        SslHandler sslHandler = configureServerSSLOnDemand();
+        if (sslHandler != null) {
+            LOG.debug("Server SSL handler configured and added as an 
interceptor against the ChannelPipeline: {}", sslHandler);
+            pipeline.addLast("ssl", sslHandler);
         }
 
         pipeline.addLast("decoder", new HttpRequestDecoder());
@@ -89,18 +89,46 @@ public class HttpServerPipelineFactory e
         return pipeline;
     }
 
-    private SSLContext createSSLContext() throws Exception {
+    private SSLContext createSSLContext(NettyConsumer consumer) throws 
Exception {
         if (!consumer.getConfiguration().isSsl()) {
             return null;
         }
 
+        // create ssl context once
         if (consumer.getConfiguration().getSslContextParameters() != null) {
-            return 
consumer.getConfiguration().getSslContextParameters().createSSLContext();
+            SSLContext context = 
consumer.getConfiguration().getSslContextParameters().createSSLContext();
+            return context;
         }
 
         return null;
     }
 
+    private SslHandler configureServerSSLOnDemand() throws Exception {
+        if (!consumer.getConfiguration().isSsl()) {
+            return null;
+        }
+
+        if (consumer.getConfiguration().getSslHandler() != null) {
+            return consumer.getConfiguration().getSslHandler();
+        } else if (sslContext != null) {
+            SSLEngine engine = sslContext.createSSLEngine();
+            engine.setUseClientMode(false);
+            
engine.setNeedClientAuth(consumer.getConfiguration().isNeedClientAuth());
+            return new SslHandler(engine);
+        } else {
+            SSLEngineFactory sslEngineFactory = new SSLEngineFactory(
+                    consumer.getConfiguration().getKeyStoreFormat(),
+                    consumer.getConfiguration().getSecurityProvider(),
+                    consumer.getConfiguration().getKeyStoreFile(),
+                    consumer.getConfiguration().getTrustStoreFile(),
+                    consumer.getConfiguration().getPassphrase().toCharArray());
+            SSLEngine sslEngine = sslEngineFactory.createServerSSLEngine();
+            sslEngine.setUseClientMode(false);
+            
sslEngine.setNeedClientAuth(consumer.getConfiguration().isNeedClientAuth());
+            return new SslHandler(sslEngine);
+        }
+    }
+
     private boolean supportChunked() {
         return consumer.getEndpoint().getConfiguration().isChunked();
     }

Added: 
camel/trunk/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpSSLTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpSSLTest.java?rev=1477935&view=auto
==============================================================================
--- 
camel/trunk/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpSSLTest.java
 (added)
+++ 
camel/trunk/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpSSLTest.java
 Wed May  1 09:02:37 2013
@@ -0,0 +1,107 @@
+/**
+ * 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.File;
+import java.net.URL;
+import java.util.Properties;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Test;
+
+public class NettyHttpSSLTest extends BaseNettyTest {
+
+    private static final String NULL_VALUE_MARKER = 
CamelTestSupport.class.getCanonicalName();
+
+    protected Properties originalValues = new Properties();
+
+    @Override
+    public void setUp() throws Exception {
+        // ensure jsse clients can validate the self signed dummy localhost 
cert,
+        // use the server keystore as the trust store for these tests
+        URL trustStoreUrl = 
this.getClass().getClassLoader().getResource("jsse/localhost.ks");
+        setSystemProp("javax.net.ssl.trustStore", 
trustStoreUrl.toURI().getPath());
+
+        super.setUp();
+    }
+
+    @Override
+    @After
+    public void tearDown() throws Exception {
+        restoreSystemProperties();
+        super.tearDown();
+    }
+
+    protected void setSystemProp(String key, String value) {
+        String originalValue = System.setProperty(key, value);
+        originalValues.put(key, originalValue != null ? originalValue : 
NULL_VALUE_MARKER);
+    }
+
+    protected void restoreSystemProperties() {
+        for (Object key : originalValues.keySet()) {
+            Object value = originalValues.get(key);
+            if (NULL_VALUE_MARKER.equals(value)) {
+                System.getProperties().remove(key);
+            } else {
+                System.setProperty((String)key, (String)value);
+            }
+        }
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry registry = super.createRegistry();
+        registry.bind("password", "changeit");
+        registry.bind("ksf", new File("src/test/resources/jsse/localhost.ks"));
+        registry.bind("tsf", new File("src/test/resources/jsse/localhost.ks"));
+        return registry;
+    }
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testSSLInOutWithNettyConsumer() throws Exception {
+        // ibm jdks dont have sun security algorithms
+        if (isJavaVendor("ibm")) {
+            return;
+        }
+
+        getMockEndpoint("mock:input").expectedBodiesReceived("Hello World");
+
+        context.addRoutes(new RouteBuilder() {
+            public void configure() {
+                
from("netty-http:http://localhost:{{port}}?ssl=true&passphrase=#password&keyStoreFile=#ksf&trustStoreFile=#tsf";)
+                        .to("mock:input")
+                        .transform().constant("Bye World");
+            }
+        });
+        context.start();
+
+        String out = template.requestBody("https://localhost:{{port}}/foo";, 
"Hello World", String.class);
+        assertEquals("Bye World", out);
+
+        assertMockEndpointsSatisfied();
+    }
+
+}
+

Added: 
camel/trunk/components/camel-netty-http/src/test/resources/jsse/localhost.ks
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-netty-http/src/test/resources/jsse/localhost.ks?rev=1477935&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
camel/trunk/components/camel-netty-http/src/test/resources/jsse/localhost.ks
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream


Reply via email to