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 {