Skip to content

Instantly share code, notes, and snippets.

@rhashimoto
Created September 12, 2019 19:28
Show Gist options
  • Save rhashimoto/584d270dc6d00b97c01ffbc6ee5e8e6c to your computer and use it in GitHub Desktop.
Save rhashimoto/584d270dc6d00b97c01ffbc6ee5e8e6c to your computer and use it in GitHub Desktop.
HttpCore 5.0 server with Conscrypt provider
import org.apache.hc.core5.http.*;
import org.apache.hc.core5.http.impl.bootstrap.AsyncServer;
import org.apache.hc.core5.http.impl.bootstrap.AsyncServerBootstrap;
import org.apache.hc.core5.http.message.BasicHttpResponse;
import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
import org.apache.hc.core5.http.nio.ssl.BasicServerTlsStrategy;
import org.apache.hc.core5.http.nio.ssl.FixedPortStrategy;
import org.apache.hc.core5.http.nio.support.BasicRequestConsumer;
import org.apache.hc.core5.http.nio.support.BasicResponseProducer;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.hc.core5.io.CloseMode;
import org.apache.hc.core5.reactor.IOReactorConfig;
import org.apache.hc.core5.reactor.ListenerEndpoint;
import org.apache.hc.core5.ssl.SSLContexts;
import org.apache.hc.core5.util.TimeValue;
import org.conscrypt.Conscrypt;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.security.KeyStore;
import java.util.concurrent.TimeUnit;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class ConscryptTest {
private static final int PORT = 8080;
private static final Logger logger = Logger.getLogger("test");
public static void main(String[] args) throws Exception {
logger.setLevel(Level.ALL);
ConsoleHandler loggerHandler = new ConsoleHandler();
loggerHandler.setFormatter(new SimpleFormatter());
loggerHandler.setLevel(Level.ALL);
logger.addHandler(loggerHandler);
final KeyStore keyStore = KeyStore.getInstance("PKCS12");
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
final InputStream inputStream = classLoader.getResourceAsStream("resources/test.p12");
keyStore.load(inputStream, "password".toCharArray());
final SSLContext tlsContext = SSLContexts.custom()
.setProtocol("TLSv1.2")
.setProvider(Conscrypt.newProvider())
.loadKeyMaterial(keyStore, "password".toCharArray())
.build();
final IOReactorConfig config = IOReactorConfig.custom()
.setSoTimeout(15, TimeUnit.SECONDS)
.setTcpNoDelay(true)
.build();
final AsyncServer server = AsyncServerBootstrap.bootstrap()
.setIOReactorConfig(config)
.setTlsStrategy(new BasicServerTlsStrategy(tlsContext, new FixedPortStrategy(PORT)))
.setExceptionCallback(e -> logger.log(Level.SEVERE, "", e))
.register("*", new MyRequestHandler())
.create();
Runtime.getRuntime().addShutdownHook(new Thread(() -> server.close(CloseMode.GRACEFUL)));
server.start();
ListenerEndpoint endpoint = server.listen(new InetSocketAddress(PORT)).get();
logger.fine("Listening on " + endpoint.getAddress().toString());
server.awaitShutdown(TimeValue.MAX_VALUE);
}
private static class MyRequestHandler implements AsyncServerRequestHandler<Message<HttpRequest, Void>> {
@Override
public AsyncRequestConsumer<Message<HttpRequest, Void>> prepare(
HttpRequest request,
EntityDetails entityDetails,
HttpContext context) {
return new BasicRequestConsumer<>(entityDetails != null ? new NoopEntityConsumer() : null);
}
@Override
public void handle(
Message<HttpRequest, Void> requestObject,
ResponseTrigger responseTrigger,
HttpContext context) throws HttpException, IOException {
responseTrigger.submitResponse(new BasicResponseProducer(new BasicHttpResponse(HttpStatus.SC_OK)), context);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment