8258582: HttpClient: the HttpClient doesn't explicitly shutdown its default executor when stopping.

Reviewed-by: chegar, michaelm
This commit is contained in:
Daniel Fuchs 2020-12-17 22:33:38 +00:00
parent f15528eb64
commit 3f77a6002e
2 changed files with 16 additions and 0 deletions

View file

@ -19,6 +19,7 @@ grant codeBase "jrt:/java.net.http" {
permission java.lang.RuntimePermission "accessClassInPackage.sun.net.util"; permission java.lang.RuntimePermission "accessClassInPackage.sun.net.util";
permission java.lang.RuntimePermission "accessClassInPackage.sun.net.www"; permission java.lang.RuntimePermission "accessClassInPackage.sun.net.www";
permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc"; permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
permission java.lang.RuntimePermission "modifyThread";
permission java.net.SocketPermission "*","connect,resolve"; permission java.net.SocketPermission "*","connect,resolve";
permission java.net.URLPermission "http:*","*:*"; permission java.net.URLPermission "http:*","*:*";
permission java.net.URLPermission "https:*","*:*"; permission java.net.URLPermission "https:*","*:*";

View file

@ -66,6 +66,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionException;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -155,6 +156,18 @@ final class HttpClientImpl extends HttpClient implements Trackable {
command.run(); command.run();
} }
} }
private void shutdown() {
if (delegate instanceof ExecutorService service) {
PrivilegedAction<?> action = () -> {
service.shutdown();
return null;
};
AccessController.doPrivileged(action, null,
new RuntimePermission("modifyThread"));
}
}
} }
private final CookieHandler cookieHandler; private final CookieHandler cookieHandler;
@ -331,6 +344,8 @@ final class HttpClientImpl extends HttpClient implements Trackable {
connections.stop(); connections.stop();
// Clears HTTP/2 cache and close its connections. // Clears HTTP/2 cache and close its connections.
client2.stop(); client2.stop();
// shutdown the executor if needed
if (isDefaultExecutor) delegatingExecutor.shutdown();
} }
private static SSLParameters getDefaultParams(SSLContext ctx) { private static SSLParameters getDefaultParams(SSLContext ctx) {