/** * Convenience method for receiving the entire request body in one piece. * <p> * This saves the user having to manually setting a data and end handler and append the chunks of the body until * the whole body received. Don't use this if your request body is large - you could potentially run out of RAM. * * @param bodyHandler This handler will be called after all the body has been received */ @Fluent default HttpServerRequest bodyHandler(@Nullable Handler<Buffer> bodyHandler) { if (bodyHandler != null) { Buffer body = Buffer.buffer(); handler(body::appendBuffer); endHandler(v -> bodyHandler.handle(body)); } return this; }
@Override public void start() throws Exception { vertx.createHttpServer().requestHandler(req -> { req.pause(); String filename = UUID.randomUUID() + ".uploaded"; vertx.fileSystem().open(filename, new OpenOptions(), ares -> { AsyncFile file = ares.result(); Pump pump = Pump.pump(req, file); req.endHandler(v1 -> file.close(v2 -> { System.out.println("Uploaded to " + filename); req.response().end(); })); pump.start(); req.resume(); }); }).listen(8080); } }
@Override public void start() throws Exception { vertx.createHttpServer().requestHandler(req -> { System.out.println("Got request " + req.uri()); for (String name : req.headers().names()) { System.out.println(name + ": " + req.headers().get(name)); } req.handler(data -> System.out.println("Got data " + data.toString("ISO-8859-1"))); req.endHandler(v -> { // Now send back a response req.response().setChunked(true); for (int i = 0; i < 10; i++) { req.response().write("server-data-chunk-" + i); } req.response().end(); }); }).listen(8282); }
private void testParamDecoding(String value) throws UnsupportedEncodingException { server.requestHandler(req -> { req.setExpectMultipart(true); req.endHandler(v -> { MultiMap formAttributes = req.formAttributes(); assertEquals(value, formAttributes.get("param")); }); req.response().end(); }); String postData = "param=" + URLEncoder.encode(value,"UTF-8"); server.listen(onSuccess(server -> { client.post(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", onSuccess(resp -> testComplete())) .putHeader(HttpHeaders.CONTENT_TYPE, HttpHeaders.APPLICATION_X_WWW_FORM_URLENCODED) .putHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(postData.length())) .write(postData).end(); })); await(); }
@Test public void testClientRequestWriteFromOtherThread() throws Exception { CountDownLatch latch1 = new CountDownLatch(1); CountDownLatch latch2 = new CountDownLatch(1); server.requestHandler(req -> { latch2.countDown(); req.endHandler(v -> { req.response().end(); }); }).listen(onSuccess(v -> { latch1.countDown(); })); awaitLatch(latch1); HttpClientRequest req = client.get(8080, "localhost", "/somepath", onSuccess(resp -> { assertEquals(200, resp.statusCode()); testComplete(); })).setChunked(true).sendHead(); awaitLatch(latch2); // The next write won't be buffered req.write("hello ").end("world"); await(); }
}); }); request.endHandler(v -> { byte[] expectedData = buffer.getBytes(); byte[] actualData = readBuffer.getBytes();
req.resume(); }); req.endHandler(v -> { assertEquals(expected, body); req.response().end();
private void testPost(String expected) throws Exception { Buffer content = Buffer.buffer(); AtomicInteger count = new AtomicInteger(); server.requestHandler(req -> { assertEquals(HttpMethod.POST, req.method()); req.handler(buff -> { content.appendBuffer(buff); count.getAndIncrement(); }); req.endHandler(v -> { assertTrue(count.get() > 0); req.response().end(); }); }); startServer(); client.post(DEFAULT_HTTPS_PORT, DEFAULT_HTTPS_HOST, "/somepath", onSuccess(resp -> { resp.endHandler(v -> { assertEquals(expected, content.toString()); testComplete(); }); })).exceptionHandler(err -> { fail(); }).end(expected); await(); }
server.requestHandler(req -> { assertFalse(req.isEnded()); req.endHandler(v -> { assertTrue(req.isEnded()); try { req.endHandler(v2 -> {}); fail("Shouldn't be able to set end handler"); } catch (IllegalStateException e) {
@Test public void testPausedHttpServerRequestDuringLastChunkEndsTheRequest() throws Exception { server.requestHandler(req -> { req.handler(buff -> { assertEquals("small", buff.toString()); req.pause(); }); req.endHandler(v -> { req.response().end(); }); }); startServer(); client.close(); client = vertx.createHttpClient(createBaseClientOptions().setMaxPoolSize(1)); client.put(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/someuri", resp -> { complete(); }).end("small"); await(); }
req.resume(); }); req.endHandler(v -> { req.response().end(); });
@Test public void testPausedHttpServerRequestUnpauseTheConnectionAtRequestEnd() throws Exception { int numRequests = 20; waitFor(numRequests); server.requestHandler(req -> { req.handler(buff -> { assertEquals("small", buff.toString()); req.pause(); }); req.endHandler(v -> { req.response().end(); }); }); startServer(); client.close(); client = vertx.createHttpClient(createBaseClientOptions().setMaxPoolSize(1)); for (int i = 0; i < numRequests; i++) { client.put(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/someuri", resp -> { complete(); }).end("small"); } }
req.resume(); }); req.endHandler(v -> { req.response().end(); });
Buffer buf = Buffer.buffer(); req.handler(buf::appendBuffer); req.endHandler(v -> { assertEquals("hello", buf.toString()); req.response().end("bye");
fail("Should not get here"); })); req.endHandler(v -> { MultiMap attrs = req.formAttributes(); attributeCount.set(attrs.size());
fail("Should get here"); })); req.endHandler(v -> { MultiMap attrs = req.formAttributes(); attributeCount.set(attrs.size());
@Test public void testBeginPipelinedRequestByResponseSentOnRequestCompletion() throws Exception { server.requestHandler(req -> { if (req.method() == HttpMethod.POST) { req.pause(); vertx.setTimer(100, id -> { req.resume(); }); } req.endHandler(v -> { req.response().end(); }); }); startServer(); client.close(); client = vertx.createHttpClient(new HttpClientOptions().setPipelining(true).setMaxPoolSize(1).setKeepAlive(true)); client.post(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", resp -> { }).end(TestUtils.randomAlphaString(1024)); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/", resp -> { testComplete(); }); await(); }
assertTrue(req.isEnded()); try { req.endHandler(v2 -> { }); fail("Shouldn't be able to set end handler");
@Test public void testEndServerResponseResumeTheConnection() throws Exception { server.requestHandler(req -> { req.endHandler(v -> { req.pause(); req.response().end(); }); }); startServer(); client.close(); waitFor(2); client = vertx.createHttpClient(new HttpClientOptions().setKeepAlive(true).setMaxPoolSize(1)); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })); await(); }
@Test public void testEndServerRequestResumeTheConnection() throws Exception { server.requestHandler(req -> { req.response().end(); req.endHandler(v -> { req.pause(); }); }); startServer(); client.close(); waitFor(2); client = vertx.createHttpClient(new HttpClientOptions().setKeepAlive(true).setMaxPoolSize(1)); client.put(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })).end("1"); client.put(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> { assertEquals(200, resp.statusCode()); complete(); })).end("2"); await(); }