From 6606f036423df97ed2ea2b34dab75ca08bbadde9 Mon Sep 17 00:00:00 2001 From: tomas-sexenian Date: Mon, 23 Jun 2025 13:33:06 -0300 Subject: [PATCH 1/6] Add the option to tiemout per url and not per ip --- .../com/genexus/internet/HttpClientJavaLib.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index 8742190de..9b96126af 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -22,6 +22,7 @@ import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.ContentType; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.impl.conn.SystemDefaultDnsResolver; import org.apache.http.protocol.HttpContext; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.auth.AuthScope; @@ -68,6 +69,19 @@ public HttpClientJavaLib() { getPoolInstance(); ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy(); httpClientBuilder = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).setKeepAliveStrategy(myStrategy); + String gxDns = System.getenv("GX_USE_FIRST_IP_DNS"); + if (gxDns == null || gxDns.trim().isEmpty()) { + gxDns = System.getProperty("GX_USE_FIRST_IP_DNS"); + } + if (gxDns != null && gxDns.trim().equalsIgnoreCase("true")) { + httpClientBuilder.setDnsResolver(new SystemDefaultDnsResolver() { + @Override + public InetAddress[] resolve(String host) throws UnknownHostException { + InetAddress[] all = super.resolve(host); + return new InetAddress[] { all[0] }; + } + }); + } cookies = new BasicCookieStore(); streamsToClose = new Vector<>(); } From 58b96e6281cadd51683912e8ebdf92a2472abf19 Mon Sep 17 00:00:00 2001 From: tomas-sexenian Date: Mon, 23 Jun 2025 14:55:16 -0300 Subject: [PATCH 2/6] Switch propety - env order --- .../src/main/java/com/genexus/internet/HttpClientJavaLib.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index 9b96126af..877af2a25 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -69,9 +69,9 @@ public HttpClientJavaLib() { getPoolInstance(); ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy(); httpClientBuilder = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).setKeepAliveStrategy(myStrategy); - String gxDns = System.getenv("GX_USE_FIRST_IP_DNS"); + String gxDns = System.getProperty("GX_USE_FIRST_IP_DNS"); if (gxDns == null || gxDns.trim().isEmpty()) { - gxDns = System.getProperty("GX_USE_FIRST_IP_DNS"); + gxDns = System.getenv("GX_USE_FIRST_IP_DNS"); } if (gxDns != null && gxDns.trim().equalsIgnoreCase("true")) { httpClientBuilder.setDnsResolver(new SystemDefaultDnsResolver() { From bd049700263db424f12d4ce40fe10d96b0a10d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Sexenian?= <99925035+tomas-sexenian@users.noreply.github.com> Date: Wed, 2 Jul 2025 10:10:00 -0300 Subject: [PATCH 3/6] Revert "Switch propety - env order" This reverts commit 58b96e6281cadd51683912e8ebdf92a2472abf19. --- .../src/main/java/com/genexus/internet/HttpClientJavaLib.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index 877af2a25..9b96126af 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -69,9 +69,9 @@ public HttpClientJavaLib() { getPoolInstance(); ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy(); httpClientBuilder = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).setKeepAliveStrategy(myStrategy); - String gxDns = System.getProperty("GX_USE_FIRST_IP_DNS"); + String gxDns = System.getenv("GX_USE_FIRST_IP_DNS"); if (gxDns == null || gxDns.trim().isEmpty()) { - gxDns = System.getenv("GX_USE_FIRST_IP_DNS"); + gxDns = System.getProperty("GX_USE_FIRST_IP_DNS"); } if (gxDns != null && gxDns.trim().equalsIgnoreCase("true")) { httpClientBuilder.setDnsResolver(new SystemDefaultDnsResolver() { From 668d7dfb169d87d757437f21db199679dd59b853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Sexenian?= <99925035+tomas-sexenian@users.noreply.github.com> Date: Wed, 2 Jul 2025 10:10:07 -0300 Subject: [PATCH 4/6] Revert "Add the option to tiemout per url and not per ip" This reverts commit 6606f036423df97ed2ea2b34dab75ca08bbadde9. --- .../com/genexus/internet/HttpClientJavaLib.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index 9b96126af..8742190de 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -22,7 +22,6 @@ import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.ContentType; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.impl.conn.SystemDefaultDnsResolver; import org.apache.http.protocol.HttpContext; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.auth.AuthScope; @@ -69,19 +68,6 @@ public HttpClientJavaLib() { getPoolInstance(); ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy(); httpClientBuilder = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).setKeepAliveStrategy(myStrategy); - String gxDns = System.getenv("GX_USE_FIRST_IP_DNS"); - if (gxDns == null || gxDns.trim().isEmpty()) { - gxDns = System.getProperty("GX_USE_FIRST_IP_DNS"); - } - if (gxDns != null && gxDns.trim().equalsIgnoreCase("true")) { - httpClientBuilder.setDnsResolver(new SystemDefaultDnsResolver() { - @Override - public InetAddress[] resolve(String host) throws UnknownHostException { - InetAddress[] all = super.resolve(host); - return new InetAddress[] { all[0] }; - } - }); - } cookies = new BasicCookieStore(); streamsToClose = new Vector<>(); } From 86f4deb5addbc09bc2d679232291cfecf6ac5523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Sexenian?= <99925035+tomas-sexenian@users.noreply.github.com> Date: Wed, 2 Jul 2025 10:53:58 -0300 Subject: [PATCH 5/6] Apply ip resolver logic to pool also --- .../genexus/internet/HttpClientJavaLib.java | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index 8742190de..3e3543197 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -18,10 +18,12 @@ import org.apache.http.*; import org.apache.http.HttpResponse; import org.apache.http.client.config.CookieSpecs; +import org.apache.http.conn.DnsResolver; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.ContentType; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.impl.conn.SystemDefaultDnsResolver; import org.apache.http.protocol.HttpContext; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.auth.AuthScope; @@ -64,10 +66,44 @@ public class HttpClientJavaLib extends GXHttpClient { + private static class FirstIpDnsResolver implements DnsResolver { + private final DnsResolver defaultDnsResolver = new SystemDefaultDnsResolver(); + + @Override + public InetAddress[] resolve(final String host) throws UnknownHostException { + InetAddress[] allIps = defaultDnsResolver.resolve(host); + if (allIps != null && allIps.length > 0) { + return new InetAddress[]{allIps[0]}; + } + return allIps; + } + } + + private static String getGxIpResolverConfig() { + String name = "GX_USE_FIRST_IP_DNS"; + String gxDns = System.getProperty(name); + if (gxDns == null || gxDns.trim().isEmpty()) { + gxDns = System.getenv(name); + } + if (gxDns != null && gxDns.trim().equalsIgnoreCase("true")) { + return gxDns.trim(); + } else { + return null; + } + } + + public HttpClientJavaLib() { getPoolInstance(); ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy(); - httpClientBuilder = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).setKeepAliveStrategy(myStrategy); + HttpClientBuilder builder = HttpClients.custom() + .setConnectionManager(connManager) + .setConnectionManagerShared(true) + .setKeepAliveStrategy(myStrategy); + if (getGxIpResolverConfig() != null) { + builder.setDnsResolver(new FirstIpDnsResolver()); + } + httpClientBuilder = builder; cookies = new BasicCookieStore(); streamsToClose = new Vector<>(); } @@ -78,7 +114,13 @@ private static void getPoolInstance() { RegistryBuilder.create() .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", getSSLSecureInstance()) .build(); - connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + String useFirstIpDnsResolver = getGxIpResolverConfig(); + if (useFirstIpDnsResolver != null) { + DnsResolver dnsResolver = new FirstIpDnsResolver(); + connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, dnsResolver); + } else { + connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + } connManager.setMaxTotal((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_SIZE", "1000"))); connManager.setDefaultMaxPerRoute((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_PER_ROUTE", "1000"))); From 1926f584855b89d78450cfcb51dade4c0dedd393 Mon Sep 17 00:00:00 2001 From: "tomas.sexenian" Date: Thu, 10 Jul 2025 18:29:49 -0300 Subject: [PATCH 6/6] Switch if-else for ternay operator --- .../java/com/genexus/internet/HttpClientJavaLib.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index a92d64cd9..630729d1f 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -114,13 +114,10 @@ private static void getPoolInstance() { RegistryBuilder.create() .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", getSSLSecureInstance()) .build(); - String useFirstIpDnsResolver = getGxIpResolverConfig(); - if (useFirstIpDnsResolver != null) { - DnsResolver dnsResolver = new FirstIpDnsResolver(); - connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, dnsResolver); - } else { - connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); - } + boolean useCustomDnsResolver = getGxIpResolverConfig() != null; + PoolingHttpClientConnectionManager connManager = useCustomDnsResolver + ? new PoolingHttpClientConnectionManager(socketFactoryRegistry, new FirstIpDnsResolver()) + : new PoolingHttpClientConnectionManager(socketFactoryRegistry); connManager.setMaxTotal((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_SIZE", "1000"))); connManager.setDefaultMaxPerRoute((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_PER_ROUTE", "1000")));