21
21
import static org .openqa .selenium .remote .RemoteTags .SESSION_ID ;
22
22
import static org .openqa .selenium .remote .RemoteTags .SESSION_ID_EVENT ;
23
23
import static org .openqa .selenium .remote .http .Contents .asJson ;
24
+ import static org .openqa .selenium .remote .http .HttpMethod .GET ;
24
25
import static org .openqa .selenium .remote .tracing .Tags .EXCEPTION ;
25
26
import static org .openqa .selenium .remote .tracing .Tags .HTTP_REQUEST ;
26
27
import static org .openqa .selenium .remote .tracing .Tags .HTTP_REQUEST_EVENT ;
27
28
import static org .openqa .selenium .remote .tracing .Tags .HTTP_RESPONSE ;
28
29
29
30
import java .io .Closeable ;
30
31
import java .net .URI ;
32
+ import java .time .Duration ;
31
33
import java .time .Instant ;
32
34
import java .time .temporal .ChronoUnit ;
33
35
import java .util .Iterator ;
43
45
import org .openqa .selenium .NoSuchSessionException ;
44
46
import org .openqa .selenium .concurrent .ExecutorServices ;
45
47
import org .openqa .selenium .concurrent .GuardedRunnable ;
48
+ import org .openqa .selenium .grid .data .NodeStatus ;
46
49
import org .openqa .selenium .grid .sessionmap .SessionMap ;
47
50
import org .openqa .selenium .grid .web .ReverseProxyHandler ;
51
+ import org .openqa .selenium .grid .web .Values ;
48
52
import org .openqa .selenium .internal .Require ;
49
53
import org .openqa .selenium .remote .ErrorCodec ;
50
54
import org .openqa .selenium .remote .SessionId ;
@@ -230,8 +234,7 @@ private Callable<UsageCountingReverseProxyHandler> loadSessionId(
230
234
return entry ;
231
235
}
232
236
233
- ClientConfig config =
234
- ClientConfig .defaultConfig ().baseUri (sessionUri ).withRetries ();
237
+ ClientConfig config = fetchNodeSessionTimeout (sessionUri ).withRetries ();
235
238
HttpClient httpClient = httpClientFactory .createClient (config );
236
239
237
240
return new CacheEntry (httpClient , 1 );
@@ -247,6 +250,22 @@ private Callable<UsageCountingReverseProxyHandler> loadSessionId(
247
250
});
248
251
}
249
252
253
+ private ClientConfig fetchNodeSessionTimeout (URI uri ) {
254
+ ClientConfig config = ClientConfig .defaultConfig ().baseUri (uri );
255
+ Duration sessionTimeout = config .readTimeout ();
256
+ try (HttpClient httpClient = httpClientFactory .createClient (config )) {
257
+ HttpRequest statusRequest = new HttpRequest (GET , "/se/grid/node/status" );
258
+ HttpResponse res = httpClient .execute (statusRequest );
259
+ NodeStatus nodeStatus = Values .get (res , NodeStatus .class );
260
+ if (nodeStatus != null ) {
261
+ sessionTimeout = nodeStatus .getSessionTimeout ();
262
+ }
263
+ }
264
+ LOG .fine ("Set read timeout: " + sessionTimeout .toSeconds () + " seconds for " + uri );
265
+ config = config .readTimeout (sessionTimeout );
266
+ return config ;
267
+ }
268
+
250
269
@ Override
251
270
public void close () {
252
271
ExecutorServices .shutdownGracefully (
0 commit comments