--- old/src/java.net.http/share/classes/jdk/internal/net/http/Http2Connection.java 2018-08-07 15:13:32.000000000 +0100 +++ new/src/java.net.http/share/classes/jdk/internal/net/http/Http2Connection.java 2018-08-07 15:13:31.000000000 +0100 @@ -353,7 +353,8 @@ // Requires TLS handshake. So, is really async static CompletableFuture createAsync(HttpRequestImpl request, - Http2ClientImpl h2client) { + Http2ClientImpl h2client, + Exchange exchange) { assert request.secure(); AbstractAsyncSSLConnection connection = (AbstractAsyncSSLConnection) HttpConnection.getConnection(request.getAddress(), @@ -361,7 +362,12 @@ request, HttpClient.Version.HTTP_2); - return connection.connectAsync() + // Expose the underlying connection to the exchange's aborter so it can + // be closed if a timeout occurs. + exchange.connectionAborter.connection(connection); + + return connection.connectAsync(exchange) + .thenCompose(unused -> connection.finishConnect()) .thenCompose(unused -> checkSSLConfig(connection)) .thenCompose(notused-> { CompletableFuture cf = new MinimalFuture<>();