@Override public void run() { disposableServer.onDispose().block(); }
@Override protected void startInternal() { DisposableServer server = this.reactorServer.handle(this.reactorHandler).bind().block(); setPort(server.address().getPort()); this.serverRef.set(server); }
@Override protected void stopInternal() { this.serverRef.get().dispose(); }
@Test public void httpPort() { DisposableServer blockingFacade = HttpServer.create() .port(8080) .handle((req, resp) -> resp.sendNotFound()) .wiretap(true) .bindNow(); blockingFacade.disposeNow(); assertThat(blockingFacade.address().getPort()) .isEqualTo(8080); }
@Override public void stop() throws WebServerException { if (this.disposableServer != null) { if (this.lifecycleTimeout != null) { this.disposableServer.disposeNow(this.lifecycleTimeout); } else { this.disposableServer.disposeNow(); } this.disposableServer = null; } }
@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 public void portBindingException() { DisposableServer d = HttpServer.create() .port(0) .bindNow(); try { HttpServer.create() .port(d.port()) .bindNow(); Assert.fail("illegal-success"); } catch (ChannelBindException e){ Assert.assertEquals(e.localPort(), d.port()); e.printStackTrace(); } d.disposeNow(); }
@Test public void httpPortWithAddress() { DisposableServer blockingFacade = HttpServer.create() .port(8080) .host("localhost") .handle((req, resp) -> resp.sendNotFound()) .wiretap(true) .bindNow(); blockingFacade.disposeNow(); assertThat(blockingFacade.address().getPort()) .isEqualTo(8080); }
@After public void disposeHttpServer() { if (httpServer != null) httpServer.disposeNow(); }
public static void main(String[] args) throws Exception { try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( Application.class)) { context.getBean(DisposableServer.class).onDispose().block(); } }
/** * Shutting down server of type {@link DisposableServer} if it's not null. * * @param disposableServer server * @return mono hanle */ protected final Mono<Void> shutdownServer(DisposableServer disposableServer) { return Mono.defer( () -> Optional.ofNullable(disposableServer) .map( server -> { server.dispose(); return server .onDispose() .doOnError(e -> LOGGER.warn("Failed to close server: " + e)) .onErrorResume(e -> Mono.empty()); }) .orElse(Mono.empty())); } }
@Override protected void startInternal() { DisposableServer server = this.reactorServer.handle(this.reactorHandler).bind().block(); setPort(server.address().getPort()); this.serverRef.set(server); }
@Test public void errorResponseAndReturn() { DisposableServer c = HttpServer.create() .port(0) .handle((req, resp) -> Mono.error(new Exception("returnError"))) .wiretap(true) .bindNow(); int code = HttpClient.create() .port(c.address().getPort()) .wiretap(true) .get() .uri("/return") .responseSingle((res, buf) -> Mono.just(res.status().code())) .block(); assertThat(code).isEqualTo(500); c.disposeNow(); }
@After public void tearDown() { this.connection.disposeNow(); }
@Override protected void stopInternal() { this.serverRef.get().dispose(); }
public static void main(String[] args) throws Exception { try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( Application.class)) { context.getBean(HttpServer.class).bindNow().onDispose().block(); } }