Skip to content

Commit 86f4deb

Browse files
Apply ip resolver logic to pool also
1 parent 668d7df commit 86f4deb

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

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

Lines changed: 44 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,13 @@ private static void getPoolInstance() {
78114
RegistryBuilder.<ConnectionSocketFactory>create()
79115
.register("http", PlainConnectionSocketFactory.INSTANCE).register("https", getSSLSecureInstance())
80116
.build();
81-
connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
117+
String useFirstIpDnsResolver = getGxIpResolverConfig();
118+
if (useFirstIpDnsResolver != null) {
119+
DnsResolver dnsResolver = new FirstIpDnsResolver();
120+
connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, dnsResolver);
121+
} else {
122+
connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
123+
}
82124
connManager.setMaxTotal((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_SIZE", "1000")));
83125
connManager.setDefaultMaxPerRoute((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_PER_ROUTE", "1000")));
84126

0 commit comments

Comments
 (0)