Skip to content

Commit 3405b0b

Browse files
committed
[Grid] A new createClient method instead of duplicating the Factory.
This allows us to set timeouts per connection. Still room for improvement.
1 parent 3f20f9f commit 3405b0b

File tree

10 files changed

+65
-43
lines changed

10 files changed

+65
-43
lines changed

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,6 @@ static Factory createDefault() {
6161
}
6262
}
6363

64-
static Factory createConfigured(int connectionTimeout, int readTimeout) {
65-
String defaultFactory = System.getProperty("webdriver.http.factory", "okhttp");
66-
switch (defaultFactory) {
67-
case "apache":
68-
return new ApacheHttpClient.Factory(connectionTimeout, readTimeout);
69-
70-
case "okhttp":
71-
default:
72-
return new OkHttpClient.Factory(Duration.ofSeconds(connectionTimeout),
73-
Duration.ofSeconds(readTimeout));
74-
}
75-
}
76-
7764
/**
7865
* Creates a HTTP client that will send requests to the given URL.
7966
*
@@ -82,6 +69,16 @@ static Factory createConfigured(int connectionTimeout, int readTimeout) {
8269
*/
8370
HttpClient createClient(URL url);
8471

72+
/**
73+
* Creates a HTTP client that will send requests to the given URL.
74+
*
75+
* @param url URL
76+
* @param connectionTimeout int
77+
* @param readTimeout int
78+
* @return HttpClient
79+
*/
80+
HttpClient createClient(URL url, Duration connectionTimeout, Duration readTimeout);
81+
8582
/**
8683
* Closes idle clients.
8784
*/

java/client/src/org/openqa/selenium/remote/internal/ApacheHttpClient.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import java.net.URI;
4646
import java.net.URISyntaxException;
4747
import java.net.URL;
48+
import java.time.Duration;
4849
import java.util.AbstractMap;
4950
import java.util.LinkedHashMap;
5051
import java.util.Map;
@@ -264,26 +265,28 @@ public Factory(HttpClientFactory clientFactory) {
264265
this.clientFactory = checkNotNull(clientFactory, "null HttpClientFactory");
265266
}
266267

267-
public Factory(int connectionTimeout, int socketTimeout) {
268-
int connectionTimeoutToMillis = (int) SECONDS.toMillis(connectionTimeout);
269-
int socketTimeoutToMillis = (int) SECONDS.toMillis(socketTimeout);
270-
this.clientFactory = new HttpClientFactory(connectionTimeoutToMillis, socketTimeoutToMillis);
268+
@Override
269+
public org.openqa.selenium.remote.http.HttpClient createClient(URL url) {
270+
return createClient(url, Duration.ofMinutes(2), Duration.ofHours(3));
271271
}
272272

273273
@Override
274-
public org.openqa.selenium.remote.http.HttpClient createClient(URL url) {
274+
public org.openqa.selenium.remote.http.HttpClient createClient(URL url,
275+
Duration connectionTimeout,
276+
Duration readTimeout) {
275277
checkNotNull(url, "null URL");
276278
HttpClient client;
277279
if (url.getUserInfo() != null) {
278280
StringTokenizer tokens = new StringTokenizer(url.getUserInfo(), ":");
279281
UsernamePasswordCredentials credentials =
280282
new UsernamePasswordCredentials(tokens.nextToken(), tokens.nextToken());
281-
client = clientFactory.createHttpClient(credentials);
283+
client = clientFactory.createHttpClient(credentials, (int) connectionTimeout.toMillis(),
284+
(int) readTimeout.toMillis());
282285
} else {
283-
client = clientFactory.getHttpClient();
286+
client = clientFactory.createHttpClient(null, (int) connectionTimeout.toMillis(),
287+
(int) readTimeout.toMillis());
284288
}
285-
return new ApacheHttpClient(client, url);
286-
}
289+
return new ApacheHttpClient(client, url); }
287290

288291
@Override
289292
public void cleanupIdleClients() {

java/client/src/org/openqa/selenium/remote/internal/OkHttpClient.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ public HttpResponse execute(HttpRequest request) throws IOException {
116116
public static class Factory implements HttpClient.Factory {
117117

118118
private final ConnectionPool pool = new ConnectionPool();
119-
private final long connectionTimeout;
120-
private final long readTimeout;
119+
private final Duration connectionTimeout;
120+
private final Duration readTimeout;
121121

122122
public Factory() {
123123
this(Duration.ofMinutes(2), Duration.ofHours(3));
@@ -127,18 +127,23 @@ public Factory(Duration connectionTimeout, Duration readTimeout) {
127127
Objects.requireNonNull(connectionTimeout, "Connection timeout cannot be null");
128128
Objects.requireNonNull(readTimeout, "Read timeout cannot be null");
129129

130-
this.connectionTimeout = connectionTimeout.toMillis();
131-
this.readTimeout = readTimeout.toMillis();
130+
this.connectionTimeout = connectionTimeout;
131+
this.readTimeout = readTimeout;
132132
}
133133

134134
@Override
135135
public HttpClient createClient(URL url) {
136+
return createClient(url, this.connectionTimeout, this.readTimeout);
137+
}
138+
139+
@Override
140+
public HttpClient createClient(URL url, Duration connectionTimeout, Duration readTimeout) {
136141
okhttp3.OkHttpClient.Builder client = new okhttp3.OkHttpClient.Builder()
137142
.connectionPool(pool)
138143
.followRedirects(true)
139144
.followSslRedirects(true)
140-
.readTimeout(readTimeout, MILLISECONDS)
141-
.connectTimeout(connectionTimeout, MILLISECONDS);
145+
.readTimeout(readTimeout.toMillis(), MILLISECONDS)
146+
.connectTimeout(connectionTimeout.toMillis(), MILLISECONDS);
142147

143148
String info = url.getUserInfo();
144149
if (!Strings.isNullOrEmpty(info)) {

java/server/src/org/openqa/grid/internal/BaseGridRegistry.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,18 @@
2121
import org.openqa.selenium.remote.http.HttpClient;
2222

2323
import java.net.URL;
24+
import java.time.Duration;
2425

2526
public abstract class BaseGridRegistry implements GridRegistry {
26-
protected HttpClient.Factory httpClientFactory;
27+
protected final HttpClient.Factory httpClientFactory;
2728

2829
// The following needs to be volatile because we expose a public setters
2930
protected volatile Hub hub;
3031

3132
public BaseGridRegistry(Hub hub) {
33+
this.httpClientFactory = HttpClient.Factory.createDefault();
3234
this.hub = hub;
3335
}
34-
3536
/**
3637
* @see GridRegistry#getHub()
3738
*/
@@ -52,17 +53,12 @@ public void setHub(Hub hub) {
5253
*/
5354
@Override
5455
public HttpClient getHttpClient(URL url) {
55-
if (httpClientFactory == null) {
56-
httpClientFactory = HttpClient.Factory.createDefault();
57-
}
5856
return httpClientFactory.createClient(url);
5957
}
6058

6159
@Override
6260
public HttpClient getHttpClient(URL url, int connectionTimeout, int readTimeout) {
63-
if (httpClientFactory == null) {
64-
httpClientFactory = HttpClient.Factory.createConfigured(connectionTimeout, readTimeout);
65-
}
66-
return httpClientFactory.createClient(url);
61+
return httpClientFactory.createClient(url, Duration.ofSeconds(connectionTimeout),
62+
Duration.ofSeconds(readTimeout));
6763
}
6864
}

java/server/src/org/openqa/grid/internal/BaseRemoteProxy.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,15 +428,24 @@ public int getTimeOut() {
428428
return config.timeout * 1000;
429429
}
430430

431+
/**
432+
* @return the {@link HttpClient.Factory} to use.
433+
* @deprecated use {@link BaseRemoteProxy#getHttpClient(URL, int, int)}
434+
*/
431435
public HttpClient getHttpClient(URL url) {
432-
return getRegistry().getHttpClient(url, config.browserTimeout, config.browserTimeout);
436+
return getRegistry().getHttpClient(url);
437+
}
438+
439+
public HttpClient getHttpClient(URL url, int connectionTimeout, int readTimeout) {
440+
return getRegistry().getHttpClient(url, connectionTimeout, readTimeout);
433441
}
434442

435443
public Map<String, Object> getProxyStatus() {
436444
String url = getRemoteHost().toExternalForm() + "/wd/hub/status";
437445

438446
HttpRequest r = new HttpRequest(GET, url);
439-
HttpClient client = getHttpClient(getRemoteHost());
447+
HttpClient client = getHttpClient(getRemoteHost(), config.nodeStatusCheckTimeout,
448+
config.nodeStatusCheckTimeout);
440449
HttpResponse response;
441450
String existingName = Thread.currentThread().getName();
442451
try {

java/server/src/org/openqa/grid/internal/RemoteProxy.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,19 @@ default TestSlot createTestSlot(SeleniumProtocol protocol, Map<String, Object> c
158158

159159
/**
160160
* @return an {@link HttpClient} for a particular {@link URL}.
161+
* @deprecated use {@link RemoteProxy#getHttpClient(URL, int, int)}
161162
*/
162163
HttpClient getHttpClient(URL url);
163164

165+
/**
166+
*
167+
* @param url URL
168+
* @param connectionTimeout int
169+
* @param readTimeout int
170+
* @return an {@link HttpClient} for a particular {@link URL}.
171+
*/
172+
HttpClient getHttpClient(URL url, int connectionTimeout, int readTimeout);
173+
164174
/**
165175
* Renders the status of the node as JSON. Useful for APIs.
166176
*

java/server/src/org/openqa/grid/internal/TestSession.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ public String toString() {
201201

202202

203203
private HttpClient getClient(URL url) {
204-
return slot.getProxy().getHttpClient(url);
204+
Integer browserTimeout = slot.getProxy().getConfig().browserTimeout;
205+
return slot.getProxy().getHttpClient(url, browserTimeout, browserTimeout);
205206
}
206207

207208
/*

java/server/src/org/openqa/grid/web/servlet/NodeSessionsServlet.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ private Map<String, Object> extractSessionInfo(RemoteProxy proxy) {
102102
try {
103103
URL url = proxy.getRemoteHost();
104104
HttpRequest req = new HttpRequest(HttpMethod.GET, "/wd/hub/sessions");
105-
HttpResponse rsp = proxy.getHttpClient(url).execute(req);
105+
Integer nodeStatusCheckTimeout = proxy.getConfig().nodeStatusCheckTimeout;
106+
HttpResponse rsp = proxy.getHttpClient(url, nodeStatusCheckTimeout, nodeStatusCheckTimeout)
107+
.execute(req);
106108

107109
try (InputStream in = new ByteArrayInputStream(rsp.getContent());
108110
Reader reader = new InputStreamReader(in, rsp.getContentEncoding());

java/server/test/org/openqa/grid/e2e/node/BrowserTimeOutTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import org.junit.After;
2121
import org.junit.Before;
22-
import org.junit.Ignore;
2322
import org.junit.Test;
2423
import org.openqa.grid.common.GridRole;
2524
import org.openqa.grid.e2e.utils.GridTestHelper;

java/server/test/org/openqa/grid/internal/listener/CommandListenerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public URL getRemoteHost() {
8787
}
8888

8989
@Override
90-
public HttpClient getHttpClient(URL url) {
90+
public HttpClient getHttpClient(URL url, int connectionTimeout, int readTimeout) {
9191
// Create mocks for network traffic
9292
HttpClient client = mock(HttpClient.class);
9393
HttpResponse response = mock(HttpResponse.class);

0 commit comments

Comments
 (0)