@Override public HttpServer apply(HttpServer server) { try { return server.secure((contextSpec) -> { SslProvider.DefaultConfigurationSpec spec = contextSpec .sslContext(getContextBuilder()); if (this.http2 != null && this.http2.isEnabled()) { spec.defaultConfiguration(SslProvider.DefaultConfigurationType.H2); } }); } catch (Exception ex) { throw new IllegalStateException(ex); } }
@Override protected void initServer() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder builder = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); this.reactorHandler = createHttpHandlerAdapter(); this.reactorServer = reactor.netty.http.server.HttpServer.create() .host(getHost()) .port(getPort()) .secure(spec -> spec.sslContext(builder).defaultConfiguration(DefaultConfigurationType.TCP)); }
@Test(expected = IllegalArgumentException.class) public void testIssue387() { HttpServer.create() .secure(sslContextSpec -> System.out.println()) .bindNow(); } }
@Override protected HttpServer customizeServerOptions(HttpServer server) { try { SslContext ctx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build(); return server.secure(ssl -> ssl.sslContext(ctx)); } catch (SSLException e) { throw new RuntimeException(e); } }
@Test public void testSslConfigurationProtocolH2_1() { DisposableServer disposableServer = server.secure(spec -> spec.sslContext(builder)) .protocol(HttpProtocol.H2) .bindNow(); assertEquals(2, protocols.size()); assertTrue(protocols.contains("h2")); assertTrue(OpenSsl.isAlpnSupported() ? sslContext instanceof OpenSslContext : sslContext instanceof JdkSslContext); disposableServer.disposeNow(); }
@Test public void testProtocolH2SslConfiguration() { DisposableServer disposableServer = server.protocol(HttpProtocol.H2) .secure(spec -> spec.sslContext(builder)) .bindNow(); assertEquals(2, protocols.size()); assertTrue(protocols.contains("h2")); assertTrue(OpenSsl.isAlpnSupported() ? sslContext instanceof OpenSslContext : sslContext instanceof JdkSslContext); disposableServer.disposeNow(); }
@Test public void testProtocolHttp11SslConfiguration() { DisposableServer disposableServer = server.protocol(HttpProtocol.HTTP11) .secure(spec -> spec.sslContext(builder)) .bindNow(); assertTrue(protocols.isEmpty()); assertTrue(OpenSsl.isAvailable() ? sslContext instanceof OpenSslContext : sslContext instanceof JdkSslContext); disposableServer.disposeNow(); }
@Test public void testSslConfigurationProtocolHttp11_1() { DisposableServer disposableServer = server.secure(spec -> spec.sslContext(builder)) .protocol(HttpProtocol.HTTP11) .bindNow(); assertTrue(protocols.isEmpty()); assertTrue(OpenSsl.isAvailable() ? sslContext instanceof OpenSslContext : sslContext instanceof JdkSslContext); disposableServer.disposeNow(); }
@Test public void testSslConfigurationProtocolH2_2() { DisposableServer disposableServer = server.protocol(HttpProtocol.HTTP11) .secure(spec -> spec.sslContext(builder)) .protocol(HttpProtocol.H2) .bindNow(); assertEquals(2, protocols.size()); assertTrue(protocols.contains("h2")); assertTrue(OpenSsl.isAlpnSupported() ? sslContext instanceof OpenSslContext : sslContext instanceof JdkSslContext); disposableServer.disposeNow(); } }
@Test public void testSslConfigurationProtocolHttp11_2() { DisposableServer disposableServer = server.protocol(HttpProtocol.H2) .secure(spec -> spec.sslContext(builder)) .protocol(HttpProtocol.HTTP11) .bindNow(); assertTrue(protocols.isEmpty()); assertTrue(OpenSsl.isAvailable() ? sslContext instanceof OpenSslContext : sslContext instanceof JdkSslContext); disposableServer.disposeNow(); }
@Test @Ignore public void testHttpSsl() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .port(8080) .secure(sslContextSpec -> sslContextSpec.sslContext(serverOptions)) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }
@Test @Ignore public void testH2OrH1Secure() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .protocol(HttpProtocol.H2, HttpProtocol.HTTP11) .secure(ssl -> ssl.sslContext(serverOptions)) .port(8080) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }
@Test @Ignore public void testH2Secure() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .protocol(HttpProtocol.H2) .secure(ssl -> ssl.sslContext(serverOptions)) .port(8080) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }
@Test @Ignore public void testHttp1or2Secure() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .protocol(HttpProtocol.H2, HttpProtocol.HTTP11) .secure(ssl -> ssl.sslContext(serverOptions)) .port(8080) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }
@Test public void sslExchangeRelativeGet() throws CertificateException, SSLException { SelfSignedCertificate ssc = new SelfSignedCertificate(); SslContext sslServer = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()) .build(); SslContext sslClient = SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE) .build(); DisposableServer context = HttpServer.create() .secure(ssl -> ssl.sslContext(sslServer)) .handle((req, resp) -> resp.sendString(Flux.just("hello ", req.uri()))) .wiretap(true) .bindNow(); String responseString = createHttpClientForContextWithAddress(context) .secure(ssl -> ssl.sslContext(sslClient)) .get() .uri("/foo") .responseSingle((res, buf) -> buf.asString(CharsetUtil.UTF_8)) .block(Duration.ofMillis(200)); context.disposeNow(); assertThat(responseString).isEqualTo("hello /foo"); }
@Test public void sslExchangeAbsoluteGet() throws CertificateException, SSLException { SelfSignedCertificate ssc = new SelfSignedCertificate(); SslContext sslServer = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build(); SslContext sslClient = SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE).build(); DisposableServer context = HttpServer.create() .secure(ssl -> ssl.sslContext(sslServer)) .handle((req, resp) -> resp.sendString(Flux.just("hello ", req.uri()))) .wiretap(true) .bindNow(); String responseString = createHttpClientForContextWithAddress(context) .secure(ssl -> ssl.sslContext(sslClient)) .get() .uri("/foo") .responseSingle((res, buf) -> buf.asString(CharsetUtil.UTF_8)) .block(); context.disposeNow(); assertThat(responseString).isEqualTo("hello /foo"); }
@Test public void testHttpSslH2CFails() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); StepVerifier.create( HttpServer.create() .protocol(HttpProtocol.H2C) .secure(ssl -> ssl.sslContext(serverOptions)) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bind() ).verifyErrorMessage("Configured H2 Clear-Text protocol with TLS. Use the non clear-text h2 protocol via HttpServer#protocol or disable TLS via HttpServer#tcpConfiguration(tcp -> tcp.noSSL())"); }
@Test @Ignore public void testIssue395() throws Exception { BiFunction<HttpServerRequest, HttpServerResponse, Mono<Void>> echoHandler = (req, res) -> res.send(req.receive().map(ByteBuf::retain)).then(); SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .secure(ssl -> ssl.sslContext(serverOptions)) .protocol(HttpProtocol.H2) .handle(echoHandler) .port(8080) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }
@Test public void testIssue473() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverSslContextBuilder = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .port(0) .wiretap(true) .secure(spec -> spec.sslContext(serverSslContextBuilder)) .bindNow(); StepVerifier.create( HttpClient.create(ConnectionProvider.newConnection()) .secure() .websocket() .uri("wss://" + server.host() + ":" + server.port()) .handle((in, out) -> Mono.empty())) .expectErrorMatches(t -> t.getCause() instanceof CertificateException) .verify(Duration.ofSeconds(30)); server.disposeNow(); }
@Test // @Ignore public void testHttpToHttp2Ssl() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .secure(sslContextSpec -> sslContextSpec.sslContext(serverOptions) .defaultConfiguration(SslProvider.DefaultConfigurationType.H2)) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); String response = HttpClient.create() .port(server.port()) .secure(ssl -> ssl.sslContext( SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE))) .wiretap(true) .get() .uri("/") .responseContent() .aggregate() .asString() .block(Duration.ofSeconds(30)); server.disposeNow(); }