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