Skip to content

Commit 630f25f

Browse files
committed
Ensure the remote webdriver builder closes the httpclient
1 parent d5b1c78 commit 630f25f

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

java/client/src/org/openqa/selenium/remote/RemoteWebDriverBuilder.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828
import org.openqa.selenium.internal.Either;
2929
import org.openqa.selenium.internal.Require;
3030
import org.openqa.selenium.remote.http.ClientConfig;
31+
import org.openqa.selenium.remote.http.Filter;
3132
import org.openqa.selenium.remote.http.HttpClient;
3233
import org.openqa.selenium.remote.http.HttpHandler;
3334
import org.openqa.selenium.remote.http.HttpRequest;
3435
import org.openqa.selenium.remote.http.HttpResponse;
3536
import org.openqa.selenium.remote.service.DriverService;
3637

3738
import java.io.ByteArrayInputStream;
39+
import java.io.Closeable;
3840
import java.io.IOException;
3941
import java.io.UncheckedIOException;
4042
import java.net.URI;
@@ -55,8 +57,10 @@
5557
import java.util.stream.StreamSupport;
5658

5759
import static java.nio.charset.StandardCharsets.UTF_8;
60+
import static java.util.logging.Level.WARNING;
5861
import static org.openqa.selenium.internal.Debug.getDebugLogLevel;
5962
import static org.openqa.selenium.remote.DriverCommand.QUIT;
63+
import static org.openqa.selenium.remote.http.HttpMethod.DELETE;
6064

6165
/**
6266
* Create a new Selenium session using the W3C WebDriver protocol. This class will not generate any
@@ -325,8 +329,11 @@ private WebDriver getRemoteDriver() {
325329
driverClientConfig = driverClientConfig.baseUri(baseUri);
326330
}
327331

328-
HttpHandler handler = Require.nonNull("Http handler", handlerFactory.apply(driverClientConfig))
329-
.with(new AddWebDriverSpecHeaders().andThen(new ErrorFilter()));
332+
HttpHandler client = handlerFactory.apply(driverClientConfig);
333+
HttpHandler handler = Require.nonNull("Http handler", client)
334+
.with(new CloseHttpClientFilter(client)
335+
.andThen(new AddWebDriverSpecHeaders())
336+
.andThen(new ErrorFilter()));
330337

331338
byte[] payload = getPayloadUtf8Bytes();
332339
Either<ProtocolHandshake.Result, String> result = new ProtocolHandshake().createSession(
@@ -442,4 +449,34 @@ private byte[] getPayloadUtf8Bytes() {
442449
throw new SessionNotCreatedException("Unable to create session roughPayload", e);
443450
}
444451
}
452+
453+
private static class CloseHttpClientFilter implements Filter {
454+
455+
private final HttpHandler client;
456+
457+
CloseHttpClientFilter(HttpHandler client) {
458+
this.client = Require.nonNull("Http client", client);
459+
}
460+
461+
@Override
462+
public HttpHandler apply(HttpHandler next) {
463+
return req -> {
464+
try {
465+
return next.execute(req);
466+
} finally {
467+
if (req.getMethod() == DELETE && client instanceof Closeable) {
468+
HttpSessionId.getSessionId(req.getUri()).ifPresent(id -> {
469+
if (("/session/" + id).equals(req.getUri())) {
470+
try {
471+
((Closeable) client).close();
472+
} catch (IOException e) {
473+
LOG.log(WARNING, "Exception swallowed while closing http client", e);
474+
}
475+
}
476+
});
477+
}
478+
}
479+
};
480+
}
481+
}
445482
}

java/client/src/org/openqa/selenium/remote/http/HttpClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package org.openqa.selenium.remote.http;
1919

20+
import java.io.Closeable;
2021
import java.io.IOException;
2122
import java.net.URL;
2223
import java.util.ServiceLoader;
@@ -31,7 +32,7 @@
3132
/**
3233
* Defines a simple client for making HTTP requests.
3334
*/
34-
public interface HttpClient extends HttpHandler {
35+
public interface HttpClient extends Closeable, HttpHandler {
3536

3637
WebSocket openSocket(HttpRequest request, WebSocket.Listener listener);
3738

0 commit comments

Comments
 (0)