| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.websocket.server; |
| |
| import java.net.URI; |
| |
| import javax.servlet.http.HttpServlet; |
| |
| import org.eclipse.jetty.http.HttpVersion; |
| import org.eclipse.jetty.server.HttpConfiguration; |
| import org.eclipse.jetty.server.HttpConnectionFactory; |
| import org.eclipse.jetty.server.SecureRequestCustomizer; |
| import org.eclipse.jetty.server.Server; |
| import org.eclipse.jetty.server.ServerConnector; |
| import org.eclipse.jetty.server.SslConnectionFactory; |
| import org.eclipse.jetty.servlet.ServletContextHandler; |
| import org.eclipse.jetty.servlet.ServletHolder; |
| import org.eclipse.jetty.toolchain.test.MavenTestingUtils; |
| import org.eclipse.jetty.util.log.Log; |
| import org.eclipse.jetty.util.log.Logger; |
| import org.eclipse.jetty.util.ssl.SslContextFactory; |
| import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; |
| |
| public class SimpleServletServer |
| { |
| private static final Logger LOG = Log.getLogger(SimpleServletServer.class); |
| private Server server; |
| private ServerConnector connector; |
| private URI serverUri; |
| private HttpServlet servlet; |
| private boolean ssl = false; |
| private SslContextFactory sslContextFactory; |
| |
| public SimpleServletServer(HttpServlet servlet) |
| { |
| this.servlet = servlet; |
| } |
| |
| public void enableSsl(boolean ssl) |
| { |
| this.ssl = ssl; |
| } |
| |
| public URI getServerUri() |
| { |
| return serverUri; |
| } |
| |
| public SslContextFactory getSslContextFactory() |
| { |
| return sslContextFactory; |
| } |
| |
| public boolean isSslEnabled() |
| { |
| return ssl; |
| } |
| |
| public void start() throws Exception |
| { |
| // Configure Server |
| server = new Server(); |
| if (ssl) |
| { |
| // HTTP Configuration |
| HttpConfiguration http_config = new HttpConfiguration(); |
| http_config.setSecureScheme("https"); |
| http_config.setSecurePort(0); |
| http_config.setOutputBufferSize(32768); |
| http_config.setRequestHeaderSize(8192); |
| http_config.setResponseHeaderSize(8192); |
| http_config.setSendServerVersion(true); |
| http_config.setSendDateHeader(false); |
| |
| sslContextFactory = new SslContextFactory(); |
| sslContextFactory.setKeyStorePath(MavenTestingUtils.getTestResourceFile("keystore").getAbsolutePath()); |
| sslContextFactory.setKeyStorePassword("storepwd"); |
| sslContextFactory.setKeyManagerPassword("keypwd"); |
| sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA","SSL_DHE_RSA_WITH_DES_CBC_SHA","SSL_DHE_DSS_WITH_DES_CBC_SHA", |
| "SSL_RSA_EXPORT_WITH_RC4_40_MD5","SSL_RSA_EXPORT_WITH_DES40_CBC_SHA","SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", |
| "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"); |
| |
| // SSL HTTP Configuration |
| HttpConfiguration https_config = new HttpConfiguration(http_config); |
| https_config.addCustomizer(new SecureRequestCustomizer()); |
| |
| // SSL Connector |
| connector = new ServerConnector(server,new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),new HttpConnectionFactory(https_config)); |
| connector.setPort(0); |
| } |
| else |
| { |
| // Basic HTTP connector |
| connector = new ServerConnector(server); |
| connector.setPort(0); |
| } |
| server.addConnector(connector); |
| |
| ServletContextHandler context = new ServletContextHandler(); |
| context.setContextPath("/"); |
| configureServletContextHandler(context); |
| server.setHandler(context); |
| |
| // Serve capture servlet |
| context.addServlet(new ServletHolder(servlet),"/*"); |
| |
| // Start Server |
| server.start(); |
| |
| // Establish the Server URI |
| String host = connector.getHost(); |
| if (host == null) |
| { |
| host = "localhost"; |
| } |
| int port = connector.getLocalPort(); |
| serverUri = new URI(String.format("%s://%s:%d/",ssl?"wss":"ws",host,port)); |
| |
| // Some debugging |
| if (LOG.isDebugEnabled()) |
| { |
| LOG.debug(server.dump()); |
| } |
| } |
| |
| protected void configureServletContextHandler(ServletContextHandler context) |
| { |
| } |
| |
| public void stop() |
| { |
| try |
| { |
| server.stop(); |
| } |
| catch (Exception e) |
| { |
| e.printStackTrace(System.err); |
| } |
| } |
| |
| public WebSocketServletFactory getWebSocketServletFactory() |
| { |
| // Try filter approach first |
| WebSocketUpgradeFilter filter = (WebSocketUpgradeFilter)this.servlet.getServletContext().getAttribute(WebSocketUpgradeFilter.class.getName()); |
| if (filter != null) |
| { |
| return filter.getFactory(); |
| } |
| |
| // Try servlet next |
| return (WebSocketServletFactory)this.servlet.getServletContext().getAttribute(WebSocketServletFactory.class.getName()); |
| } |
| } |