Last active
May 29, 2022 12:11
-
-
Save ataylor284/7270580d3d46d89585f363f61b773536 to your computer and use it in GitHub Desktop.
A mininimalist http2 server with jetty
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Jetty with HTTP2 enabled | |
* Instructions: | |
* 1. Create keystore with `keytool -keystore http2_keystore.jks -storepass password -noprompt -genkey -keyalg RSA -keypass password -alias jetty \ | |
* -dname CN=localhost,OU=dev,O=sonatype,L=home,ST=cloud,C=US -ext SAN=DNS:localhost,IP:127.0.0.1 -ext BC=ca:true` | |
* 2. Run with: `groovy http2.groovy` | |
* 3. Confirm http2 is being used with `curl -v --http2 --insecure https://localhost:8443` | |
*/ | |
@Grapes([ | |
@Grab(group='javax.servlet', module='javax.servlet-api', version='3.1.0'), | |
@Grab(group='org.eclipse.jetty.alpn', module='alpn-api', version='1.1.3.v20160715'), | |
@Grab(group='org.eclipse.jetty', module='jetty-server', version='9.4.8.v20171121'), | |
@Grab(group='org.eclipse.jetty', module='jetty-servlet', version='9.4.8.v20171121'), | |
@Grab(group='org.eclipse.jetty', module='jetty-servlets', version='9.4.8.v20171121'), | |
//@Grab(group='org.eclipse.jetty', module='jetty-alpn-openjdk8-server', version='9.4.8.v20171121'), | |
@Grab(group='org.eclipse.jetty', module='jetty-alpn-conscrypt-server', version='9.4.8.v20171121'), | |
@Grab(group='org.eclipse.jetty.http2', module='http2-server', version='9.4.8.v20171121'), | |
]) | |
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.server.* | |
import org.eclipse.jetty.servlet.* | |
import org.eclipse.jetty.util.ssl.SslContextFactory | |
import javax.servlet.http.HttpServlet | |
import javax.servlet.http.HttpServletRequest | |
import javax.servlet.http.HttpServletResponse | |
import static org.eclipse.jetty.util.resource.Resource.newClassPathResource | |
def server = new Server() | |
def context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS) | |
context.addServlet(new ServletHolder(new Servlet()), "/") | |
server.setHandler(context) | |
def httpConfig = new HttpConfiguration(secureScheme: 'https', securePort: 8443) | |
def sslContextFactory = new SslContextFactory(keyStorePath: 'http2_keystore.jks', | |
keyStorePassword: 'password', | |
keyManagerPassword: 'password', | |
cipherComparator: HTTP2Cipher.COMPARATOR) | |
sslContextFactory.setProvider("Conscrypt") | |
def httpsConfig = new HttpConfiguration(httpConfig) | |
httpsConfig.addCustomizer(new SecureRequestCustomizer()) | |
def h2 = new HTTP2ServerConnectionFactory(httpsConfig) | |
//NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable() | |
def alpn = new ALPNServerConnectionFactory() | |
alpn.defaultProtocol = 'h2' | |
def ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol()) | |
def http2Connector = new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig)) | |
http2Connector.port = 8443 | |
server.addConnector(http2Connector) | |
ALPN.debug=false | |
server.start() | |
server.join() | |
class Servlet extends HttpServlet { | |
@Override | |
void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception { | |
resp.contentType = 'text/plain' | |
resp.writer.write('Hello, World!') | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment