package de.consol.labs.h2c.examples.server; import org.eclipse.jetty.alpn.ALPN; import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory; import org.eclipse.jetty.http2.HTTP2Cipher; import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.server.*; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.ssl.SslContextFactory; import static org.eclipse.jetty.util.resource.Resource.newClassPathResource; /** * Based on the example {@link org.eclipse.jetty.embedded.Http2Server} included in * the jetty-project distribution. */ public class Http2Server { // In order to run this, you need the alpn-boot-XXX.jar in the bootstrap classpath. public static void main(String... args) throws Exception { Server server = new Server(); ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); context.addServlet(new ServletHolder(new Servlet()), "/"); server.setHandler(context); // HTTP Configuration HttpConfiguration http_config = new HttpConfiguration(); http_config.setSecureScheme("https"); http_config.setSecurePort(8443); // SSL Context Factory for HTTPS and HTTP/2 SslContextFactory sslContextFactory = new SslContextFactory(); sslContextFactory.setKeyStoreResource(newClassPathResource("keystore")); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); // HTTPS Configuration HttpConfiguration https_config = new HttpConfiguration(http_config); https_config.addCustomizer(new SecureRequestCustomizer()); // HTTP/2 Connection Factory HTTP2ServerConnectionFactory h2 = new MyConnectionFactory(https_config); NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable(); ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory(); alpn.setDefaultProtocol("h2"); // SSL Connection Factory SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol()); // HTTP/2 Connector ServerConnector http2Connector = new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config)); http2Connector.setPort(8443); server.addConnector(http2Connector); ALPN.debug=false; server.start(); server.join(); } private static class MyConnectionFactory extends HTTP2ServerConnectionFactory { public MyConnectionFactory(HttpConfiguration httpConfiguration) { super(httpConfiguration); } @Override public Connection newConnection(Connector connector, EndPoint endPoint) { System.out.println("Received new connection from " + endPoint.getRemoteAddress()); ConnectionTracker.getInstance().onConnection(); return super.newConnection(connector, endPoint); } } }