io.searchbox.client.config.HttpClientConfig Maven / Gradle / Ivy
package io.searchbox.client.config;
import io.searchbox.client.JestRetryHandler;
import io.searchbox.client.NoopRetryHandler;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthenticationStrategy;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.conn.routing.HttpRoutePlanner;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.impl.conn.SystemDefaultRoutePlanner;
import org.apache.http.nio.conn.NoopIOSessionStrategy;
import org.apache.http.nio.conn.SchemeIOSessionStrategy;
import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
import java.net.ProxySelector;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author Dogukan Sonmez
* @author cihat keser
*/
public class HttpClientConfig extends ClientConfig {
private final Integer maxTotalConnection;
private final Integer defaultMaxTotalConnectionPerRoute;
private final Map maxTotalConnectionPerRoute;
private final CredentialsProvider credentialsProvider;
private final LayeredConnectionSocketFactory sslSocketFactory;
private final ConnectionSocketFactory plainSocketFactory;
private final HttpRoutePlanner httpRoutePlanner;
private final AuthenticationStrategy proxyAuthenticationStrategy;
private final SchemeIOSessionStrategy httpIOSessionStrategy;
private final SchemeIOSessionStrategy httpsIOSessionStrategy;
private final JestRetryHandler retryHandler;
private Set preemptiveAuthTargetHosts;
public HttpClientConfig(Builder builder) {
super(builder);
this.maxTotalConnection = builder.maxTotalConnection;
this.defaultMaxTotalConnectionPerRoute = builder.defaultMaxTotalConnectionPerRoute;
this.maxTotalConnectionPerRoute = builder.maxTotalConnectionPerRoute;
this.credentialsProvider = builder.credentialsProvider;
this.sslSocketFactory = builder.sslSocketFactory;
this.plainSocketFactory = builder.plainSocketFactory;
this.httpRoutePlanner = builder.httpRoutePlanner;
this.proxyAuthenticationStrategy = builder.proxyAuthenticationStrategy;
this.httpIOSessionStrategy = builder.httpIOSessionStrategy;
this.httpsIOSessionStrategy = builder.httpsIOSessionStrategy;
this.retryHandler = builder.retryHandler;
this.preemptiveAuthTargetHosts = builder.preemptiveAuthTargetHosts;
}
public Map getMaxTotalConnectionPerRoute() {
return maxTotalConnectionPerRoute;
}
public Integer getMaxTotalConnection() {
return maxTotalConnection;
}
public Integer getDefaultMaxTotalConnectionPerRoute() {
return defaultMaxTotalConnectionPerRoute;
}
public CredentialsProvider getCredentialsProvider() {
return credentialsProvider;
}
public LayeredConnectionSocketFactory getSslSocketFactory() {
return sslSocketFactory;
}
public ConnectionSocketFactory getPlainSocketFactory() {
return plainSocketFactory;
}
public HttpRoutePlanner getHttpRoutePlanner() {
return httpRoutePlanner;
}
public AuthenticationStrategy getProxyAuthenticationStrategy() {
return proxyAuthenticationStrategy;
}
public SchemeIOSessionStrategy getHttpIOSessionStrategy() {
return httpIOSessionStrategy;
}
public SchemeIOSessionStrategy getHttpsIOSessionStrategy() {
return httpsIOSessionStrategy;
}
public JestRetryHandler getRetryHandler() {
return retryHandler;
}
public Set getPreemptiveAuthTargetHosts() {
return preemptiveAuthTargetHosts;
}
public static class Builder extends ClientConfig.AbstractBuilder {
private Integer maxTotalConnection;
private Integer defaultMaxTotalConnectionPerRoute;
private Map maxTotalConnectionPerRoute = new HashMap();
private CredentialsProvider credentialsProvider;
private LayeredConnectionSocketFactory sslSocketFactory;
private ConnectionSocketFactory plainSocketFactory;
private HttpRoutePlanner httpRoutePlanner;
private AuthenticationStrategy proxyAuthenticationStrategy;
private SchemeIOSessionStrategy httpIOSessionStrategy;
private SchemeIOSessionStrategy httpsIOSessionStrategy;
private JestRetryHandler retryHandler;
private Set preemptiveAuthTargetHosts = Collections.emptySet();
public Builder(HttpClientConfig httpClientConfig) {
super(httpClientConfig);
this.maxTotalConnection = httpClientConfig.maxTotalConnection;
this.defaultMaxTotalConnectionPerRoute = httpClientConfig.defaultMaxTotalConnectionPerRoute;
this.maxTotalConnectionPerRoute = httpClientConfig.maxTotalConnectionPerRoute;
}
public Builder(Collection serverUris) {
super(serverUris);
}
public Builder(String serverUri) {
super(serverUri);
}
public Builder maxTotalConnection(int maxTotalConnection) {
this.maxTotalConnection = maxTotalConnection;
return this;
}
public Builder defaultMaxTotalConnectionPerRoute(int defaultMaxTotalConnectionPerRoute) {
this.defaultMaxTotalConnectionPerRoute = defaultMaxTotalConnectionPerRoute;
return this;
}
public Builder maxTotalConnectionPerRoute(Map maxTotalConnectionPerRoute) {
this.maxTotalConnectionPerRoute.putAll(maxTotalConnectionPerRoute);
return this;
}
public Builder maxTotalConnectionPerRoute(HttpRoute httpRoute, int maxTotalConnection) {
this.maxTotalConnectionPerRoute.put(httpRoute, maxTotalConnection);
return this;
}
/**
* Set a custom instance of an implementation of CredentialsProvider
.
* This method will override any previous credential setting (including defaultCredentials
) on this builder instance.
*/
public Builder credentialsProvider(CredentialsProvider credentialsProvider) {
this.credentialsProvider = credentialsProvider;
return this;
}
public Builder defaultCredentials(String username, String password) {
this.credentialsProvider = new BasicCredentialsProvider();
this.credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials(username, password)
);
return this;
}
/**
* Sets the socket factory that will be used by sync client for HTTP scheme.
*
* SSLConnectionSocketFactory.getSocketFactory()
is used by default.
*
* A bad example of trust-all socket factory creation can be done as below:
*
*
* // trust ALL certificates
* SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
* public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
* return true;
* }
* }).build();
*
* // skip hostname checks
* HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
*
* SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
*
*
* @param socketFactory socket factory instance that will be registered for https
scheme.
* @see SSLConnectionSocketFactory
*/
public Builder sslSocketFactory(LayeredConnectionSocketFactory socketFactory) {
this.sslSocketFactory = socketFactory;
return this;
}
/**
* Sets the socket factory that will be used by sync client for HTTPS scheme.
*
* PlainConnectionSocketFactory.getSocketFactory()
is used by default.
*
*
* @param socketFactory socket factory instance that will be registered for http
scheme.
* @see PlainConnectionSocketFactory
*/
public Builder plainSocketFactory(ConnectionSocketFactory socketFactory) {
this.plainSocketFactory = socketFactory;
return this;
}
/**
* Sets the socket factory that will be used by async client for HTTP scheme.
*
* NoopIOSessionStrategy.INSTANCE
is used by default.
*
*
* @param httpIOSessionStrategy SchemeIOSessionStrategy instance that will be registered for http
scheme.
* @see NoopIOSessionStrategy
*/
public Builder httpIOSessionStrategy(SchemeIOSessionStrategy httpIOSessionStrategy) {
this.httpIOSessionStrategy = httpIOSessionStrategy;
return this;
}
/**
* Sets the socket factory that will be used by async client for HTTPS scheme.
*
* SSLIOSessionStrategy.getSystemDefaultStrategy()
is used by default.
*
*
* @param httpsIOSessionStrategy SchemeIOSessionStrategy instance that will be registered for https
scheme.
* @see SSLIOSessionStrategy
*/
public Builder httpsIOSessionStrategy(SchemeIOSessionStrategy httpsIOSessionStrategy) {
this.httpsIOSessionStrategy = httpsIOSessionStrategy;
return this;
}
public Builder retryHandler(JestRetryHandler retryHandler) {
this.retryHandler = retryHandler;
return this;
}
/**
* Sets preemptive authentication for the specified target host by pre-populating an authentication data cache.
*
* It is mandatory to set a credentials provider to use preemptive authentication.
*
* If preemptive authentication is set without setting a credentials provider an exception will be thrown.
*
*/
public Builder setPreemptiveAuth(HttpHost targetHost) {
return preemptiveAuthTargetHosts(Collections.singleton(targetHost));
}
/**
* Sets preemptive authentication for the specified set of target hosts by pre-populating an authentication data cache.
*
* It is mandatory to set a credentials provider to use preemptive authentication.
*
* If preemptive authentication is set without setting a credentials provider an exception will be thrown.
*
* @param preemptiveAuthTargetHosts set of hosts targeted for preemptive authentication
*/
public Builder preemptiveAuthTargetHosts(Set preemptiveAuthTargetHosts) {
if (preemptiveAuthTargetHosts != null) {
this.preemptiveAuthTargetHosts = new HashSet(preemptiveAuthTargetHosts);
}
return this;
}
public Builder proxy(HttpHost proxy) {
return proxy(proxy, null);
}
public Builder proxy(HttpHost proxy, AuthenticationStrategy proxyAuthenticationStrategy) {
this.httpRoutePlanner = new DefaultProxyRoutePlanner(proxy);
this.proxyAuthenticationStrategy = proxyAuthenticationStrategy;
return this;
}
public HttpClientConfig build() {
// Lazily initialize if necessary, as the call can be expensive when done eagerly.
if (this.sslSocketFactory == null) {
this.sslSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
}
if(this.plainSocketFactory == null) {
this.plainSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
}
if(this.httpRoutePlanner == null) {
this.httpRoutePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());
}
if(this.httpIOSessionStrategy == null) {
this.httpIOSessionStrategy = NoopIOSessionStrategy.INSTANCE;
}
if(this.httpsIOSessionStrategy == null) {
this.httpsIOSessionStrategy = SSLIOSessionStrategy.getSystemDefaultStrategy();
}
if(this.retryHandler == null) {
this.retryHandler = new NoopRetryHandler<>();
}
if (preemptiveAuthSetWithoutCredentials()) {
throw new IllegalArgumentException("Preemptive authentication set without credentials provider");
}
return new HttpClientConfig(this);
}
private boolean preemptiveAuthSetWithoutCredentials() {
return !preemptiveAuthTargetHosts.isEmpty() && credentialsProvider == null;
}
}
}