1818import org .apache .http .*;
1919import org .apache .http .HttpResponse ;
2020import org .apache .http .client .config .CookieSpecs ;
21+ import org .apache .http .conn .DnsResolver ;
2122import org .apache .http .conn .routing .HttpRoute ;
2223import org .apache .http .conn .ssl .NoopHostnameVerifier ;
2324import org .apache .http .entity .ContentType ;
2425import org .apache .http .conn .ssl .SSLConnectionSocketFactory ;
2526import org .apache .http .impl .conn .PoolingHttpClientConnectionManager ;
27+ import org .apache .http .impl .conn .SystemDefaultDnsResolver ;
2628import org .apache .http .protocol .HttpContext ;
2729import org .apache .http .auth .AuthSchemeProvider ;
2830import org .apache .http .auth .AuthScope ;
6466
6567public class HttpClientJavaLib extends GXHttpClient {
6668
69+ private static final DnsResolver FIRST_IP_DNS_RESOLVER = host -> {
70+ InetAddress [] allIps = SystemDefaultDnsResolver .INSTANCE .resolve (host );
71+ if (allIps != null && allIps .length > 1 ) {
72+ return new InetAddress []{allIps [0 ]};
73+ }
74+ return allIps ;
75+ };
76+
77+ private static boolean isFirstIpDnsEnabled () {
78+ String name = "GX_USE_FIRST_IP_DNS" ;
79+ String gxDns = System .getProperty (name );
80+ if (gxDns == null || gxDns .trim ().isEmpty ()) {
81+ gxDns = System .getenv (name );
82+ }
83+ return gxDns != null && gxDns .trim ().equalsIgnoreCase ("true" );
84+ }
85+
6786 public HttpClientJavaLib () {
6887 getPoolInstance ();
6988 ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy ();
70- httpClientBuilder = HttpClients .custom ().setConnectionManager (connManager ).setConnectionManagerShared (true ).setKeepAliveStrategy (myStrategy );
71- cookies = new BasicCookieStore ();
89+ HttpClientBuilder builder = HttpClients .custom ()
90+ .setConnectionManager (connManager )
91+ .setConnectionManagerShared (true )
92+ .setKeepAliveStrategy (myStrategy );
93+ if (isFirstIpDnsEnabled ()) {
94+ builder .setDnsResolver (FIRST_IP_DNS_RESOLVER );
95+ }
96+ httpClientBuilder = builder ;
97+ cookies = new BasicCookieStore ();
7298 streamsToClose = new Vector <>();
7399 }
74100
@@ -78,7 +104,11 @@ private static void getPoolInstance() {
78104 RegistryBuilder .<ConnectionSocketFactory >create ()
79105 .register ("http" , PlainConnectionSocketFactory .INSTANCE ).register ("https" ,getSSLSecureInstance ())
80106 .build ();
81- connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry );
107+ if (isFirstIpDnsEnabled ()) {
108+ connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry , FIRST_IP_DNS_RESOLVER );
109+ } else {
110+ connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry );
111+ }
82112 connManager .setMaxTotal ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_SIZE" , "1000" )));
83113 connManager .setDefaultMaxPerRoute ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_PER_ROUTE" , "1000" )));
84114
@@ -620,7 +650,7 @@ public void execute(String method, String url) {
620650 resetStateAdapted ();
621651 }
622652 }
623-
653+
624654 private synchronized void displayHTTPConnections (){
625655 Iterator <HttpRoute > iterator = storedRoutes .iterator ();
626656 while (iterator .hasNext ()) {
0 commit comments