Skip to content

Instantly share code, notes, and snippets.

@ataylor284
Last active May 29, 2022 12:11
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ataylor284/7270580d3d46d89585f363f61b773536 to your computer and use it in GitHub Desktop.
Save ataylor284/7270580d3d46d89585f363f61b773536 to your computer and use it in GitHub Desktop.
A mininimalist http2 server with jetty
/*
* 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