private HttpServer createHttpServer() { HttpServer server = HttpServer.create(); if (this.resourceFactory != null) { LoopResources resources = this.resourceFactory.getLoopResources(); Assert.notNull(resources, "No LoopResources: is ReactorResourceFactory not initialized yet?"); server = server.tcpConfiguration((tcpServer) -> tcpServer.runOn(resources) .addressSupplier(this::getListenAddress)); } else { server = server.tcpConfiguration( (tcpServer) -> tcpServer.addressSupplier(this::getListenAddress)); } if (getSsl() != null && getSsl().isEnabled()) { SslServerCustomizer sslServerCustomizer = new SslServerCustomizer(getSsl(), getHttp2(), getSslStoreProvider()); server = sslServerCustomizer.apply(server); } if (getCompression() != null && getCompression().getEnabled()) { CompressionCustomizer compressionCustomizer = new CompressionCustomizer( getCompression()); server = compressionCustomizer.apply(server); } server = server.protocol(listProtocols()).forwarded(this.useForwardHeaders); return applyCustomizers(server); }
@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 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 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 @Ignore public void testH2PriorKnowledge() throws Exception { // SelfSignedCertificate cert = new SelfSignedCertificate(); // SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .protocol(HttpProtocol.H2C) .port(8080) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }
@Test @Ignore public void testHttp1or2() throws Exception { // SelfSignedCertificate cert = new SelfSignedCertificate(); // SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .protocol(HttpProtocol.H2C, HttpProtocol.HTTP11) .port(8080) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.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 testHttpNoSslH2Fails() { StepVerifier.create( HttpServer.create() .protocol(HttpProtocol.H2) .handle((req, res) -> res.sendString(Mono.just("Hello"))) .wiretap(true) .bind() ).verifyErrorMessage("Configured H2 protocol without TLS. Use" + " a clear-text h2 protocol via HttpServer#protocol or configure TLS" + " via HttpServer#secure"); }
@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 @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 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(); }