mirror of https://github.com/apache/jclouds.git
Issue 342: tests that guarantee we know if an http engine supports untrusted certs
This commit is contained in:
parent
dc3e326493
commit
ec1160f2a7
|
@ -19,32 +19,13 @@
|
||||||
|
|
||||||
package org.jclouds.http.config;
|
package org.jclouds.http.config;
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
import javax.net.ssl.HostnameVerifier;
|
|
||||||
import javax.net.ssl.SSLContext;
|
|
||||||
import javax.net.ssl.SSLSession;
|
|
||||||
import javax.net.ssl.TrustManager;
|
|
||||||
import javax.net.ssl.X509TrustManager;
|
|
||||||
|
|
||||||
import org.jclouds.http.HttpCommandExecutorService;
|
import org.jclouds.http.HttpCommandExecutorService;
|
||||||
import org.jclouds.http.TransformingHttpCommandExecutorService;
|
import org.jclouds.http.TransformingHttpCommandExecutorService;
|
||||||
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
|
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
|
||||||
import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService;
|
import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService;
|
||||||
import org.jclouds.logging.Logger;
|
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
|
||||||
import com.google.common.base.Throwables;
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Scopes;
|
import com.google.inject.Scopes;
|
||||||
import com.google.inject.TypeLiteral;
|
|
||||||
import com.google.inject.name.Names;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures {@link JavaUrlHttpCommandExecutorService}.
|
* Configures {@link JavaUrlHttpCommandExecutorService}.
|
||||||
|
@ -58,80 +39,10 @@ public class JavaUrlHttpCommandExecutorServiceModule extends AbstractModule {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
bindClient();
|
install(new SSLModule());
|
||||||
}
|
|
||||||
|
|
||||||
protected void bindClient() {
|
|
||||||
bind(HttpCommandExecutorService.class).to(JavaUrlHttpCommandExecutorService.class).in(Scopes.SINGLETON);
|
bind(HttpCommandExecutorService.class).to(JavaUrlHttpCommandExecutorService.class).in(Scopes.SINGLETON);
|
||||||
bind(HostnameVerifier.class).to(LogToMapHostnameVerifier.class);
|
|
||||||
bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class).in(
|
bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class).in(
|
||||||
Scopes.SINGLETON);
|
Scopes.SINGLETON);
|
||||||
bind(new TypeLiteral<Supplier<SSLContext>>() {
|
|
||||||
}).annotatedWith(Names.named("untrusted")).to(new TypeLiteral<UntrustedSSLContextSupplier>() {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Used to get more information about HTTPS hostname wrong errors.
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
@Singleton
|
|
||||||
static class LogToMapHostnameVerifier implements HostnameVerifier {
|
|
||||||
@Resource
|
|
||||||
private Logger logger = Logger.NULL;
|
|
||||||
private final Map<String, String> sslMap = Maps.newHashMap();;
|
|
||||||
|
|
||||||
public boolean verify(String hostname, SSLSession session) {
|
|
||||||
logger.warn("hostname was %s while session was %s", hostname, session.getPeerHost());
|
|
||||||
sslMap.put(hostname, session.getPeerHost());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
public static class UntrustedSSLContextSupplier implements Supplier<SSLContext> {
|
|
||||||
private final TrustAllCerts trustAllCerts;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
UntrustedSSLContextSupplier(TrustAllCerts trustAllCerts) {
|
|
||||||
this.trustAllCerts = trustAllCerts;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SSLContext get() {
|
|
||||||
try {
|
|
||||||
SSLContext sc;
|
|
||||||
sc = SSLContext.getInstance("SSL");
|
|
||||||
sc.init(null, new TrustManager[] { trustAllCerts }, new SecureRandom());
|
|
||||||
return sc;
|
|
||||||
} catch (Exception e) {
|
|
||||||
Throwables.propagate(e);
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Used to trust all certs
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
@Singleton
|
|
||||||
static class TrustAllCerts implements X509TrustManager {
|
|
||||||
public X509Certificate[] getAcceptedIssuers() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkClientTrusted(X509Certificate[] certs, String authType) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkServerTrusted(X509Certificate[] certs, String authType) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.http.config;
|
||||||
|
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
import javax.net.ssl.HostnameVerifier;
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import javax.net.ssl.SSLSession;
|
||||||
|
import javax.net.ssl.TrustManager;
|
||||||
|
import javax.net.ssl.X509TrustManager;
|
||||||
|
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
import com.google.inject.name.Names;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class SSLModule extends AbstractModule {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(HostnameVerifier.class).annotatedWith(Names.named("untrusted")).to(LogToMapHostnameVerifier.class);
|
||||||
|
bind(new TypeLiteral<Supplier<SSLContext>>() {
|
||||||
|
}).annotatedWith(Names.named("untrusted")).to(new TypeLiteral<UntrustedSSLContextSupplier>() {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Used to get more information about HTTPS hostname wrong errors.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
static class LogToMapHostnameVerifier implements HostnameVerifier {
|
||||||
|
@Resource
|
||||||
|
private Logger logger = Logger.NULL;
|
||||||
|
private final Map<String, String> sslMap = Maps.newHashMap();;
|
||||||
|
|
||||||
|
public boolean verify(String hostname, SSLSession session) {
|
||||||
|
logger.warn("hostname was %s while session was %s", hostname, session.getPeerHost());
|
||||||
|
sslMap.put(hostname, session.getPeerHost());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
public static class UntrustedSSLContextSupplier implements Supplier<SSLContext> {
|
||||||
|
private final TrustAllCerts trustAllCerts;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
UntrustedSSLContextSupplier(TrustAllCerts trustAllCerts) {
|
||||||
|
this.trustAllCerts = trustAllCerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SSLContext get() {
|
||||||
|
try {
|
||||||
|
SSLContext sc;
|
||||||
|
sc = SSLContext.getInstance("SSL");
|
||||||
|
sc.init(null, new TrustManager[] { trustAllCerts }, new SecureRandom());
|
||||||
|
return sc;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Throwables.propagate(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Used to trust all certs
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
static class TrustAllCerts implements X509TrustManager {
|
||||||
|
public X509Certificate[] getAcceptedIssuers() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkClientTrusted(X509Certificate[] certs, String authType) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkServerTrusted(X509Certificate[] certs, String authType) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -87,7 +87,7 @@ public class JavaUrlHttpCommandExecutorService extends BaseHttpCommandExecutorSe
|
||||||
public JavaUrlHttpCommandExecutorService(HttpUtils utils,
|
public JavaUrlHttpCommandExecutorService(HttpUtils utils,
|
||||||
@Named(Constants.PROPERTY_IO_WORKER_THREADS) ExecutorService ioWorkerExecutor,
|
@Named(Constants.PROPERTY_IO_WORKER_THREADS) ExecutorService ioWorkerExecutor,
|
||||||
DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
|
DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
|
||||||
DelegatingErrorHandler errorHandler, HttpWire wire, HostnameVerifier verifier,
|
DelegatingErrorHandler errorHandler, HttpWire wire, @Named("untrusted") HostnameVerifier verifier,
|
||||||
@Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider) throws SecurityException,
|
@Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider) throws SecurityException,
|
||||||
NoSuchFieldException {
|
NoSuchFieldException {
|
||||||
super(utils, ioWorkerExecutor, retryHandler, ioRetryHandler, errorHandler, wire);
|
super(utils, ioWorkerExecutor, retryHandler, ioRetryHandler, errorHandler, wire);
|
||||||
|
|
|
@ -44,15 +44,18 @@ import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.jclouds.Constants;
|
||||||
import org.jclouds.crypto.CryptoStreams;
|
import org.jclouds.crypto.CryptoStreams;
|
||||||
import org.jclouds.io.InputSuppliers;
|
import org.jclouds.io.InputSuppliers;
|
||||||
import org.jclouds.rest.RestContext;
|
import org.jclouds.rest.RestContext;
|
||||||
import org.jclouds.rest.RestContextBuilder;
|
import org.jclouds.rest.RestContextBuilder;
|
||||||
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
||||||
|
import org.mortbay.jetty.Connector;
|
||||||
import org.mortbay.jetty.Handler;
|
import org.mortbay.jetty.Handler;
|
||||||
import org.mortbay.jetty.Request;
|
import org.mortbay.jetty.Request;
|
||||||
import org.mortbay.jetty.Server;
|
import org.mortbay.jetty.Server;
|
||||||
import org.mortbay.jetty.handler.AbstractHandler;
|
import org.mortbay.jetty.handler.AbstractHandler;
|
||||||
|
import org.mortbay.jetty.ssl.SslSocketConnector;
|
||||||
import org.testng.annotations.AfterTest;
|
import org.testng.annotations.AfterTest;
|
||||||
import org.testng.annotations.BeforeTest;
|
import org.testng.annotations.BeforeTest;
|
||||||
import org.testng.annotations.Optional;
|
import org.testng.annotations.Optional;
|
||||||
|
@ -101,7 +104,7 @@ public abstract class BaseJettyTest {
|
||||||
response.setContentType("text/xml");
|
response.setContentType("text/xml");
|
||||||
response.setStatus(HttpServletResponse.SC_OK);
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
} else if (target.indexOf("redirect") > 0) {
|
} else if (target.indexOf("redirect") > 0) {
|
||||||
response.sendRedirect("http://localhost:" + (testPort + 1) + "/");
|
response.sendRedirect("https://localhost:" + (testPort + 1) + "/");
|
||||||
} else if (target.indexOf("101constitutions") > 0) {
|
} else if (target.indexOf("101constitutions") > 0) {
|
||||||
response.setContentType("text/plain");
|
response.setContentType("text/plain");
|
||||||
response.setHeader("Content-MD5", md5);
|
response.setHeader("Content-MD5", md5);
|
||||||
|
@ -164,6 +167,18 @@ public abstract class BaseJettyTest {
|
||||||
server.setHandler(server1Handler);
|
server.setHandler(server1Handler);
|
||||||
server.start();
|
server.start();
|
||||||
|
|
||||||
|
setupAndStartSSLServer(testPort);
|
||||||
|
|
||||||
|
Properties properties = new Properties();
|
||||||
|
addConnectionProperties(properties);
|
||||||
|
context = newBuilder(testPort, properties, createConnectionModule()).buildContext();
|
||||||
|
client = context.getApi();
|
||||||
|
assert client != null;
|
||||||
|
|
||||||
|
assert client.newStringBuffer() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupAndStartSSLServer(final int testPort) throws Exception {
|
||||||
Handler server2Handler = new AbstractHandler() {
|
Handler server2Handler = new AbstractHandler() {
|
||||||
public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
|
public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
|
||||||
throws IOException, ServletException {
|
throws IOException, ServletException {
|
||||||
|
@ -206,17 +221,17 @@ public abstract class BaseJettyTest {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
server2 = new Server(testPort + 1);
|
server2 = new Server();
|
||||||
server2.setHandler(server2Handler);
|
server2.setHandler(server2Handler);
|
||||||
|
SslSocketConnector ssl = new SslSocketConnector();
|
||||||
|
ssl.setPort(testPort + 1);
|
||||||
|
ssl.setMaxIdleTime(30000);
|
||||||
|
ssl.setKeystore("src/test/resources/test.jks");
|
||||||
|
ssl.setKeyPassword("jclouds");
|
||||||
|
ssl.setTruststore("src/test/resources/test.jks");
|
||||||
|
ssl.setTrustPassword("jclouds");
|
||||||
|
server2.setConnectors(new Connector[] { ssl });
|
||||||
server2.start();
|
server2.start();
|
||||||
|
|
||||||
Properties properties = new Properties();
|
|
||||||
addConnectionProperties(properties);
|
|
||||||
context = newBuilder(testPort, properties, createConnectionModule()).buildContext();
|
|
||||||
client = context.getApi();
|
|
||||||
assert client != null;
|
|
||||||
|
|
||||||
assert client.newStringBuffer() != null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -234,17 +249,18 @@ public abstract class BaseJettyTest {
|
||||||
|
|
||||||
public static RestContextBuilder<IntegrationTestClient, IntegrationTestAsyncClient> newBuilder(int testPort,
|
public static RestContextBuilder<IntegrationTestClient, IntegrationTestAsyncClient> newBuilder(int testPort,
|
||||||
Properties properties, Module... connectionModules) {
|
Properties properties, Module... connectionModules) {
|
||||||
|
properties.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
|
||||||
|
properties.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
|
||||||
ContextSpec<IntegrationTestClient, IntegrationTestAsyncClient> contextSpec = contextSpec("test",
|
ContextSpec<IntegrationTestClient, IntegrationTestAsyncClient> contextSpec = contextSpec("test",
|
||||||
"http://localhost:" + testPort, "1", "identity", null, IntegrationTestClient.class,
|
"http://localhost:" + testPort, "1", "identity", null, IntegrationTestClient.class,
|
||||||
IntegrationTestAsyncClient.class, ImmutableSet.<Module> copyOf(connectionModules));
|
IntegrationTestAsyncClient.class, ImmutableSet.<Module> copyOf(connectionModules));
|
||||||
|
|
||||||
return createContextBuilder(contextSpec, properties);
|
return createContextBuilder(contextSpec, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterTest
|
@AfterTest
|
||||||
public void tearDownJetty() throws Exception {
|
public void tearDownJetty() throws Exception {
|
||||||
context.close();
|
context.close();
|
||||||
|
if (server2 != null)
|
||||||
server2.stop();
|
server2.stop();
|
||||||
server.stop();
|
server.stop();
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
|
@ -25,6 +25,7 @@ import java.net.ProxySelector;
|
||||||
import java.security.KeyManagementException;
|
import java.security.KeyManagementException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
import javax.inject.Named;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
|
@ -53,8 +54,10 @@ import org.jclouds.http.TransformingHttpCommandExecutorService;
|
||||||
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
|
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
|
||||||
import org.jclouds.http.apachehc.ApacheHCHttpCommandExecutorService;
|
import org.jclouds.http.apachehc.ApacheHCHttpCommandExecutorService;
|
||||||
import org.jclouds.http.config.ConfiguresHttpCommandExecutorService;
|
import org.jclouds.http.config.ConfiguresHttpCommandExecutorService;
|
||||||
|
import org.jclouds.http.config.SSLModule;
|
||||||
import org.jclouds.lifecycle.Closer;
|
import org.jclouds.lifecycle.Closer;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import com.google.inject.Scopes;
|
import com.google.inject.Scopes;
|
||||||
|
@ -72,6 +75,7 @@ public class ApacheHCHttpCommandExecutorServiceModule extends AbstractModule {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
|
install(new SSLModule());
|
||||||
bindClient();
|
bindClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,14 +84,12 @@ public class ApacheHCHttpCommandExecutorServiceModule extends AbstractModule {
|
||||||
HttpParams newBasicHttpParams(HttpUtils utils) {
|
HttpParams newBasicHttpParams(HttpUtils utils) {
|
||||||
BasicHttpParams params = new BasicHttpParams();
|
BasicHttpParams params = new BasicHttpParams();
|
||||||
|
|
||||||
params.setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
|
params.setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024).setBooleanParameter(
|
||||||
.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, true)
|
CoreConnectionPNames.STALE_CONNECTION_CHECK, true).setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,
|
||||||
.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true).setParameter(
|
true).setParameter(CoreProtocolPNames.ORIGIN_SERVER, "jclouds/1.0");
|
||||||
CoreProtocolPNames.ORIGIN_SERVER, "jclouds/1.0");
|
|
||||||
|
|
||||||
if (utils.getConnectionTimeout() > 0) {
|
if (utils.getConnectionTimeout() > 0) {
|
||||||
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, utils
|
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, utils.getConnectionTimeout());
|
||||||
.getConnectionTimeout());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (utils.getSocketOpenTimeout() > 0) {
|
if (utils.getSocketOpenTimeout() > 0) {
|
||||||
|
@ -114,17 +116,26 @@ public class ApacheHCHttpCommandExecutorServiceModule extends AbstractModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
ClientConnectionManager newClientConnectionManager(HttpParams params,
|
SSLContext newSSLSocketFactory(HttpUtils utils, @Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider)
|
||||||
X509HostnameVerifier verifier, Closer closer) throws NoSuchAlgorithmException,
|
throws NoSuchAlgorithmException, KeyManagementException {
|
||||||
KeyManagementException {
|
if (utils.trustAllCerts())
|
||||||
|
return untrustedSSLContextProvider.get();
|
||||||
|
SSLContext context = SSLContext.getInstance("TLS");
|
||||||
|
|
||||||
|
context.init(null, null, null);
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Provides
|
||||||
|
ClientConnectionManager newClientConnectionManager(HttpParams params, X509HostnameVerifier verifier,
|
||||||
|
SSLContext context, Closer closer) throws NoSuchAlgorithmException, KeyManagementException {
|
||||||
|
|
||||||
SchemeRegistry schemeRegistry = new SchemeRegistry();
|
SchemeRegistry schemeRegistry = new SchemeRegistry();
|
||||||
|
|
||||||
Scheme http = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80);
|
Scheme http = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80);
|
||||||
SSLContext context = SSLContext.getInstance("TLS");
|
|
||||||
|
|
||||||
context.init(null, null, null);
|
|
||||||
SSLSocketFactory sf = new SSLSocketFactory(context);
|
SSLSocketFactory sf = new SSLSocketFactory(context);
|
||||||
|
|
||||||
sf.setHostnameVerifier(verifier);
|
sf.setHostnameVerifier(verifier);
|
||||||
|
|
||||||
Scheme https = new Scheme("https", sf, 443);
|
Scheme https = new Scheme("https", sf, 443);
|
||||||
|
@ -134,7 +145,7 @@ public class ApacheHCHttpCommandExecutorServiceModule extends AbstractModule {
|
||||||
sr.register(https);
|
sr.register(https);
|
||||||
|
|
||||||
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
|
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
|
||||||
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
|
schemeRegistry.register(new Scheme("https", sf, 443));
|
||||||
final ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
|
final ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
|
||||||
closer.addToClose(new Closeable() {
|
closer.addToClose(new Closeable() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -147,23 +158,21 @@ public class ApacheHCHttpCommandExecutorServiceModule extends AbstractModule {
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
HttpClient newDefaultHttpClient(HttpUtils utils, BasicHttpParams params,
|
HttpClient newDefaultHttpClient(HttpUtils utils, BasicHttpParams params, ClientConnectionManager cm) {
|
||||||
ClientConnectionManager cm) {
|
|
||||||
DefaultHttpClient client = new DefaultHttpClient(cm, params);
|
DefaultHttpClient client = new DefaultHttpClient(cm, params);
|
||||||
if (utils.useSystemProxies()) {
|
if (utils.useSystemProxies()) {
|
||||||
ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(client
|
ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(client.getConnectionManager()
|
||||||
.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());
|
.getSchemeRegistry(), ProxySelector.getDefault());
|
||||||
client.setRoutePlanner(routePlanner);
|
client.setRoutePlanner(routePlanner);
|
||||||
}
|
}
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void bindClient() {
|
protected void bindClient() {
|
||||||
bind(HttpCommandExecutorService.class).to(ApacheHCHttpCommandExecutorService.class).in(
|
bind(HttpCommandExecutorService.class).to(ApacheHCHttpCommandExecutorService.class).in(Scopes.SINGLETON);
|
||||||
|
|
||||||
|
bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class).in(
|
||||||
Scopes.SINGLETON);
|
Scopes.SINGLETON);
|
||||||
|
|
||||||
bind(TransformingHttpCommandExecutorService.class).to(
|
|
||||||
TransformingHttpCommandExecutorServiceImpl.class).in(Scopes.SINGLETON);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -24,6 +24,7 @@ import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.lang.reflect.UndeclaredThrowableException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -31,6 +32,9 @@ import java.util.Properties;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.jclouds.concurrent.Futures;
|
import org.jclouds.concurrent.Futures;
|
||||||
import org.jclouds.concurrent.MoreExecutors;
|
import org.jclouds.concurrent.MoreExecutors;
|
||||||
import org.jclouds.concurrent.SingleThreaded;
|
import org.jclouds.concurrent.SingleThreaded;
|
||||||
|
@ -65,6 +69,14 @@ import com.google.inject.Module;
|
||||||
public class AsyncGaeHttpCommandExecutorServiceIntegrationTest extends BaseHttpCommandExecutorServiceIntegrationTest {
|
public class AsyncGaeHttpCommandExecutorServiceIntegrationTest extends BaseHttpCommandExecutorServiceIntegrationTest {
|
||||||
Logger logger = Logger.CONSOLE;
|
Logger logger = Logger.CONSOLE;
|
||||||
|
|
||||||
|
protected void setupAndStartSSLServer(final int testPort) throws Exception {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean redirectEveryTwentyRequests(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws IOException {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Test(enabled = false)
|
@Test(enabled = false)
|
||||||
public void testPerformanceVsNothing() {
|
public void testPerformanceVsNothing() {
|
||||||
setupApiProxy();
|
setupApiProxy();
|
||||||
|
@ -231,8 +243,9 @@ public class AsyncGaeHttpCommandExecutorServiceIntegrationTest extends BaseHttpC
|
||||||
super.testGetStringSynch(path);
|
super.testGetStringSynch(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// local env does not support snakeoil certs
|
||||||
@Override
|
@Override
|
||||||
@Test(enabled = true, invocationCount = 5, timeOut = 3000)
|
@Test(enabled = true, expectedExceptions = UndeclaredThrowableException.class)
|
||||||
public void testGetStringRedirect() throws MalformedURLException, ExecutionException, InterruptedException,
|
public void testGetStringRedirect() throws MalformedURLException, ExecutionException, InterruptedException,
|
||||||
TimeoutException {
|
TimeoutException {
|
||||||
setupApiProxy();
|
setupApiProxy();
|
||||||
|
@ -278,7 +291,7 @@ public class AsyncGaeHttpCommandExecutorServiceIntegrationTest extends BaseHttpC
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Test(enabled = true, invocationCount = 5, timeOut = 3000)
|
@Test(enabled = true, expectedExceptions = UndeclaredThrowableException.class)
|
||||||
public void testPutRedirect() throws MalformedURLException, ExecutionException, InterruptedException,
|
public void testPutRedirect() throws MalformedURLException, ExecutionException, InterruptedException,
|
||||||
TimeoutException {
|
TimeoutException {
|
||||||
setupApiProxy();
|
setupApiProxy();
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,109 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (C) 2009 Cloud Conscious, LLC.
|
||||||
|
<info@cloudconscious.com>
|
||||||
|
|
||||||
|
====================================================================
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0 Unless required by
|
||||||
|
applicable law or agreed to in writing, software distributed
|
||||||
|
under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions
|
||||||
|
and limitations under the License.
|
||||||
|
====================================================================
|
||||||
|
-->
|
||||||
|
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
For more configuration infromation and examples see the Apache
|
||||||
|
Log4j website: http://logging.apache.org/log4j/
|
||||||
|
-->
|
||||||
|
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
|
||||||
|
debug="false">
|
||||||
|
|
||||||
|
<!-- A time/date based rolling appender -->
|
||||||
|
<appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
|
||||||
|
<param name="File" value="target/test-data/jclouds-wire.log" />
|
||||||
|
<param name="Append" value="true" />
|
||||||
|
|
||||||
|
<!-- Rollover at midnight each day -->
|
||||||
|
<param name="DatePattern" value="'.'yyyy-MM-dd" />
|
||||||
|
|
||||||
|
<param name="Threshold" value="TRACE" />
|
||||||
|
|
||||||
|
<layout class="org.apache.log4j.PatternLayout">
|
||||||
|
<!-- The default pattern: Date Priority [Category] Message\n -->
|
||||||
|
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The full pattern: Date MS Priority [Category]
|
||||||
|
(Thread:NDC) Message\n <param name="ConversionPattern"
|
||||||
|
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
|
||||||
|
-->
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- A time/date based rolling appender -->
|
||||||
|
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
|
||||||
|
<param name="File" value="target/test-data/jclouds.log" />
|
||||||
|
<param name="Append" value="true" />
|
||||||
|
|
||||||
|
<!-- Rollover at midnight each day -->
|
||||||
|
<param name="DatePattern" value="'.'yyyy-MM-dd" />
|
||||||
|
|
||||||
|
<param name="Threshold" value="TRACE" />
|
||||||
|
|
||||||
|
<layout class="org.apache.log4j.PatternLayout">
|
||||||
|
<!-- The default pattern: Date Priority [Category] Message\n -->
|
||||||
|
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The full pattern: Date MS Priority [Category]
|
||||||
|
(Thread:NDC) Message\n <param name="ConversionPattern"
|
||||||
|
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
|
||||||
|
-->
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
|
||||||
|
<appender-ref ref="WIREFILE" />
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- ================ -->
|
||||||
|
<!-- Limit categories -->
|
||||||
|
<!-- ================ -->
|
||||||
|
|
||||||
|
<category name="org.jclouds">
|
||||||
|
<priority value="DEBUG" />
|
||||||
|
<appender-ref ref="ASYNC" />
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<category name="jclouds.headers">
|
||||||
|
<priority value="DEBUG" />
|
||||||
|
<appender-ref ref="ASYNCWIRE" />
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<category name="jclouds.wire">
|
||||||
|
<priority value="DEBUG" />
|
||||||
|
<appender-ref ref="ASYNCWIRE" />
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<!-- ======================= -->
|
||||||
|
<!-- Setup the Root category -->
|
||||||
|
<!-- ======================= -->
|
||||||
|
|
||||||
|
<root>
|
||||||
|
<priority value="WARN" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</log4j:configuration>
|
Loading…
Reference in New Issue