private void testDeliverPausedBufferWhenResume(Consumer<Runnable> scheduler) throws Exception { Buffer data = TestUtils.randomBuffer(2048); int num = 10; waitFor(num); List<CompletableFuture<Void>> resumes = Collections.synchronizedList(new ArrayList<>()); for (int i = 0;i < num;i++) {
@Test public void testHttpClientRequestTimeoutResetsTheConnection() throws Exception { waitFor(3); server.requestHandler(req -> { AtomicBoolean errored = new AtomicBoolean(); req.exceptionHandler(err -> { if (errored.compareAndSet(false, true)) { complete(); } }); }); startServer(); HttpClientRequest req = client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onFailure(err -> { complete(); })); AtomicBoolean errored = new AtomicBoolean(); req.exceptionHandler(err -> { if (errored.compareAndSet(false, true)) { complete(); } }); CountDownLatch latch = new CountDownLatch(1); req.setChunked(true).sendHead(version -> latch.countDown()); awaitLatch(latch); req.setTimeout(100); await(); }
@Test public void testResponseEndHandlersChunkedResponse() { waitFor(2); AtomicInteger cnt = new AtomicInteger(); String chunk = "blah";
@Test public void testHttpInvalidConnectResponseEnded() { waitFor(2); server.requestHandler(req -> { req.response().end(); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })).end(); })); await(); }
@Test public void testFollowRedirectHost() throws Exception { String scheme = createBaseClientOptions().isSsl() ? "https" : "http"; waitFor(2); HttpServerOptions options = createBaseServerOptions(); int port = options.getPort() + 1; options.setPort(port); AtomicInteger redirects = new AtomicInteger(); server.requestHandler(req -> { redirects.incrementAndGet(); req.response().setStatusCode(301).putHeader(HttpHeaders.LOCATION, scheme + "://localhost:" + port + "/whatever").end(); }); startServer(); HttpServer server2 = vertx.createHttpServer(options); server2.requestHandler(req -> { assertEquals(1, redirects.get()); assertEquals(scheme + "://localhost:" + port + "/whatever", req.absoluteURI()); req.response().end(); complete(); }); startServer(server2); client.get(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", onSuccess(resp -> { assertEquals(scheme + "://localhost:" + port + "/whatever", resp.request().absoluteURI()); complete(); })).setFollowRedirects(true).setHost("localhost:" + options.getPort()).end(); await(); }
@Test public void testResponseEndHandlers2() { waitFor(2); AtomicInteger cnt = new AtomicInteger(); String content = "blah"; server.requestHandler(req -> { req.response().headersEndHandler(v -> { // Insert another header req.response().putHeader("extraheader", "wibble"); assertEquals(0, cnt.getAndIncrement()); }); req.response().bodyEndHandler(v -> { assertEquals(content.length(), req.response().bytesWritten()); assertEquals(1, cnt.getAndIncrement()); complete(); }); req.response().end(content); }).listen(onSuccess(server -> { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", onSuccess(res -> { assertEquals(200, res.statusCode()); assertEquals("wibble", res.headers().get("extraheader")); res.bodyHandler(buff -> { assertEquals(Buffer.buffer(content), buff); complete(); }); })).end(); })); await(); }
private void sendFile(String fileName, String contentExpected, boolean useHandler, Function<Handler<AsyncResult<HttpClientResponse>>, HttpClientRequest> requestFact) throws Exception { waitFor(2); File fileToSend = setupFile(fileName, contentExpected); server.requestHandler(req -> { if (useHandler) { Handler<AsyncResult<Void>> completionHandler = onSuccess(v -> complete()); req.response().sendFile(fileToSend.getAbsolutePath(), completionHandler); } else { req.response().sendFile(fileToSend.getAbsolutePath()); complete(); } }); startServer(); requestFact.apply(onSuccess(resp -> { assertEquals(200, resp.statusCode()); assertEquals("text/html", resp.headers().get("Content-Type")); resp.exceptionHandler(this::fail); resp.bodyHandler(buff -> { assertEquals(contentExpected, buff.toString()); assertEquals(fileToSend.length(), Long.parseLong(resp.headers().get("content-length"))); complete(); }); })).end(); await(); }
@Test public void testResponseEndHandlersSendFile() throws Exception { waitFor(2); AtomicInteger cnt = new AtomicInteger(); String content = "iqdioqwdqwiojqwijdwqd"; File toSend = setupFile("somefile.txt", content); server.requestHandler(req -> { req.response().headersEndHandler(v -> { // Insert another header req.response().putHeader("extraheader", "wibble"); assertEquals(0, cnt.getAndIncrement()); }); req.response().bodyEndHandler(v -> { assertEquals(content.length(), req.response().bytesWritten()); assertEquals(1, cnt.getAndIncrement()); complete(); }); req.response().sendFile(toSend.getAbsolutePath()); }).listen(onSuccess(server -> { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", onSuccess(res -> { assertEquals(200, res.statusCode()); assertEquals("wibble", res.headers().get("extraheader")); res.bodyHandler(buff -> { assertEquals(Buffer.buffer(content), buff); complete(); }); })).end(); })); await(); }
@Test public void testResponseEndHandlers1() { waitFor(2); AtomicInteger cnt = new AtomicInteger(); server.requestHandler(req -> { req.response().headersEndHandler(v -> { // Insert another header req.response().putHeader("extraheader", "wibble"); assertEquals(0, cnt.getAndIncrement()); }); req.response().bodyEndHandler(v -> { assertEquals(0, req.response().bytesWritten()); assertEquals(1, cnt.getAndIncrement()); complete(); }); req.response().end(); }).listen(onSuccess(server -> { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", onSuccess(res -> { assertEquals(200, res.statusCode()); assertEquals("wibble", res.headers().get("extraheader")); complete(); })).end(); })); await(); }
@Test public void testHttpInvalidConnectResponseChunked() { waitFor(2); server.requestHandler(req -> { req.response().setChunked(true).write("some-chunk"); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })).end(); })); await(); }
@Test public void testClientDecompressionError() throws Exception { waitFor(2); server.requestHandler(req -> { req.response()
@Test public void testFollowRedirectWithCustomHandler() throws Exception { String scheme = createBaseClientOptions().isSsl() ? "https" : "http"; waitFor(2); HttpServerOptions options = createBaseServerOptions(); int port = options.getPort() + 1;
@Test public void testClearPausedBuffersWhenResponseEnds() throws Exception { Buffer data = TestUtils.randomBuffer(20); int num = 10; waitFor(num); server.requestHandler(req -> { req.response().end(data); }); startServer(); client.close(); client = vertx.createHttpClient(createBaseClientOptions().setMaxPoolSize(1).setKeepAlive(true)); for (int i = 0;i < num;i++) { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { resp.bodyHandler(buff -> { assertEquals(data, buff); complete(); }); resp.pause(); vertx.setTimer(10, id -> { resp.resume(); }); })).end(); } await(); }
@Test public void testServerResponseCloseHandlerNotHoldingLock() throws Exception { waitFor(7); server.requestHandler(req -> { HttpConnection conn = req.connection();
private void testFormUploadFile(String contentStr, boolean streamToDisk) throws Exception { waitFor(2);
@Test public void testHttpClientRequestTimeoutResetsTheConnection() throws Exception { waitFor(2); server.requestHandler(req -> { AtomicBoolean errored = new AtomicBoolean(); req.exceptionHandler(err -> { if (errored.compareAndSet(false, true)) { complete(); } }); }); startServer(); HttpClientRequest req = client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> fail("Response should not be handled")); req.exceptionHandler(err -> { complete(); }); CountDownLatch latch = new CountDownLatch(1); req.sendHead(version -> latch.countDown()); awaitLatch(latch); req.setTimeout(100); await(); }
@Test public void testHttpInvalidConnectResponseEnded() { waitFor(2); server.requestHandler(req -> { req.response().end(); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> { assertEquals(200, resp.statusCode()); complete(); }).end(); })); await(); }
@Test public void testFollowRedirectHost() throws Exception { String scheme = createBaseClientOptions().isSsl() ? "https" : "http"; waitFor(2); HttpServerOptions options = createBaseServerOptions(); int port = options.getPort() + 1; options.setPort(port); AtomicInteger redirects = new AtomicInteger(); server.requestHandler(req -> { redirects.incrementAndGet(); req.response().setStatusCode(301).putHeader(HttpHeaders.LOCATION, scheme + "://localhost:" + port + "/whatever").end(); }); startServer(); HttpServer server2 = vertx.createHttpServer(options); server2.requestHandler(req -> { assertEquals(1, redirects.get()); assertEquals(scheme + "://localhost:" + port + "/whatever", req.absoluteURI()); req.response().end(); complete(); }); startServer(server2); client.get(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> { assertEquals(scheme + "://localhost:" + port + "/whatever", resp.request().absoluteURI()); complete(); }).setFollowRedirects(true).setHost("localhost:" + options.getPort()).end(); await(); }
@Test public void testHttpInvalidConnectResponseChunked() { waitFor(2); server.requestHandler(req -> { req.response().setChunked(true).write("some-chunk"); try { req.netSocket(); fail(); } catch (IllegalStateException e) { complete(); } }); server.listen(onSuccess(s -> { client.request(HttpMethod.CONNECT, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> { assertEquals(200, resp.statusCode()); complete(); }).end(); })); await(); }
@Test public void testClearPausedBuffersWhenResponseEnds() throws Exception { Buffer data = TestUtils.randomBuffer(20); int num = 10; waitFor(num); server.requestHandler(req -> { req.response().end(data); }); startServer(); client.close(); client = vertx.createHttpClient(createBaseClientOptions().setMaxPoolSize(1).setKeepAlive(true)); for (int i = 0;i < num;i++) { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> { resp.bodyHandler(buff -> { assertEquals(data, buff); complete(); }); resp.pause(); vertx.setTimer(10, id -> { resp.resume(); }); }).end(); } await(); }