@Override public Mono<Closeable> start(ConnectionAcceptor acceptor) { Objects.requireNonNull(acceptor, "acceptor must not be null"); return server .route( routes -> { routesBuilder.accept(routes); routes.ws(path, newHandler(acceptor)); }) .bind() .map(CloseableChannel::new); }
@Override public Mono<Closeable> start(ConnectionAcceptor acceptor) { Objects.requireNonNull(acceptor, "acceptor must not be null"); return server .route( routes -> { routesBuilder.accept(routes); routes.ws(path, newHandler(acceptor)); }) .bind() .map(CloseableChannel::new); }
@Test public void startRouterAndAwait() throws InterruptedException { ExecutorService ex = Executors.newSingleThreadExecutor(); AtomicReference<DisposableServer> ref = new AtomicReference<>(); Future<?> f = ex.submit(() -> HttpServer.create() .port(0) .route(routes -> routes.get("/hello", (req, resp) -> resp.sendString(Mono.just("hello!")))) .wiretap(true) .bindUntilJavaShutdown(Duration.ofSeconds(2), ref::set) ); //if the server cannot be started, a ExecutionException will be thrown instead assertThatExceptionOfType(TimeoutException.class) .isThrownBy(() -> f.get(1, TimeUnit.SECONDS)); //the router is not done and is still blocking the thread assertThat(f.isDone()).isFalse(); assertThat(ref.get()).isNotNull().withFailMessage("Server is not initialized after 1s"); //shutdown the router to unblock the thread ref.get().disposeNow(); Thread.sleep(100); assertThat(f.isDone()).isTrue(); }
private void init() { HttpServer.create() .host(bindAddress) .port(bindPort) .route(routes -> routes.post(metricsUrl, this::handle).get(metricsUrl, this::handle)) .bind() .subscribe(); }
@Test public void backpressured() throws Exception { Path resource = Paths.get(getClass().getResource("/public").toURI()); DisposableServer c = HttpServer.create() .port(0) .route(routes -> routes.directory("/test", resource)) .wiretap(true) .bindNow(); ByteBufFlux remote = createHttpClientForContextWithPort(c) .get() .uri("/test/test.css") .responseContent(); Mono<String> page = remote.asString() .limitRate(1) .reduce(String::concat); Mono<String> cancelledPage = remote.asString() .take(5) .limitRate(1) .reduce(String::concat); page.block(Duration.ofSeconds(30)); cancelledPage.block(Duration.ofSeconds(30)); page.block(Duration.ofSeconds(30)); c.disposeNow(); }
@Test(timeout = 10000) public void testHang() { DisposableServer httpServer = HttpServer.create() .port(0) .host("0.0.0.0") .route(r -> r.get("/data", (request, response) -> response.send(Mono.empty()))) .wiretap(true) .bindNow(); assertNotNull(httpServer); httpServer.disposeNow(); }
@Test @Ignore public void startProxyServer() { HttpServer server = HttpServer.create() .port(PROXY_PORT) .host("0.0.0.0"); server.route(routes -> routes.get("/0/**", this::proxy)) .wiretap(true) .bindNow(); }
private void setupServer() { httpServer = HttpServer.create() .port(0) .route(routes -> { routes.get("/get/{name}", getHandler()) .post("/post", postHandler()); }) .wiretap(true) .bindNow(); }
@Test @Ignore public void proxyTest() { HttpServer server = HttpServer.create(); server.route(r -> r.get("/search/{search}", (in, out) -> HttpClient.create() .wiretap(true) .get() .uri("foaas.herokuapp.com/life/" + in.param("search")) .response((repliesOut, buf) -> out.send(buf)))) .wiretap(true) .bindNow() .onDispose() .block(Duration.ofSeconds(30)); }
@Test @Ignore public void wsTest() { HttpServer server = HttpServer.create(); server.route(r -> r.get("/search/{search}", (in, out) -> HttpClient.create() .wiretap(true) .post() .uri("ws://localhost:3000") .send((requestOut, o) -> o.sendString(Mono.just("ping"))) .response((repliesOut, buf) -> out.sendGroups(buf.window(100))))) .wiretap(true) .bindNow() .onDispose() .block(Duration.ofSeconds(30)); }
@Test @Ignore public void startContentServer() { Random random = new Random(0); byte[] content = new byte[1024 * 10]; random.nextBytes(content); HttpServer server = HttpServer.create() .port(CONTENT_SERVER_PORT) .tcpConfiguration(tcpServer -> tcpServer.host("0.0.0.0") .option(ChannelOption.SO_LINGER, -1)); server.route(routes -> routes.get("/**", (req, res) -> res.header("Content-length", String.valueOf(content.length)) .header("Content-type", "application/octet-stream") .header("Connection", "Close") .sendByteArray(Flux.just(content)))) .wiretap(true) .bindNow(); }
@Test public void testDeferredHeader() { DisposableServer context = HttpServer.create() .host("localhost") .route(r -> r.get("/201", (req, res) -> res.addHeader ("Content-Length", "0") .status(HttpResponseStatus.CREATED) .sendHeaders())) .bindNow(); createHttpClientForContextWithAddress(context) .headersWhen(h -> Mono.just(h.set("test", "test")).delayElement(Duration.ofSeconds(2))) .observe((c, s) -> System.out.println(s + "" + c)) .get() .uri("/201") .responseContent() .repeat(4) .blockLast(); context.disposeNow(); }
@Test public void clientWithoutCookieGetsANewOneFromServer() { DisposableServer server = HttpServer.create() .port(0) .route(r -> r.get("/test", (req, resp) -> resp.addCookie(new DefaultCookie("cookie1", "test_value")) .send(req.receive() .log("server received")))) .wiretap(true) .bindNow(); Mono<Map<CharSequence, Set<Cookie>>> cookieResponse = HttpClient.create() .port(server.port()) .wiretap(true) .get() .uri("/test") .responseSingle((res, buf) -> Mono.just(res.cookies())) .doOnSuccess(System.out::println) .doOnError(t -> System.err.println("Failed requesting server: " + t.getMessage())); StepVerifier.create(cookieResponse) .expectNextMatches(l -> { Set<Cookie> cookies = l.get("cookie1"); return cookies.stream().anyMatch(e -> e.value().equals("test_value")); }) .expectComplete() .verify(Duration.ofSeconds(30)); server.disposeNow(); }
@Test public void httpRespondsEmpty() { DisposableServer server = HttpServer.create() .port(0) .route(r -> r.post("/test/{param}", (req, res) -> Mono.empty())) .wiretap(true) .bindNow(); HttpClient client = HttpClient.create() .port(server.address().getPort()) .wiretap(true); Mono<ByteBuf> content = client.headers(h -> h.add("Content-Type", "text/plain")) .post() .uri("/test/World") .send(ByteBufFlux.fromString(Mono.just("Hello") .log("client-send"))) .responseContent() .log("client-received") .next() .doOnError(t -> System.err.println("Failed requesting server: " + t.getMessage())); StepVerifier.create(content) .expectComplete() .verify(Duration.ofSeconds(5000)); server.disposeNow(); }
@Test public void testCookie() { DisposableServer context = HttpServer.create() .host("localhost") .route(r -> r.get("/201", (req, res) -> res.addHeader("test", req.cookies() .get("test") .stream() .findFirst() .get() .value()) .status(HttpResponseStatus.CREATED) .sendHeaders())) .bindNow(); createHttpClientForContextWithAddress(context) .cookie("test", c -> c.setValue("lol")) .get() .uri("/201") .responseContent() .blockLast(); context.disposeNow(); }
@Test public void httpStatusCode404IsHandledByTheClient() { DisposableServer server = HttpServer.create() .port(0) .route(r -> r.post("/test", (req, res) -> res.send(req.receive() .log("server-received")))) .wiretap(true) .bindNow(); HttpClient client = HttpClient.create() .port(server.address().getPort()) .wiretap(true); Mono<Integer> content = client.headers(h -> h.add("Content-Type", "text/plain")) .request(HttpMethod.GET) .uri("/unsupportedURI") .send(ByteBufFlux.fromString(Flux.just("Hello") .log("client-send"))) .responseSingle((res, buf) -> Mono.just(res.status().code())) .doOnError(t -> System.err.println("Failed requesting server: " + t.getMessage())); StepVerifier.create(content) .expectNext(404) .verifyComplete(); server.disposeNow(); } }
@Test public void test() { DisposableServer server = HttpServer.create() .port(0) .route(httpServerRoutes -> httpServerRoutes.get( "/", (httpServerRequest, httpServerResponse) -> { return httpServerResponse.sendString( Mono.error(new IllegalArgumentException())); })) .bindNow(Duration.ofSeconds(30)); HttpClient client = HttpClient.create() .port(server.address().getPort()); StepVerifier.create(client.get() .uri("/") .responseContent() .asString(StandardCharsets.UTF_8) .collectList()) .verifyError(IOException.class); server.disposeNow(); } }
private void setupFakeProtocolListener() { broadcaster = TopicProcessor.create(); final Processor<List<String>, List<String>> processor = WorkQueueProcessor.<List<String>>builder().autoCancel(false).build(); Flux.from(broadcaster) .buffer(5) .subscribe(processor); httpServer = HttpServer.create() .port(0) .route(r -> r.get("/data", (req, resp) -> resp.options(NettyPipeline.SendOptions::flushOnEach) .send(Flux.from(processor) .log("server") .timeout(Duration.ofSeconds( 2), Flux.empty()) .concatWith(Flux.just( new ArrayList<>())) .map(new DummyListEncoder( resp.alloc() ))))) .wiretap(true) .bindNow(); }
DisposableServer httpServer = HttpServer.create() .port(0) .route( routes -> routes.post("/login", (req, res) -> res.status(serverStatus).sendHeaders()) .get("/ws", (req, res) -> {
@Test public void nonContentStatusCodes() { DisposableServer server = HttpServer.create() .port(0) .host("localhost") .route(r -> r.get("/204-1", (req, res) -> res.status(HttpResponseStatus.NO_CONTENT) .sendHeaders()) .get("/204-2", (req, res) -> res.status(HttpResponseStatus.NO_CONTENT)) .get("/205-1", (req, res) -> res.status(HttpResponseStatus.RESET_CONTENT) .sendHeaders()) .get("/205-2", (req, res) -> res.status(HttpResponseStatus.RESET_CONTENT)) .get("/304-1", (req, res) -> res.status(HttpResponseStatus.NOT_MODIFIED) .sendHeaders()) .get("/304-2", (req, res) -> res.status(HttpResponseStatus.NOT_MODIFIED)) .get("/304-3", (req, res) -> res.status(HttpResponseStatus.NOT_MODIFIED) .send())) .wiretap(true) .bindNow(); checkResponse("/204-1", server.address()); checkResponse("/204-2", server.address()); checkResponse("/205-1", server.address()); checkResponse("/205-2", server.address()); checkResponse("/304-1", server.address()); checkResponse("/304-2", server.address()); checkResponse("/304-3", server.address()); server.disposeNow(); }