package com.github.eyce9000.iem.api;
import java.net.URI;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.client.HttpClient;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
public class ApacheClientBuilder {
private boolean pooled = false;
private boolean insecure;
public ApacheClientBuilder pooled(){
this.pooled = true;
return this;
}
public ApacheClientBuilder insecure(){
this.insecure = true;
return this;
}
private SSLConnectionSocketFactory insecureSocketFactory(){
try{
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs,
String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs,
String authType) {
}
} }, new SecureRandom());
SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslContext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
return factory;
}
catch(Exception ex){
throw new RuntimeException(ex);
}
}
public HttpClient build() {
Registry<ConnectionSocketFactory> r = null;
if(insecure){
RegistryBuilder rbuilder = RegistryBuilder.<ConnectionSocketFactory>create();
rbuilder = rbuilder.register("https",insecureSocketFactory());
r = rbuilder.build();
}
HttpClientConnectionManager cm;
if(pooled){
if(r!=null)
cm = new PoolingHttpClientConnectionManager(r);
else
cm = new PoolingHttpClientConnectionManager();
}
else{
if(r!=null)
cm = new BasicHttpClientConnectionManager(r);
else
cm = new BasicHttpClientConnectionManager();
}
CloseableHttpClient apacheHttpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
return apacheHttpClient;
}
}