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 ;
6566
6667public class HttpClientJavaLib extends GXHttpClient {
6768
68- public HttpClientJavaLib () {
69- getPoolInstance ();
70- ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy ();
71- httpClientBuilder = HttpClients .custom ().setConnectionManager (connManager ).setConnectionManagerShared (true ).setKeepAliveStrategy (myStrategy );
72- String gxDns = System .getProperty ("GX_USE_FIRST_IP_DNS" );
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 );
7385 if (gxDns == null || gxDns .trim ().isEmpty ()) {
74- gxDns = System .getenv ("GX_USE_FIRST_IP_DNS" );
86+ gxDns = System .getenv (name );
7587 }
7688 if (gxDns != null && gxDns .trim ().equalsIgnoreCase ("true" )) {
77- httpClientBuilder .setDnsResolver (new SystemDefaultDnsResolver () {
78- @ Override
79- public InetAddress [] resolve (String host ) throws UnknownHostException {
80- InetAddress [] all = super .resolve (host );
81- return new InetAddress [] { all [0 ] };
82- }
83- });
89+ return gxDns .trim ();
90+ } else {
91+ return null ;
8492 }
93+ }
94+
95+
96+ public HttpClientJavaLib () {
97+ getPoolInstance ();
98+ ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy ();
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 ;
85107 cookies = new BasicCookieStore ();
86108 streamsToClose = new Vector <>();
87109 }
@@ -92,7 +114,13 @@ private static void getPoolInstance() {
92114 RegistryBuilder .<ConnectionSocketFactory >create ()
93115 .register ("http" , PlainConnectionSocketFactory .INSTANCE ).register ("https" ,getSSLSecureInstance ())
94116 .build ();
95- 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+ }
96124 connManager .setMaxTotal ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_SIZE" , "1000" )));
97125 connManager .setDefaultMaxPerRoute ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_PER_ROUTE" , "1000" )));
98126
0 commit comments