Skip to content

Commit

Permalink
[JBEAP-12012] : ApacheHttpClient4Engine ignores HttpClient#defaultReq…
Browse files Browse the repository at this point in the history
…uestConfig.
  • Loading branch information
panossot committed Jul 18, 2017
1 parent 4516bcc commit c4b3697
Show file tree
Hide file tree
Showing 7 changed files with 493 additions and 21 deletions.
2 changes: 1 addition & 1 deletion jaxrs/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
<version.org.glassfish.javax.el>3.0.0</version.org.glassfish.javax.el>
<version.io.undertow>1.2.8.Final</version.io.undertow>
<version.com.fasterxml.jackson>2.6.3</version.com.fasterxml.jackson>
<version.org.apache.httpcomponents>4.3.6</version.org.apache.httpcomponents>
<version.org.apache.httpcomponents>4.4.1</version.org.apache.httpcomponents>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- java 7-->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
package org.jboss.resteasy.client.jaxrs;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.TrustManager;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
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.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine;
import org.jboss.resteasy.client.jaxrs.engines.PassthroughTrustManager;
import org.jboss.resteasy.client.jaxrs.engines.factory.ApacheHttpClient4EngineFactory;

import java.io.IOException;
import java.security.SecureRandom;


/**
* A temporary class for transition between Apache pre-4.3 apis and 4.3.
* Must maintain support for HttpClient creation in ResteasyClientBuilder
* and creation of HttpClient that refs 4.3 classes not available in pre-4.3.
* This usage allows pre-4.3 resteasy tests to continue to run successful.
*
* User: rsearls
* Date: 5/24/16
*/
public class HttpClientBuilder43 {

/**
* Create ClientHttpEngine using Apache 4.3.x+ apis.
* @return
*/
protected static ClientHttpEngine initDefaultEngine43(final ResteasyClientBuilder that)
{
HttpClient httpClient = null;

HostnameVerifier verifier = null;
if (that.verifier != null) {
verifier = new ResteasyClientBuilder.VerifierWrapper(that.verifier);
}
else
{
switch (that.policy)
{
case ANY:
verifier = new NoopHostnameVerifier();
break;
case WILDCARD:
verifier = new DefaultHostnameVerifier();
break;
case STRICT:
verifier = new DefaultHostnameVerifier();
break;
}
}
try
{
SSLConnectionSocketFactory sslsf = null;
SSLContext theContext = that.sslContext;
if (that.disableTrustManager)
{
theContext = SSLContext.getInstance("SSL");
theContext.init(null, new TrustManager[]{new PassthroughTrustManager()},
new SecureRandom());
verifier = new NoopHostnameVerifier();
sslsf = new SSLConnectionSocketFactory(theContext, verifier);
}
else if (theContext != null)
{
sslsf = new SSLConnectionSocketFactory(theContext, verifier);
}
else if (that.clientKeyStore != null || that.truststore != null)
{
SSLContext ctx = SSLContexts.custom()
.useProtocol(SSLConnectionSocketFactory.TLS)
.setSecureRandom(null)
.loadKeyMaterial(that.clientKeyStore,
that.clientPrivateKeyPassword != null ? that.clientPrivateKeyPassword.toCharArray() : null)
.loadTrustMaterial(that.truststore, TrustSelfSignedStrategy.INSTANCE)
.build();
sslsf = new SSLConnectionSocketFactory(ctx, verifier);
}
else
{
final SSLContext tlsContext = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
tlsContext.init(null, null, null);
sslsf = new SSLConnectionSocketFactory(tlsContext, verifier);
}

final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslsf)
.build();

HttpClientConnectionManager cm = null;
if (that.connectionPoolSize > 0)
{
PoolingHttpClientConnectionManager tcm = new PoolingHttpClientConnectionManager(
registry, null, null ,null, that.connectionTTL, that.connectionTTLUnit);
tcm.setMaxTotal(that.connectionPoolSize);
if (that.maxPooledPerRoute == 0) {
that.maxPooledPerRoute = that.connectionPoolSize;
}
tcm.setDefaultMaxPerRoute(that.maxPooledPerRoute);
cm = tcm;

}
else
{
cm = new BasicHttpClientConnectionManager(registry);
}

RequestConfig.Builder rcBuilder = RequestConfig.custom();
if (that.socketTimeout > -1)
{
rcBuilder.setSocketTimeout((int) that.socketTimeoutUnits.toMillis(that.socketTimeout));
}
if (that.establishConnectionTimeout > -1)
{
rcBuilder.setConnectTimeout((int)that.establishConnectionTimeoutUnits.toMillis(that.establishConnectionTimeout));
}
if (that.connectionCheckoutTimeoutMs > -1)
{
rcBuilder.setConnectionRequestTimeout(that.connectionCheckoutTimeoutMs);
}

httpClient = HttpClientBuilder.create()
.setConnectionManager(cm)
.setDefaultRequestConfig(rcBuilder.build())
.setProxy(that.defaultProxy)
.disableContentCompression()
.build();
ApacheHttpClient43Engine engine =
(ApacheHttpClient43Engine) ApacheHttpClient4EngineFactory.create(httpClient, true);
engine.setResponseBufferSize(that.responseBufferSize);
engine.setHostnameVerifier(verifier);
// this may be null. We can't really support this with Apache Client.
engine.setSslContext(theContext);
return engine;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.jboss.resteasy.client.jaxrs;

import org.apache.http.HttpHost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
Expand All @@ -10,14 +12,14 @@
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.StrictHostnameVerifier;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.HttpHost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.BasicClientConnectionManager;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine;
import org.jboss.resteasy.client.jaxrs.engines.PassthroughTrustManager;
import org.jboss.resteasy.client.jaxrs.engines.factory.ApacheHttpClient4EngineFactory;
import org.jboss.resteasy.client.jaxrs.i18n.Messages;
import org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration;
import org.jboss.resteasy.client.jaxrs.internal.LocalResteasyProviderFactory;
Expand All @@ -27,17 +29,19 @@
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.Configuration;

import java.io.IOException;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
Expand Down Expand Up @@ -68,6 +72,17 @@ public static enum HostnameVerificationPolicy
STRICT
}

private static final boolean useOldHTTPClient = Boolean.getBoolean("org.jboss.resteasy.client.useOldHTTPClient");
private static final boolean newHTTPClientAvailable;
static {
boolean res = true;
try {
Class.forName(HttpClientBuilder43.class.getName());
} catch (Throwable t) {
res = false;
}
newHTTPClientAvailable = res;
}
protected KeyStore truststore;
protected KeyStore clientKeyStore;
protected String clientPrivateKeyPassword;
Expand Down Expand Up @@ -144,7 +159,7 @@ public ResteasyClientBuilder connectionTTL(long ttl, TimeUnit unit)
}

