diff --git a/common/src/main/java/com/genexus/internet/GXHttpClient.java b/common/src/main/java/com/genexus/internet/GXHttpClient.java index 951f13d8d..607ccf071 100644 --- a/common/src/main/java/com/genexus/internet/GXHttpClient.java +++ b/common/src/main/java/com/genexus/internet/GXHttpClient.java @@ -720,7 +720,11 @@ private byte[] addToArray(byte[] in, byte[] val) } protected void setExceptionsCatch(Exception e) { - setErrCode(ERROR_IO); + setExceptionsCatch(ERROR_IO, e); + } + + protected void setExceptionsCatch(int errorCode, Exception e) { + setErrCode(errorCode); setErrDescription(e.getMessage()); } diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index f255d7ebf..2573a2b6a 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -1,9 +1,7 @@ package com.genexus.internet; import java.io.*; -import java.net.InetAddress; -import java.net.URISyntaxException; -import java.net.UnknownHostException; +import java.net.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; @@ -12,12 +10,14 @@ import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.*; -import java.net.URI; import javax.net.ssl.SSLContext; import org.apache.http.*; import org.apache.http.HttpResponse; +import org.apache.http.client.CookieStore; import org.apache.http.client.config.CookieSpecs; +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.conn.ConnectionPoolTimeoutException; import org.apache.http.conn.DnsResolver; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.ssl.NoopHostnameVerifier; @@ -65,6 +65,9 @@ import com.genexus.specific.java.*; public class HttpClientJavaLib extends GXHttpClient { + private static final int ERROR_SOCKET_TIMEOUT = 1001; + private static final int ERROR_CONNECT_TIMEOUT = 1002; + private static final int ERROR_CONNECTION_REQUEST_TIMEOUT = 1003; private static final DnsResolver FIRST_IP_DNS_RESOLVER = host -> { InetAddress[] allIps = SystemDefaultDnsResolver.INSTANCE.resolve(host); @@ -417,11 +420,35 @@ public void execute(String method, String url) { int msTimeout = getTimeout() * 1000; + int connectTimeout = msTimeout; + int connectionRequestTimeout = msTimeout; + int socketTimeout = msTimeout; + + try { + String connectTimeoutEnv = System.getenv("HTTP_CONNECT_TIMEOUT_MS"); + if (connectTimeoutEnv != null && !connectTimeoutEnv.trim().isEmpty()) { + connectTimeout = Integer.parseInt(connectTimeoutEnv); + } + + String connectionRequestTimeoutEnv = System.getenv("HTTP_CONNECTION_REQUEST_TIMEOUT_MS"); + if (connectionRequestTimeoutEnv != null && !connectionRequestTimeoutEnv.trim().isEmpty()) { + connectionRequestTimeout = Integer.parseInt(connectionRequestTimeoutEnv); + } + + String socketTimeoutEnv = System.getenv("HTTP_SOCKET_TIMEOUT_MS"); + if (socketTimeoutEnv != null && !socketTimeoutEnv.trim().isEmpty()) { + socketTimeout = Integer.parseInt(socketTimeoutEnv); + } + } + catch (NumberFormatException e) { + logger.error("Error parsing timeout environment variables", e); + } + RequestConfig.Builder requestConfigBuilder = RequestConfig.custom() .setCookieSpec(CookieSpecs.STANDARD) - .setSocketTimeout(msTimeout) - .setConnectionRequestTimeout(msTimeout) - .setConnectTimeout(msTimeout); + .setSocketTimeout(socketTimeout) + .setConnectionRequestTimeout(connectionRequestTimeout) + .setConnectTimeout(connectTimeout); this.httpClientBuilder.setRoutePlanner(null); @@ -650,11 +677,14 @@ public void execute(String method, String url) { if (response.containsHeader("Transfer-Encoding")) { isChunkedResponse = response.getFirstHeader("Transfer-Encoding").getValue().equalsIgnoreCase("chunked"); } - + } catch (ConnectionPoolTimeoutException e) { + setExecuteExceptionsCatch(ERROR_CONNECTION_REQUEST_TIMEOUT, e); + } catch (ConnectTimeoutException e) { + setExecuteExceptionsCatch(ERROR_CONNECT_TIMEOUT, e); + } catch (SocketTimeoutException e) { + setExecuteExceptionsCatch(ERROR_SOCKET_TIMEOUT, e); } catch (IOException e) { - setExceptionsCatch(e); - this.statusCode = 0; - this.reasonLine = ""; + setExecuteExceptionsCatch(ERROR_IO, e); } finally { if (Application.isJMXEnabled()){ @@ -671,6 +701,13 @@ public void execute(String method, String url) { } } + private void setExecuteExceptionsCatch(int errorCode, Exception e) { + setExceptionsCatch(errorCode, e); + this.statusCode = 0; + this.reasonLine = ""; + logger.error("Execute error: " + e.getMessage(), e); + } + private synchronized void displayHTTPConnections(){ Iterator iterator = storedRoutes.iterator(); while (iterator.hasNext()) {