if (first.compareAndSet(true, false)) { closeFuture.thenAccept(v -> { req.response().close(); }); } else {
@Test public void testClientExceptionHandlerCalledWhenServerTerminatesConnection() throws Exception { int numReqs = 10; CountDownLatch latch = new CountDownLatch(numReqs); server.requestHandler(request -> { request.response().close(); }).listen(DEFAULT_HTTP_PORT, onSuccess(s -> { // Exception handler should be called for any requests in the pipeline if connection is closed for (int i = 0; i < numReqs; i++) { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onFailure(err -> { latch.countDown(); })) .exceptionHandler(error -> fail("Exception handler should not be called")) .end(); } })); awaitLatch(latch); }
@Test public void testClientExceptionHandlerCalledWhenServerTerminatesConnectionAfterPartialResponse() throws Exception { server.requestHandler(request -> { //Write partial response then close connection before completing it request.response().setChunked(true).write("foo").close(); }).listen(DEFAULT_HTTP_PORT, onSuccess(s -> { // Exception handler should be called for any requests in the pipeline if connection is closed client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onSuccess(resp -> resp.exceptionHandler(t -> testComplete()))).exceptionHandler(error -> fail()).end(); })); await(); }
HttpServerResponse resp = req.response(); resp.setChunked(true).write(Buffer.buffer("bye")).end(); resp.close(); }); });
HttpServerResponse response = req.response(); response.setStatusCode(200).setChunked(true).write("bye").end(); response.close(); }); server.listen(8080, "localhost", onSuccess(s -> {
resp.setChunked(true).write("whatever"); vertx.runOnContext(v -> { resp.close(); }); } else {
HttpServerResponse response = req.response(); response.setStatusCode(200).end(); response.close(); }); server.listen(listenAR -> {
@Test public void testServerPipeliningConnectionConcurrency() throws Exception { int n = 5; boolean[] processing = {false}; int[] count = {0}; server.requestHandler(req -> { count[0]++; assertFalse(processing[0]); processing[0] = true; vertx.setTimer(20, id -> { processing[0] = false; HttpServerResponse resp = req.response(); resp.end(); if (count[0] == n) { resp.close(); } }); }); startServer(); Buffer requests = Buffer.buffer(); for (int i = 0;i < n;i++) { requests.appendString("GET " + DEFAULT_TEST_URI + " HTTP/1.1\r\n\r\n"); } NetClient client = vertx.createNetClient(); client.connect(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, onSuccess(so -> { so.closeHandler(v -> testComplete()); so.write(requests); })); await(); }
@Test public void testHttpClientRequestShouldExceptionHandlerWhenTheClosedHandlerIsCalled() throws Exception { server = vertx.createHttpServer(new HttpServerOptions().setPort(DEFAULT_HTTP_PORT)).requestHandler(req -> { vertx.setTimer(1000, id -> { req.response().close(); }); }); startServer(); HttpClientRequest req = client.put(DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST, "/someuri", resp -> { }).setChunked(true); CountDownLatch latch = new CountDownLatch(1); req.sendHead(version -> latch.countDown()); awaitLatch(latch); CheckingSender sender = new CheckingSender(vertx.getOrCreateContext(), req); req.exceptionHandler(err -> { Throwable failure = sender.close(); if (failure != null) { fail(failure); } else { testComplete(); } }); sender.send(); await(); }
@Repeat(times = 10) @Test public void testCloseServerConnectionWithPendingMessages() throws Exception { int n = 5; server.requestHandler(req -> { vertx.setTimer(100, id -> { req.response().close(); }); }); startServer(); client.close(); client = vertx.createHttpClient(new HttpClientOptions().setMaxPoolSize(n).setPipelining(true)); AtomicBoolean completed = new AtomicBoolean(); for (int i = 0; i < n * 2; i++) { client.get(DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, onFailure(resp -> { })) .connectionHandler(conn -> { conn.closeHandler(v -> { if (completed.compareAndSet(false, true)) { testComplete(); } }); }).end(); } await(); }
/** * Use restProducerInvocation to send failure message. The throwable is allowed to be null. */ private void sendFailResponseByInvocation(RoutingContext context, AbstractRestInvocation restProducerInvocation, Throwable e) { restProducerInvocation.sendFailResponse(e); context.response().close(); }
public void close() { if (!closed) { try { session.resetListener(); rc.response().end(); rc.response().close(); } catch (IllegalStateException e) { // Underlying connection might already be closed - that's fine } closed = true; } }
public void close() { if (!closed) { try { session.resetListener(); rc.response().end(); rc.response().close(); closed = true; } catch (IllegalStateException e) { // Underlying connection might already be closed - that's fine } } } }
public void close() { if (!closed) { try { session.resetListener(); rc.response().end(); rc.response().close(); closed = true; } catch (IllegalStateException e) { // Underlying connection might already be closed - that's fine } } } }
public void close() { if (log.isTraceEnabled()) log.trace("XHR stream closing listener"); if (!closed) { session.resetListener(); try { rc.response().end(); rc.response().close(); closed = true; } catch (IllegalStateException e) { // Underlying connection might already be closed - that's fine } } } }
public void close() { if (log.isTraceEnabled()) log.trace("XHR poll closing listener"); if (!closed) { try { session.resetListener(); rc.response().end(); rc.response().close(); closed = true; } catch (IllegalStateException e) { // Underlying connection might already be closed - that's fine } } } }
/** * Use routingContext to send failure information in throwable. */ private void sendExceptionByRoutingContext(RoutingContext context, Throwable e) { if (InvocationException.class.isInstance(e)) { InvocationException invocationException = (InvocationException) e; context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(invocationException.getStatusCode()).setStatusMessage(invocationException.getReasonPhrase()) .end(wrapResponseBody(invocationException.getReasonPhrase())); } else { context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(Status.INTERNAL_SERVER_ERROR.getStatusCode()).end(wrapResponseBody(e.getMessage())); } context.response().close(); }
/** * Try to determine response by status code, and send response. */ private void sendFailureRespDeterminedByStatus(RoutingContext context) { Family statusFamily = Family.familyOf(context.statusCode()); if (Family.CLIENT_ERROR.equals(statusFamily) || Family.SERVER_ERROR.equals(statusFamily) || Family.OTHER .equals(statusFamily)) { context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(context.statusCode()).end(); } else { // it seems the status code is not set properly context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(Status.INTERNAL_SERVER_ERROR.getStatusCode()) .setStatusMessage(Status.INTERNAL_SERVER_ERROR.getReasonPhrase()) .end(wrapResponseBody(Status.INTERNAL_SERVER_ERROR.getReasonPhrase())); } context.response().close(); }
@Test public void testClientExceptionHandlerCalledWhenServerTerminatesConnection() throws Exception { int numReqs = 10; CountDownLatch latch = new CountDownLatch(numReqs); server.requestHandler(request -> { request.response().close(); }).listen(DEFAULT_HTTP_PORT, onSuccess(s -> { // Exception handler should be called for any requests in the pipeline if connection is closed for (int i = 0; i < numReqs; i++) { client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> fail("Connect should not be called")). exceptionHandler(error -> latch.countDown()).endHandler(done -> fail()).end(); } })); awaitLatch(latch); }
@Test public void testClientExceptionHandlerCalledWhenServerTerminatesConnectionAfterPartialResponse() throws Exception { server.requestHandler(request -> { //Write partial response then close connection before completing it request.response().setChunked(true).write("foo").close(); }).listen(DEFAULT_HTTP_PORT, onSuccess(s -> { // Exception handler should be called for any requests in the pipeline if connection is closed client.request(HttpMethod.GET, DEFAULT_HTTP_PORT, DEFAULT_HTTP_HOST, DEFAULT_TEST_URI, resp -> resp.exceptionHandler(t -> testComplete())).exceptionHandler(error -> fail()).end(); })); await(); }