diff --git a/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java b/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java index c63a7fec396..3f7a3141cad 100644 --- a/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java +++ b/src/main/java/io/vertx/core/http/impl/Http1xClientConnection.java @@ -719,6 +719,7 @@ void handleException(Throwable cause) { void handleClosed(Throwable err) { if (err != null) { handleException(err); + promise.tryFail(err); } if (!closed) { closed = true; diff --git a/src/test/java/io/vertx/core/http/Http1xTest.java b/src/test/java/io/vertx/core/http/Http1xTest.java index f79f25fb985..94eefd7e37f 100644 --- a/src/test/java/io/vertx/core/http/Http1xTest.java +++ b/src/test/java/io/vertx/core/http/Http1xTest.java @@ -5438,4 +5438,39 @@ public void testRecycleConnectionOnRequestEnd() throws Exception { } await(); } + + @Test + public void testFailPendingRequestAllocationWhenConnectionIsClosed() throws Exception { + waitFor(2); + server.requestHandler(request -> { + HttpServerResponse resp = request.response(); + resp.end().onComplete(onSuccess(v -> { + request.connection().close(); + })); + }); + startServer(testAddress); + client.close(); + client = vertx.createHttpClient(new HttpClientOptions().setPipelining(true), new PoolOptions().setHttp1MaxSize(1)); + for (int i = 0;i < 2;i++) { + int val = i; + Future fut = client.request(requestOptions); + fut.onComplete(ar -> { + switch (val) { + case 0: + assertTrue(ar.succeeded()); + HttpClientRequest req = ar.result(); + req.sendHead(); + req.response().onComplete(onSuccess(resp -> { + complete(); + })); + break; + case 1: + assertTrue(ar.failed()); + complete(); + break; + } + }); + } + await(); + } }