Skip to content

Commit b977075

Browse files
Add the option to timeout per host and not per ip (#977)
* Add the option to tiemout per url and not per ip * Switch propety - env order * Revert "Switch propety - env order" This reverts commit 58b96e6. * Revert "Add the option to tiemout per url and not per ip" This reverts commit 6606f03. * Apply ip resolver logic to pool also * Switch if-else for ternay operator
1 parent 3e2b9e7 commit b977075

File tree

1 file changed

+41
-2
lines changed

1 file changed

+41
-2
lines changed

java/src/main/java/com/genexus/internet/HttpClientJavaLib.java

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
import org.apache.http.*;
1919
import org.apache.http.HttpResponse;
2020
import org.apache.http.client.config.CookieSpecs;
21+
import org.apache.http.conn.DnsResolver;
2122
import org.apache.http.conn.routing.HttpRoute;
2223
import org.apache.http.conn.ssl.NoopHostnameVerifier;
2324
import org.apache.http.entity.ContentType;
2425
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
26+
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
2527
import org.apache.http.protocol.HttpContext;
2628
import org.apache.http.auth.AuthSchemeProvider;
2729
import org.apache.http.auth.AuthScope;
@@ -64,10 +66,44 @@
6466

6567
public class HttpClientJavaLib extends GXHttpClient {
6668

69+
private static class FirstIpDnsResolver implements DnsResolver {
70+
private final DnsResolver defaultDnsResolver = new SystemDefaultDnsResolver();
71+
72+
@Override
73+
public InetAddress[] resolve(final String host) throws UnknownHostException {
74+
InetAddress[] allIps = defaultDnsResolver.resolve(host);
75+
if (allIps != null && allIps.length > 0) {
76+
return new InetAddress[]{allIps[0]};
77+
}
78+
return allIps;
79+
}
80+
}
81+
82+
private static String getGxIpResolverConfig() {
83+
String name = "GX_USE_FIRST_IP_DNS";
84+
String gxDns = System.getProperty(name);
85+
if (gxDns == null || gxDns.trim().isEmpty()) {
86+
gxDns = System.getenv(name);
87+
}
88+
if (gxDns != null && gxDns.trim().equalsIgnoreCase("true")) {
89+
return gxDns.trim();
90+
} else {
91+
return null;
92+
}
93+
}
94+
95+
6796
public HttpClientJavaLib() {
6897
getPoolInstance();
6998
ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy();
70-
httpClientBuilder = HttpClients.custom().setConnectionManager(connManager).setConnectionManagerShared(true).setKeepAliveStrategy(myStrategy);
99+
HttpClientBuilder builder = HttpClients.custom()
100+
.setConnectionManager(connManager)
101+
.setConnectionManagerShared(true)
102+
.setKeepAliveStrategy(myStrategy);
103+
if (getGxIpResolverConfig() != null) {
104+
builder.setDnsResolver(new FirstIpDnsResolver());
105+
}
106+
httpClientBuilder = builder;
71107
cookies = new BasicCookieStore();
72108
streamsToClose = new Vector<>();
73109
}
@@ -78,7 +114,10 @@ private static void getPoolInstance() {
78114
RegistryBuilder.<ConnectionSocketFactory>create()
79115
.register("http", PlainConnectionSocketFactory.INSTANCE).register("https", getSSLSecureInstance())
80116
.build();
81-
connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
117+
boolean useCustomDnsResolver = getGxIpResolverConfig() != null;
118+
PoolingHttpClientConnectionManager connManager = useCustomDnsResolver
119+
? new PoolingHttpClientConnectionManager(socketFactoryRegistry, new FirstIpDnsResolver())
120+
: new PoolingHttpClientConnectionManager(socketFactoryRegistry);
82121
connManager.setMaxTotal((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_SIZE", "1000")));
83122
connManager.setDefaultMaxPerRoute((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_PER_ROUTE", "1000")));
84123

0 commit comments

Comments
 (0)