bce-sdk-java
bce-sdk-java copied to clipboard
支持自定义DnsResolver
我有一个场景,需要 bce-java-sdk的BceHttpClient支持自定义DNS解析。
我翻阅了源代码,一个解决方案是在BceClientConfiguration.java中,引入Apache HttpClient的org.apache.http.conn.DnsResolver,
并在BceHttpClient.java的私有方法createHttpClient引入Configuration,配置自定义dns。
BceClientConfiguration.java
public class BceClientConfiguration {
private DnsResolver dnsResolver;
public void setDnsResolver(DnsResolver dnsResolver) {
this.dnsResolver = dnsResolver;
}
public DnsResolver getDnsResolver() {
return this.dnsResolver;
}
public BceClientConfiguration withDnsResolver(DnsResolver dnsResolver){
this.setDnsResolver(dnsResolver);
return this;
}
}
BceHttpClient.java
private CloseableHttpClient createHttpClient(HttpClientConnectionManager connectionManager, BceClientConfiguration config) {
HttpClientBuilder builder =
HttpClients.custom().setConnectionManager(connectionManager).disableAutomaticRetries()
.setDnsResolver(config.getDnsResolver()); // set dns resolver
int socketBufferSizeInBytes = this.config.getSocketBufferSizeInBytes();
if (socketBufferSizeInBytes > 0) {
builder.setDefaultConnectionConfig(
ConnectionConfig.custom().setBufferSize(socketBufferSizeInBytes).build());
}
return builder.build();
}
private HttpClientConnectionManager createHttpClientConnectionManager(BceClientConfiguration config) {
ConnectionSocketFactory socketFactory = PlainConnectionSocketFactory.getSocketFactory();
LayeredConnectionSocketFactory sslSocketFactory;
try {
sslSocketFactory = new SSLConnectionSocketFactory(SSLContext.getDefault(),
SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
} catch (NoSuchAlgorithmException e) {
throw new BceClientException("Fail to create SSLConnectionSocketFactory", e);
}
Registry<ConnectionSocketFactory> registry =
RegistryBuilder.<ConnectionSocketFactory>create().register(Protocol.HTTP.toString(), socketFactory)
.register(Protocol.HTTPS.toString(), sslSocketFactory).build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry, config);
connectionManager.setDefaultMaxPerRoute(this.config.getMaxConnections());
connectionManager
.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(this.config.getSocketTimeoutInMillis())
.setTcpNoDelay(true).build());
connectionManager.setMaxTotal(this.config.getMaxConnections());
return connectionManager;
}