You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2012/06/12 11:17:23 UTC

svn commit: r1349206 - in /camel/trunk/components/camel-websocket: pom.xml src/main/java/org/apache/camel/component/websocket/WebsocketComponent.java src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java

Author: cmoulliard
Date: Tue Jun 12 09:17:23 2012
New Revision: 1349206

URL: http://svn.apache.org/viewvc?rev=1349206&view=rev
Log:
Add staticResources parameter for endpoint and CORS

Modified:
    camel/trunk/components/camel-websocket/pom.xml
    camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketComponent.java
    camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java

Modified: camel/trunk/components/camel-websocket/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-websocket/pom.xml?rev=1349206&r1=1349205&r2=1349206&view=diff
==============================================================================
--- camel/trunk/components/camel-websocket/pom.xml (original)
+++ camel/trunk/components/camel-websocket/pom.xml Tue Jun 12 09:17:23 2012
@@ -41,6 +41,7 @@
             ${camel.osgi.import.defaults},
             *
         </camel.osgi.import.pkg>
+        <!-- ><jetty-version>8.1.3.v20120416</jetty-version>-->
     </properties>
 
     <dependencies>
@@ -62,6 +63,11 @@
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlets</artifactId>
+            <version>${jetty-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-jmx</artifactId>
             <version>${jetty-version}</version>
         </dependency>
@@ -111,4 +117,4 @@
         </plugins>
 
     </build>
-</project>
\ No newline at end of file
+</project>

Modified: camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketComponent.java?rev=1349206&r1=1349205&r2=1349206&view=diff
==============================================================================
--- camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketComponent.java (original)
+++ camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketComponent.java Tue Jun 12 09:17:23 2012
@@ -18,7 +18,7 @@ package org.apache.camel.component.webso
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.net.InetSocketAddress;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +34,7 @@ import org.apache.camel.util.jsse.SSLCon
 import org.eclipse.jetty.http.ssl.SslContextFactory;
 import org.eclipse.jetty.jmx.MBeanContainer;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.DispatcherType;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.SessionManager;
@@ -46,8 +47,11 @@ import org.eclipse.jetty.server.session.
 import org.eclipse.jetty.server.ssl.SslConnector;
 import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
 import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.FilterHolder;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlets.CrossOriginFilter;
+import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.eclipse.jetty.util.thread.ThreadPool;
 import org.slf4j.Logger;
@@ -154,6 +158,14 @@ public class WebsocketComponent extends 
                 ServletContextHandler context = createContext(server, connector, endpoint.getHandlers());
                 server.setHandler(context);
 
+                // Apply CORS (http://www.w3.org/TR/cors/)
+                applyCrossOriginFiltering(endpoint, context);
+
+                // Create Static resources
+                if (endpoint.getStaticResources() != null) {
+                    server = createStaticResourcesServer(server, context, endpoint.getStaticResources());
+                }
+
                 // Don't provide a Servlet object as Producer/Consumer will create them later on
                 connectorRef = new ConnectorRef(server, connector, null);
 
@@ -242,8 +254,9 @@ public class WebsocketComponent extends 
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
 
-        Boolean enableJmx = getAndRemoveParameter(parameters, "enableJmx", Boolean.class);
         SSLContextParameters sslContextParameters = resolveAndRemoveReferenceParameter(parameters, "sslContextParametersRef", SSLContextParameters.class);
+        Boolean enableJmx = getAndRemoveParameter(parameters, "enableJmx", Boolean.class);
+        String staticResources = getAndRemoveParameter(parameters, "staticResources", String.class);
         int port = extractPortNumber(remaining);
         String host = extractHostName(remaining);
 
@@ -255,8 +268,29 @@ public class WebsocketComponent extends 
             endpoint.setEnableJmx(isEnableJmx());
         }
 
+        /*
         if (sslContextParameters == null) {
             sslContextParameters = this.sslContextParameters;
+        } */
+
+        // prefer to use endpoint configured over component configured
+        if (sslContextParameters == null) {
+            // fallback to component configured
+            sslContextParameters = getSslContextParameters();
+        }
+
+        if (sslContextParameters != null) {
+            endpoint.setSslContextParameters(sslContextParameters);
+        }
+
+        // prefer to use endpoint configured over component configured
+        if (staticResources == null) {
+            // fallback to component configured
+            staticResources = getStaticResources();
+        }
+
+        if (staticResources != null) {
+            endpoint.setStaticResources(staticResources);
         }
 
         endpoint.setSslContextParameters(sslContextParameters);
@@ -301,13 +335,7 @@ public class WebsocketComponent extends 
         return server;
     }
 
-    protected Server createStaticResourcesServer(ServletContextHandler context, String host, int port, String home) {
-        Server server = new Server();
-
-        Connector connector = new SelectChannelConnector();
-        connector.setHost(host);
-        connector.setPort(port);
-        server.addConnector(connector);
+    protected Server createStaticResourcesServer(Server server, ServletContextHandler context, String home) throws Exception {
 
         context.setContextPath("/");
 
@@ -316,13 +344,15 @@ public class WebsocketComponent extends 
         context.setSessionHandler(sh);
 
         if (home != null) {
-            if (home.startsWith("classpath:")) {
-                home = ObjectHelper.after(home, "classpath:");
-                LOG.debug("Using base resource from classpath: {}", home);
-                context.setBaseResource(new JettyClassPathResource(getCamelContext().getClassResolver(), home));
-            } else {
-                LOG.debug("Using base resource: {}", home);
-                context.setResourceBase(home);
+            String[] resources = home.split(":");
+            if (LOG.isDebugEnabled()) {
+                LOG.debug(">>> Protocol found: " + resources[0] + ", and resource: " + resources[1]);
+            }
+
+            if (resources[0].equals("classpath")) {
+                context.setBaseResource(new JettyClassPathResource(getCamelContext().getClassResolver(), resources[1]));
+            } else if (resources[0].equals("file")) {
+                context.setBaseResource(Resource.newResource(resources[1]));
             }
             DefaultServlet defaultServlet = new DefaultServlet();
             ServletHolder holder = new ServletHolder(defaultServlet);
@@ -338,6 +368,15 @@ public class WebsocketComponent extends 
         return server;
     }
 
+    protected Server createStaticResourcesServer(ServletContextHandler context, String host, int port, String home) throws Exception {
+        Server server = new Server();
+        Connector connector = new SelectChannelConnector();
+        connector.setHost(host);
+        connector.setPort(port);
+        server.addConnector(connector);
+        return createStaticResourcesServer(server, context, home);
+    }
+
     protected WebsocketComponentServlet addServlet(NodeSynchronization sync, WebsocketProducer producer, String remaining) throws Exception {
 
         // Get Connector from one of the Jetty Instances to add WebSocket Servlet
@@ -352,10 +391,10 @@ public class WebsocketComponent extends 
             servlet = servlets.get(pathSpec);
             if (servlet == null) {
                 // Retrieve Context
-                ServletContextHandler context = (ServletContextHandler)connectorRef.server.getHandler();
+                ServletContextHandler context = (ServletContextHandler) connectorRef.server.getHandler();
                 servlet = createServlet(sync, pathSpec, servlets, context);
                 connectorRef.servlet = servlet;
-                LOG.debug("WebSocket servlet added for the following path : " + pathSpec + ", to the Jetty Server : " + key);
+                LOG.debug("WebSocket Producer Servlet added for the following path : " + pathSpec + ", to the Jetty Server : " + key);
             }
             return servlet;
         } else {
@@ -377,14 +416,14 @@ public class WebsocketComponent extends 
             servlet = servlets.get(pathSpec);
             if (servlet == null) {
                 // Retrieve Context
-                ServletContextHandler context = (ServletContextHandler)connectorRef.server.getHandler();
+                ServletContextHandler context = (ServletContextHandler) connectorRef.server.getHandler();
                 servlet = createServlet(sync, pathSpec, servlets, context);
                 connectorRef.servlet = servlet;
                 servlets.put(pathSpec, servlet);
                 LOG.debug("WebSocket servlet added for the following path : " + pathSpec + ", to the Jetty Server : " + key);
             }
 
-            if (servlet.getConsumer() == null)  {
+            if (servlet.getConsumer() == null) {
                 servlet.setConsumer(consumer);
             }
             return servlet;
@@ -402,7 +441,7 @@ public class WebsocketComponent extends 
 
     protected ServletContextHandler createContext(Server server, Connector connector, List<Handler> handlers) throws Exception {
         ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.NO_SECURITY | ServletContextHandler.NO_SESSIONS);
-        context.setConnectorNames(new String[] {connector.getName()});
+        context.setConnectorNames(new String[]{connector.getName()});
 
         if (handlers != null && !handlers.isEmpty()) {
             for (Handler handler : handlers) {
@@ -457,6 +496,26 @@ public class WebsocketComponent extends 
             SslContextFactory sslContextFactory = new WebSocketComponentSslContextFactory();
             try {
                 sslContextFactory.setSslContext(sslContextParameters.createSSLContext());
+
+                if (sslContextParameters.getCipherSuites() != null) {
+                    String[] ciphers = (String[]) sslContextParameters.getCipherSuites().getCipherSuite().toArray();
+                    sslContextFactory.setIncludeCipherSuites(ciphers);
+                } else {
+                    // Define Cipher suites
+                    String[] ciphers = {"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "Unknown 0x0:0x88", "Unknown 0x0:0x87"
+                            , "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"
+                            , "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", "Unknown 0x0:0x84", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"
+                            , "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
+                            , "Unknown 0x0:0x45", "Unknown 0x0:0x44", "SSL_DHE_DSS_WITH_RC4_128_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"
+                            , "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_ECDH_RSA_WITH_RC4_128_SHA", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"
+                            , "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", "Unknown 0x0:0x96", "Unknown 0x0:0x41"
+                            , "SSL_RSA_WITH_RC4_128_SHA", "SSL_RSA_WITH_RC4_128_MD5", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"
+                            , "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
+                            , "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"
+                            , "SSL_RSA_WITH_3DES_EDE_CBC_SHA"};
+                    sslContextFactory.setIncludeCipherSuites(ciphers);
+                }
+
             } catch (Exception e) {
                 throw new RuntimeCamelException("Error initiating SSLContext.", e);
             }
@@ -562,6 +621,16 @@ public class WebsocketComponent extends 
         }
     }
 
+    private void applyCrossOriginFiltering(WebsocketEndpoint endpoint, ServletContextHandler context) {
+        if (endpoint.isCrossOriginFilterOn()) {
+            FilterHolder filterHolder = new FilterHolder();
+            CrossOriginFilter filter = new CrossOriginFilter();
+            filterHolder.setFilter(filter);
+            filterHolder.setInitParameter("allowedOrigins", endpoint.getAllowedOrigins());
+            context.addFilter(filterHolder, endpoint.getFilterPath(), EnumSet.allOf(DispatcherType.class));
+        }
+    }
+
     // Properties
     // -------------------------------------------------------------------------
 

Modified: camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java?rev=1349206&r1=1349205&r2=1349206&view=diff
==============================================================================
--- camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java (original)
+++ camel/trunk/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java Tue Jun 12 09:17:23 2012
@@ -42,11 +42,16 @@ public class WebsocketEndpoint extends D
     private Boolean sendToAll;
     private boolean enableJmx;
     private boolean sessionSupport;
+    private boolean crossOriginFilterOn;
 
     private String remaining;
     private String host;
+    private String allowedOrigins;
+    // Used to filter CORS
+    private String filterPath;
+
     // Base Resource for the ServletContextHandler
-    private String home;
+    private String staticResources;
 
     private Integer port;
 
@@ -126,12 +131,12 @@ public class WebsocketEndpoint extends D
         this.port = port;
     }
 
-    public String getHome() {
-        return home;
+    public String getStaticResources() {
+        return staticResources;
     }
 
-    public void setHome(String home) {
-        this.home = home;
+    public void setStaticResources(String staticResources) {
+        this.staticResources = staticResources;
     }
 
     public Boolean getSendToAll() {
@@ -183,6 +188,30 @@ public class WebsocketEndpoint extends D
         this.enableJmx = enableJmx;
     }
 
+    public String getAllowedOrigins() {
+        return allowedOrigins;
+    }
+
+    public void setAllowedOrigins(String allowedOrigins) {
+        this.allowedOrigins = allowedOrigins;
+    }
+
+    public boolean isCrossOriginFilterOn() {
+        return crossOriginFilterOn;
+    }
+
+    public void setCrossOriginFilterOn(boolean crossOriginFilterOn) {
+        this.crossOriginFilterOn = crossOriginFilterOn;
+    }
+
+    public String getFilterPath() {
+        return filterPath;
+    }
+
+    public void setFilterPath(String filterPath) {
+        this.filterPath = filterPath;
+    }
+
 
     @Override
     protected void doStart() throws Exception {