package id.kbr.prime; |
|
|
| import com.hazelcast.config.Config; |
| import com.hazelcast.core.Hazelcast; |
| import org.apache.commons.lang3.ArrayUtils; |
| import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory; |
| import org.eclipse.jetty.http2.HTTP2Cipher; |
| import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory; |
| import org.eclipse.jetty.security.ConstraintMapping; |
| import org.eclipse.jetty.security.ConstraintSecurityHandler; |
| import org.eclipse.jetty.server.*; |
| import org.eclipse.jetty.server.handler.ContextHandlerCollection; |
| import org.eclipse.jetty.server.handler.ResourceHandler; |
| import org.eclipse.jetty.server.handler.gzip.GzipHandler; |
| import org.eclipse.jetty.servlet.ServletContextHandler; |
| import org.eclipse.jetty.servlets.PushCacheFilter; |
| import org.eclipse.jetty.util.resource.Resource; |
| import org.eclipse.jetty.util.security.Constraint; |
| import org.eclipse.jetty.util.ssl.SslContextFactory; |
|
|
| import javax.servlet.FilterRegistration; |
| import java.nio.file.Paths; |
| import java.util.HashMap; |
| import java.util.TreeMap; |
|
|
| import static id.kbr.prime.JettyStarterKt.SSL_PORT; |
| import static org.apache.commons.lang3.ArrayUtils.toArray; |
|
|
|
|
| public class JettyJavaStarter implements AutoCloseable { |
| private final Server server; |
|
|
| public JettyJavaStarter(String... args) { |
| server = new Server() { |
| { |
| HttpConnectionFactory httpFactory = new HttpConnectionFactory(new HttpConfiguration() {{ |
| addCustomizer(new SecureRequestCustomizer()); |
| }}); |
| HTTP2ServerConnectionFactory http2factory = new HTTP2ServerConnectionFactory(new HttpConfiguration() {{ |
| setSecureScheme("https"); |
| setSecurePort(SSL_PORT); |
| setSendXPoweredBy(false); |
| setSendServerVersion(false); |
| addCustomizer(new SecureRequestCustomizer()); |
| }}); |
| ALPNServerConnectionFactory alpn1 = new ALPNServerConnectionFactory() {{ |
| setDefaultProtocol(httpFactory.getProtocol()); |
| }}; |
|
|
| setRequestLog(new AsyncNCSARequestLog()); |
| setConnectors( |
| new Connector[]{ |
| new ServerConnector(this, httpFactory) {{ |
| setPort(8080); |
| }}, |
| new ServerConnector(this, new SslConnectionFactory(new SslContextFactory() {{ |
| setKeyStorePath(JettyStarter.class.getResource("/keystore").toExternalForm()); |
| setCipherComparator(HTTP2Cipher.COMPARATOR); |
| setKeyStorePassword("changeit"); |
| setUseCipherSuitesOrder(true); |
| }}, alpn1.getProtocol()), http2factory, httpFactory) {{ |
| setPort(SSL_PORT); |
| }} |
| } |
| ); |
| setHandler(new ConstraintSecurityHandler() {{ |
| addConstraintMapping(new ConstraintMapping() {{ |
| setPathSpec("/*"); |
| setConstraint(new Constraint() {{ |
| setDataConstraint(DC_CONFIDENTIAL); |
| }}); |
| setHandler(new GzipHandler() {{ |
| setHandler(new ContextHandlerCollection(new ServletContextHandler() {{ |
| setContextPath("/"); |
| setHandler(new ResourceHandler() {{ |
| setWelcomeFiles(toArray("index.html")); |
| setBaseResource(Resource.newResource(Paths.get(args.length > 0 ? args[0] : AdapterServlet.Companion.getResourceBase().toString()))); |
|
|
| }}); |
| //the main feature: pass or fail? |
| FilterRegistration.Dynamic push = getServletContext().addFilter("push", PushCacheFilter.class); |
| push.setInitParameters(new HashMap<String, String>() {{ |
| put("maxAssociations", "" + 32); |
| put("ports", "" + SSL_PORT); |
| }}); |
|
|
| }}, |
| new ServletContextHandler() {{ |
| addServlet(AdapterServlet.class, "/*"); |
| }} |
| )); |
| }}); |
| }}); |
| }}); |
| } |
| }; |
| } |
|
|
| public void start() throws Exception { |
| server.start(); |
| } |
|
|
| @Override |
| public void close() throws Exception { |
| server.stop(); |
| } |
|
|
| public static void main(String... args) throws Exception { |
| AppKt.hz = Hazelcast.getOrCreateHazelcastInstance(new Config(args.length > 1 ? args[1] : "default")); |
| JettyJavaStarter it = new JettyJavaStarter(args); |
| it.start(); |
| synchronized (it) { |
| it.wait(); |
| } |
|
|
| } |
| } |