diff --git a/java/src/org/openqa/selenium/grid/node/Node.java b/java/src/org/openqa/selenium/grid/node/Node.java index d2b0d5223802b..6a8627fd23ffe 100644 --- a/java/src/org/openqa/selenium/grid/node/Node.java +++ b/java/src/org/openqa/selenium/grid/node/Node.java @@ -199,7 +199,9 @@ protected Node( .to(() -> new Drain(this, json)) .with(spanDecorator("node.drain").andThen(requiresSecret)), get("/se/grid/node/status") - .to(() -> req -> new HttpResponse().setContent(asJson(getStatus()))) + .to( + () -> + req -> new HttpResponse().setContent(asJson(Map.of("value", getStatus())))) .with(spanDecorator("node.node_status")), get("/status").to(() -> new StatusHandler(this)).with(spanDecorator("node.status"))); } diff --git a/java/src/org/openqa/selenium/grid/router/HandleSession.java b/java/src/org/openqa/selenium/grid/router/HandleSession.java index 58c36ed4cc27d..d557a890f974e 100644 --- a/java/src/org/openqa/selenium/grid/router/HandleSession.java +++ b/java/src/org/openqa/selenium/grid/router/HandleSession.java @@ -21,6 +21,7 @@ import static org.openqa.selenium.remote.RemoteTags.SESSION_ID; import static org.openqa.selenium.remote.RemoteTags.SESSION_ID_EVENT; import static org.openqa.selenium.remote.http.Contents.asJson; +import static org.openqa.selenium.remote.http.HttpMethod.GET; import static org.openqa.selenium.remote.tracing.Tags.EXCEPTION; import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST; import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST_EVENT; @@ -28,6 +29,7 @@ import java.io.Closeable; import java.net.URI; +import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Iterator; @@ -43,8 +45,10 @@ import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.concurrent.ExecutorServices; import org.openqa.selenium.concurrent.GuardedRunnable; +import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.sessionmap.SessionMap; import org.openqa.selenium.grid.web.ReverseProxyHandler; +import org.openqa.selenium.grid.web.Values; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.ErrorCodec; import org.openqa.selenium.remote.SessionId; @@ -230,8 +234,7 @@ private Callable loadSessionId( return entry; } - ClientConfig config = - ClientConfig.defaultConfig().baseUri(sessionUri).withRetries(); + ClientConfig config = fetchNodeSessionTimeout(sessionUri).withRetries(); HttpClient httpClient = httpClientFactory.createClient(config); return new CacheEntry(httpClient, 1); @@ -247,6 +250,22 @@ private Callable loadSessionId( }); } + private ClientConfig fetchNodeSessionTimeout(URI uri) { + ClientConfig config = ClientConfig.defaultConfig().baseUri(uri); + Duration sessionTimeout = config.readTimeout(); + try (HttpClient httpClient = httpClientFactory.createClient(config)) { + HttpRequest statusRequest = new HttpRequest(GET, "/se/grid/node/status"); + HttpResponse res = httpClient.execute(statusRequest); + NodeStatus nodeStatus = Values.get(res, NodeStatus.class); + if (nodeStatus != null) { + sessionTimeout = nodeStatus.getSessionTimeout(); + } + } + LOG.fine("Set read timeout: " + sessionTimeout.toSeconds() + " seconds for " + uri); + config = config.readTimeout(sessionTimeout); + return config; + } + @Override public void close() { ExecutorServices.shutdownGracefully(