Skip to content

Commit c5943bd

Browse files
authoredDec 3, 2022
[java] Add close method to JDK 11 client. Ensure close methods for Http client is called. (#11345)
* [java] Add close method to JDK 11 client. Ensure close methods for Http client is called. * [java] Close the underlying websocket for JDK 11 Http Client
1 parent 630fc47 commit c5943bd

File tree

6 files changed

+34
-8
lines changed

6 files changed

+34
-8
lines changed
 

‎java/src/org/openqa/selenium/bidi/Connection.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ public class Connection implements Closeable {
7171
private final Map<Long, Consumer<Either<Throwable, JsonInput>>> methodCallbacks = new ConcurrentHashMap<>();
7272
private final ReadWriteLock callbacksLock = new ReentrantReadWriteLock(true);
7373
private final Multimap<Event<?>, Consumer<?>> eventCallbacks = HashMultimap.create();
74+
private final HttpClient client;
7475

7576
public Connection(HttpClient client, String url) {
7677
Require.nonNull("HTTP client", client);
7778
Require.nonNull("URL to connect to", url);
7879

79-
socket = client.openSocket(new HttpRequest(GET, url), new Listener());
80+
this.client = client;
81+
socket = this.client.openSocket(new HttpRequest(GET, url), new Listener());
8082
}
8183

8284
private static class NamedConsumer<X> implements Consumer<X> {
@@ -207,6 +209,7 @@ public void clearListeners() {
207209
@Override
208210
public void close() {
209211
socket.close();
212+
client.close();
210213
}
211214

212215
private class Listener implements WebSocket.Listener {

‎java/src/org/openqa/selenium/devtools/CdpEndpointFinder.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,9 @@ public static Optional<URI> getCdpEndPoint(HttpClient.Factory clientFactory, URI
4747
Require.nonNull("DevTools URI", reportedUri);
4848

4949
ClientConfig config = ClientConfig.defaultConfig().baseUri(reportedUri);
50-
HttpClient client = clientFactory.createClient(config);
5150

5251
HttpResponse res;
53-
try {
52+
try (HttpClient client = clientFactory.createClient(config)) {
5453
res = client.execute(new HttpRequest(GET, "/json/version"));
5554
} catch (UncheckedIOException e) {
5655
LOG.warning("Unable to connect to determine websocket url: " + e.getMessage());

‎java/src/org/openqa/selenium/devtools/Connection.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,13 @@ public class Connection implements Closeable {
6969
private final Map<Long, Consumer<Either<Throwable, JsonInput>>> methodCallbacks = new ConcurrentHashMap<>();
7070
private final ReadWriteLock callbacksLock = new ReentrantReadWriteLock(true);
7171
private final Multimap<Event<?>, Consumer<?>> eventCallbacks = HashMultimap.create();
72+
private final HttpClient client;
7273

7374
public Connection(HttpClient client, String url) {
7475
Require.nonNull("HTTP client", client);
7576
Require.nonNull("URL to connect to", url);
76-
77-
socket = client.openSocket(new HttpRequest(GET, url), new Listener());
77+
this.client = client;
78+
socket = this.client.openSocket(new HttpRequest(GET, url), new Listener());
7879
}
7980

8081
private static class NamedConsumer<X> implements Consumer<X> {
@@ -188,6 +189,7 @@ public void clearListeners() {
188189
@Override
189190
public void close() {
190191
socket.close();
192+
client.close();
191193
}
192194

193195
private class Listener implements WebSocket.Listener {

‎java/src/org/openqa/selenium/devtools/DevTools.java

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public Domains getDomains() {
5858
@Override
5959
public void close() {
6060
disconnectSession();
61+
connection.close();
6162
}
6263

6364
public void disconnectSession() {

‎java/src/org/openqa/selenium/remote/RemoteWebDriver.java

+4
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,10 @@ public void quit() {
440440
}
441441

442442
try {
443+
if (this instanceof HasDevTools) {
444+
((HasDevTools) this).maybeGetDevTools().ifPresent(DevTools::close);
445+
}
446+
443447
execute(DriverCommand.QUIT);
444448
} finally {
445449
sessionId = null;

‎java/src/org/openqa/selenium/remote/http/jdk/JdkHttpClient.java

+20-3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import java.util.concurrent.CompletableFuture;
5656
import java.util.concurrent.CompletionStage;
5757
import java.util.concurrent.ExecutionException;
58+
import java.util.concurrent.ExecutorService;
59+
import java.util.concurrent.Executors;
5860
import java.util.concurrent.TimeUnit;
5961
import java.util.function.Supplier;
6062
import java.util.logging.Level;
@@ -65,7 +67,9 @@
6567
public class JdkHttpClient implements HttpClient {
6668
public static final Logger LOG = Logger.getLogger(JdkHttpClient.class.getName());
6769
private final JdkHttpMessages messages;
68-
private final java.net.http.HttpClient client;
70+
private java.net.http.HttpClient client;
71+
private WebSocket websocket;
72+
private final ExecutorService executorService;
6973
private final Duration readTimeout;
7074

7175
JdkHttpClient(ClientConfig config) {
@@ -74,9 +78,12 @@ public class JdkHttpClient implements HttpClient {
7478
this.messages = new JdkHttpMessages(config);
7579
this.readTimeout = config.readTimeout();
7680

81+
executorService = Executors.newCachedThreadPool();
82+
7783
java.net.http.HttpClient.Builder builder = java.net.http.HttpClient.newBuilder()
7884
.connectTimeout(config.connectionTimeout())
79-
.followRedirects(ALWAYS);
85+
.followRedirects(ALWAYS)
86+
.executor(executorService);
8087

8188
Credentials credentials = config.credentials();
8289
String info = config.baseUri().getUserInfo();
@@ -196,7 +203,7 @@ public void onError(java.net.http.WebSocket webSocket, Throwable error) {
196203

197204
java.net.http.WebSocket underlyingSocket = webSocketCompletableFuture.join();
198205

199-
return new WebSocket() {
206+
this.websocket = new WebSocket() {
200207
@Override
201208
public WebSocket send(Message message) {
202209
Supplier<CompletableFuture<java.net.http.WebSocket>> makeCall;
@@ -252,6 +259,7 @@ public void close() {
252259
}
253260
}
254261
};
262+
return this.websocket;
255263
}
256264

257265
private URI getWebSocketUri(HttpRequest request) {
@@ -295,6 +303,15 @@ public HttpResponse execute(HttpRequest req) throws UncheckedIOException {
295303

296304
}
297305

306+
@Override
307+
public void close() {
308+
executorService.shutdownNow();
309+
if (this.websocket != null) {
310+
this.websocket.close();
311+
}
312+
this.client = null;
313+
}
314+
298315
@AutoService(HttpClient.Factory.class)
299316
@HttpClientName("jdk-http-client")
300317
public static class Factory implements HttpClient.Factory {

0 commit comments

Comments
 (0)
Please sign in to comment.