2121import static org .openqa .selenium .remote .RemoteTags .SESSION_ID ;
2222import static org .openqa .selenium .remote .RemoteTags .SESSION_ID_EVENT ;
2323import static org .openqa .selenium .remote .http .Contents .asJson ;
24+ import static org .openqa .selenium .remote .http .HttpMethod .GET ;
2425import static org .openqa .selenium .remote .tracing .Tags .EXCEPTION ;
2526import static org .openqa .selenium .remote .tracing .Tags .HTTP_REQUEST ;
2627import static org .openqa .selenium .remote .tracing .Tags .HTTP_REQUEST_EVENT ;
2728import static org .openqa .selenium .remote .tracing .Tags .HTTP_RESPONSE ;
2829
2930import java .io .Closeable ;
3031import java .net .URI ;
32+ import java .time .Duration ;
3133import java .time .Instant ;
3234import java .time .temporal .ChronoUnit ;
3335import java .util .Iterator ;
4345import org .openqa .selenium .NoSuchSessionException ;
4446import org .openqa .selenium .concurrent .ExecutorServices ;
4547import org .openqa .selenium .concurrent .GuardedRunnable ;
48+ import org .openqa .selenium .grid .data .NodeStatus ;
4649import org .openqa .selenium .grid .sessionmap .SessionMap ;
4750import org .openqa .selenium .grid .web .ReverseProxyHandler ;
51+ import org .openqa .selenium .grid .web .Values ;
4852import org .openqa .selenium .internal .Require ;
4953import org .openqa .selenium .remote .ErrorCodec ;
5054import org .openqa .selenium .remote .SessionId ;
@@ -230,8 +234,7 @@ private Callable<UsageCountingReverseProxyHandler> loadSessionId(
230234 return entry ;
231235 }
232236
233- ClientConfig config =
234- ClientConfig .defaultConfig ().baseUri (sessionUri ).withRetries ();
237+ ClientConfig config = fetchNodeSessionTimeout (sessionUri ).withRetries ();
235238 HttpClient httpClient = httpClientFactory .createClient (config );
236239
237240 return new CacheEntry (httpClient , 1 );
@@ -247,6 +250,22 @@ private Callable<UsageCountingReverseProxyHandler> loadSessionId(
247250 });
248251 }
249252
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+
250269 @ Override
251270 public void close () {
252271 ExecutorServices .shutdownGracefully (
0 commit comments