/**
* Socket inactivity timeout
* The timeout for waiting for data. A timeout value of zero is interpreted as an infinite timeout
*
* @param timeout
* @param unit
Expand Down Expand Up @@ -342,9 +357,37 @@ protected ResteasyProviderFactory getProviderFactory()
return providerFactory;
}

@Deprecated
public ResteasyClient buildOld()
{
ClientConfiguration config = new ClientConfiguration(getProviderFactory());
for (Map.Entry<String, Object> entry : properties.entrySet())
{
config.property(entry.getKey(), entry.getValue());
}

ExecutorService executor = asyncExecutor;

if (executor == null)
{
cleanupExecutor = true;
executor = Executors.newFixedThreadPool(10);
}

ClientHttpEngine engine = httpEngine;
if (engine == null) {
engine = initDefaultEngine();
}
return new ResteasyClient(engine, executor, cleanupExecutor, config);

}

@Override
public ResteasyClient build()
{
if (useOldHTTPClient || !newHTTPClientAvailable) {
return buildOld();
}
ClientConfiguration config = new ClientConfiguration(getProviderFactory());
for (Map.Entry<String, Object> entry : properties.entrySet())
{
Expand All @@ -360,7 +403,9 @@ public ResteasyClient build()
}

ClientHttpEngine engine = httpEngine;
if (engine == null) engine = initDefaultEngine();
if (engine == null) {
engine = HttpClientBuilder43.initDefaultEngine43(this);
}
return new ResteasyClient(engine, executor, cleanupExecutor, config);

}
Expand Down Expand Up @@ -480,13 +525,14 @@ else if (clientKeyStore != null || truststore != null)
{
HttpClientParams.setConnectionManagerTimeout(params, connectionCheckoutTimeoutMs);
}
params.setParameter(ConnRoutePNames.DEFAULT_PROXY, defaultProxy);
httpClient = new DefaultHttpClient(cm, params);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient, true);
ApacheHttpClient4Engine engine =
(ApacheHttpClient4Engine) ApacheHttpClient4EngineFactory.create(httpClient, true);
engine.setResponseBufferSize(responseBufferSize);
engine.setHostnameVerifier(verifier);
// this may be null. We can't really support this with Apache Client.
engine.setSslContext(theContext);
engine.setDefaultProxy(defaultProxy);
return engine;
}
catch (Exception e)
Expand Down Expand Up @@ -568,6 +614,7 @@ public ResteasyClientBuilder register(Object component, Map<Class<?>, Integer> c
public ResteasyClientBuilder withConfig(Configuration config)
{
providerFactory = new LocalResteasyProviderFactory(new ResteasyProviderFactory());
// return to original above rls //providerFactory = new ResteasyProviderFactory();
providerFactory.setProperties(config.getProperties());
for (Class clazz : config.getClasses())
{
Expand Down

0 comments on commit c4b3697

Please sign in to comment.