Skip to content

支持自定义DnsResolver #42

Description

@wzhejunqiu

我有一个场景,需要 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;
    }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions