protected void testCloseHandlerNotCalledWhenConnectionClosedAfterEnd(int expected) throws Exception { AtomicInteger closeCount = new AtomicInteger(); AtomicInteger endCount = new AtomicInteger(); server.requestHandler(req -> { req.response().closeHandler(v -> { closeCount.incrementAndGet(); }); req.response().endHandler(v -> { endCount.incrementAndGet(); }); req.connection().closeHandler(v -> { assertEquals(expected, closeCount.get()); assertEquals(1, endCount.get()); testComplete(); }); req.response().end("some-data"); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", onSuccess(resp -> { resp.endHandler(v -> { resp.request().connection().close(); }); })); await(); }
@Test public void testResetPushPromiseNoHandler() throws Exception { server.requestHandler(req -> { req.response().push(HttpMethod.GET, "/wibble", ar -> { assertTrue(ar.succeeded()); HttpServerResponse resp = ar.result(); resp.setChunked(true).write("content"); AtomicLong reset = new AtomicLong(); resp.exceptionHandler(err -> { if (err instanceof StreamResetException) { reset.set(((StreamResetException)err).getCode()); } }); resp.closeHandler(v -> { assertEquals(Http2Error.CANCEL.code(), reset.get()); testComplete(); }); }); }); startServer(); HttpClientRequest req = client.get(DEFAULT_HTTPS_PORT, DEFAULT_HTTPS_HOST, "/somepath", resp -> { }); req.end(); await(); }
req.response().closeHandler(v -> { assertEquals(10L, reset.get()); testComplete();
@Test public void testServerConnectionClosed() throws Exception { server.close(); server = vertx.createHttpServer(createBaseServerOptions().setIdleTimeout(2)); server.requestHandler(req -> { FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server); HttpServerMetric metric = metrics.getMetric(req); assertNotNull(metric); assertFalse(metric.failed.get()); req.response().closeHandler(v -> { assertNull(metrics.getMetric(req)); assertTrue(metric.failed.get()); testComplete(); }); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> {}); await(); } }
@Test public void testClientResetServerStreamDuringResponse() throws Exception { server.requestHandler(req -> { req.exceptionHandler(err -> { assertEquals(err.getClass(), StreamResetException.class); }); AtomicLong reset = new AtomicLong(); req.response().exceptionHandler(err -> { if (err instanceof StreamResetException) { reset.set(((StreamResetException) err).getCode()); } }); req.response().closeHandler(v -> { assertEquals(10L, reset.get()); testComplete(); }); req.response().setChunked(true).write(Buffer.buffer("some-data")); }); startServer(); client.get(DEFAULT_HTTPS_PORT, DEFAULT_HTTPS_HOST, "/somepath", onSuccess(resp -> { resp.exceptionHandler(this::fail); resp.request().reset(10); assertIllegalStateException(() -> resp.request().write(Buffer.buffer())); assertIllegalStateException(resp.request()::end); })).end(Buffer.buffer("hello")); await(); }
@Test public void testCloseHandlerWhenConnectionEnds() throws Exception { server.requestHandler(req -> { req.response().closeHandler(v -> { testComplete(); }); req.response().setChunked(true).write("some-data"); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", onSuccess(resp -> { resp.handler(v -> { resp.request().connection().close(); }); })); await(); }
@Test public void testCloseHandlerWhenConnectionClose() throws Exception { server.requestHandler(req -> { HttpServerResponse resp = req.response(); resp.setChunked(true).write("some-data"); resp.closeHandler(v -> { checkHttpServerResponse(resp); testComplete(); }); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", onSuccess(resp -> { resp.handler(v -> { resp.request().connection().close(); }); })); await(); }
@Test public void testHttpServerRequestShouldExceptionHandlerWhenTheClosedHandlerIsCalled() { server = vertx.createHttpServer(new HttpServerOptions().setPort(DEFAULT_HTTP_PORT)).requestHandler(req -> { HttpServerResponse resp = req.response(); resp.setChunked(true); CheckingSender sender = new CheckingSender(vertx.getOrCreateContext(), resp); sender.send(); resp.closeHandler(v -> { Throwable failure = sender.close(); if (failure != null) { fail(failure); } else { testComplete(); } }); }); server.listen(onSuccess(s -> { client.getNow(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/someuri", onSuccess(resp -> { vertx.setTimer(1000, id -> { resp.request().connection().close(); }); })); })); await(); }
complete(); }); resp.closeHandler(v -> { assertFalse(Thread.holdsLock(conn)); complete();
public VertxHttpResponse(final HttpServerResponse response, final ResteasyProviderFactory providerFactory, final HttpMethod method) { outputHeaders = new MultivaluedMapImpl<String, Object>(); this.method = method; os = (method == null || !method.equals(HttpMethod.HEAD)) ? new ChunkOutputStream(this, 1000) : null; this.response = response; this.providerFactory = providerFactory; response.exceptionHandler(t -> vertxException = t); response.closeHandler(v -> vertxException = new IOException("Connection closed")); }
protected void addCloseHandler(HttpServerResponse resp, final SockJSSession session) { resp.closeHandler(v -> { if (log.isTraceEnabled()) log.trace("Connection closed (from client?), closing session"); // Connection has been closed from the client or network error so // we remove the session session.shutdown(); closed = true; }); }
protected void testCloseHandlerNotCalledWhenConnectionClosedAfterEnd(int expected) throws Exception { AtomicInteger closeCount = new AtomicInteger(); AtomicInteger endCount = new AtomicInteger(); server.requestHandler(req -> { req.response().closeHandler(v -> { closeCount.incrementAndGet(); }); req.response().endHandler(v -> { endCount.incrementAndGet(); }); req.connection().closeHandler(v -> { assertEquals(expected, closeCount.get()); assertEquals(1, endCount.get()); testComplete(); }); req.response().end("some-data"); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> { resp.endHandler(v -> { resp.request().connection().close(); }); }); await(); }
@Test public void testResetPushPromiseNoHandler() throws Exception { server.requestHandler(req -> { req.response().push(HttpMethod.GET, "/wibble", ar -> { assertTrue(ar.succeeded()); HttpServerResponse resp = ar.result(); resp.setChunked(true).write("content"); AtomicLong reset = new AtomicLong(); resp.exceptionHandler(err -> { if (err instanceof StreamResetException) { reset.set(((StreamResetException)err).getCode()); } }); resp.closeHandler(v -> { assertEquals(Http2Error.CANCEL.code(), reset.get()); testComplete(); }); }); }); startServer(); HttpClientRequest req = client.get(DEFAULT_HTTPS_PORT, DEFAULT_HTTPS_HOST, "/somepath", resp -> { }); req.end(); await(); }
req.response().closeHandler(v -> { assertEquals(10L, reset.get()); testComplete();
@Test public void testClientResetServerStreamDuringResponse() throws Exception { server.requestHandler(req -> { req.exceptionHandler(err -> { assertEquals(err.getClass(), StreamResetException.class); }); AtomicLong reset = new AtomicLong(); req.response().exceptionHandler(err -> { if (err instanceof StreamResetException) { reset.set(((StreamResetException) err).getCode()); } }); req.response().closeHandler(v -> { assertEquals(10L, reset.get()); testComplete(); }); req.response().setChunked(true).write(Buffer.buffer("some-data")); }); startServer(); HttpClientRequest req = client.get(DEFAULT_HTTPS_PORT, DEFAULT_HTTPS_HOST, "/somepath"); req.handler(resp -> { resp.exceptionHandler(this::fail); req.reset(10); assertIllegalStateException(() -> req.write(Buffer.buffer())); assertIllegalStateException(req::end); }).end(Buffer.buffer("hello")); await(); }
@Test public void testServerConnectionClosed() throws Exception { server.close(); server = vertx.createHttpServer(createBaseServerOptions().setIdleTimeout(2)); server.requestHandler(req -> { FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server); HttpServerMetric metric = metrics.getMetric(req); assertNotNull(metric); assertFalse(metric.failed.get()); req.response().closeHandler(v -> { assertNull(metrics.getMetric(req)); assertTrue(metric.failed.get()); testComplete(); }); }); startServer(); HttpClientRequest req = client.get(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath"); req.handler(resp -> { }).end(); await(); } }
@Test public void testHttpServerRequestShouldExceptionHandlerWhenTheClosedHandlerIsCalled() { server = vertx.createHttpServer(new HttpServerOptions().setPort(DEFAULT_HTTP_PORT)).requestHandler(req -> { HttpServerResponse resp = req.response(); resp.setChunked(true); CheckingSender sender = new CheckingSender(vertx.getOrCreateContext(), resp); sender.send(); resp.closeHandler(v -> { Throwable failure = sender.close(); if (failure != null) { fail(failure); } else { testComplete(); } }); }); server.listen(onSuccess(s -> { client.getNow(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/someuri", resp -> { vertx.setTimer(1000, id -> { resp.request().connection().close(); }); }); })); await(); }
@Test public void testCloseHandlerWhenConnectionEnds() throws Exception { server.requestHandler(req -> { req.response().closeHandler(v -> { testComplete(); }); req.response().setChunked(true).write("some-data"); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> { resp.handler(v -> { resp.request().connection().close(); }); }); await(); }
@Test public void testCloseHandlerWhenConnectionClose() throws Exception { server.requestHandler(req -> { HttpServerResponse resp = req.response(); resp.setChunked(true).write("some-data"); resp.closeHandler(v -> { checkHttpServerResponse(resp); testComplete(); }); }); startServer(); client.getNow(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, "/somepath", resp -> { resp.handler(v -> { resp.request().connection().close(); }); }); await(); }
complete(); }); resp.closeHandler(v -> { assertFalse(Thread.holdsLock(conn)); complete();