diff --git a/core/src/main/java/org/jclouds/Constants.java b/core/src/main/java/org/jclouds/Constants.java index 6c2143f589..b952fee4e2 100644 --- a/core/src/main/java/org/jclouds/Constants.java +++ b/core/src/main/java/org/jclouds/Constants.java @@ -375,6 +375,14 @@ public final class Constants { * Default value: 2 minutes. */ public static final String PROPERTY_MAX_RATE_LIMIT_WAIT = "jclouds.max-ratelimit-wait"; + + /** + * Boolean property. + *
+ * When true, the proxy server type is HTTPS i.e HTTP and SSL + * + */ + public static final String PROPERTY_PROXY_ENABLE_SSL_PROXY = "jclouds.enable-ssl-proxy"; private Constants() { throw new AssertionError("intentionally unimplemented"); diff --git a/core/src/main/java/org/jclouds/proxy/internal/GuiceProxyConfig.java b/core/src/main/java/org/jclouds/proxy/internal/GuiceProxyConfig.java index bc20f7a4b9..86121b2966 100644 --- a/core/src/main/java/org/jclouds/proxy/internal/GuiceProxyConfig.java +++ b/core/src/main/java/org/jclouds/proxy/internal/GuiceProxyConfig.java @@ -24,6 +24,7 @@ import static org.jclouds.Constants.PROPERTY_PROXY_PORT; import static org.jclouds.Constants.PROPERTY_PROXY_SYSTEM; import static org.jclouds.Constants.PROPERTY_PROXY_TYPE; import static org.jclouds.Constants.PROPERTY_PROXY_USER; +import static org.jclouds.Constants.PROPERTY_PROXY_ENABLE_SSL_PROXY; import java.net.Proxy; import java.net.Proxy.Type; @@ -69,6 +70,9 @@ public class GuiceProxyConfig implements ProxyConfig { @Inject(optional = true) @Named(PROPERTY_PROXY_TYPE) private Proxy.Type type = Proxy.Type.HTTP; + @Inject(optional = true) + @Named(PROPERTY_PROXY_ENABLE_SSL_PROXY) + private Boolean sslProxyEnabled = false; @Override public Optional+ * Note: + * {@link okhttp3.OkHttpClient.Builder#sslSocketFactory(javax.net.ssl.SSLSocketFactory)} + * method deprecated. + * + *
+ * Note: {@link okhttp3.OkHttpClient.Builder#socketFactory(SocketFactory)} + * method doesn't accept {@code javax.net.ssl.SSLSocketFactory.getDefault()} at + * runtime, throws {@code java.lang.IllegalArgumentException}. + * + */ +public class DelegatingSocketFactory extends SocketFactory { + private final SocketFactory delegate; + + public DelegatingSocketFactory(SocketFactory delegate) { + this.delegate = delegate; + } + + @Override + public Socket createSocket() throws IOException { + Socket socket = delegate.createSocket(); + return configureSocket(socket); + } + + @Override + public Socket createSocket(String host, int port) throws IOException { + Socket socket = delegate.createSocket(host, port); + return configureSocket(socket); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException { + Socket socket = delegate.createSocket(host, port, localAddress, localPort); + return configureSocket(socket); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + Socket socket = delegate.createSocket(host, port); + return configureSocket(socket); + } + + @Override + public Socket createSocket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException { + Socket socket = delegate.createSocket(host, port, localAddress, localPort); + return configureSocket(socket); + } + + protected Socket configureSocket(Socket socket) throws IOException { + // No-op by default. + return socket; + } +} diff --git a/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java b/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java index d3144de57f..c9167028ea 100644 --- a/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java +++ b/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java @@ -31,6 +31,7 @@ import java.util.Map; import javax.annotation.Nullable; import javax.inject.Named; +import javax.net.ssl.SSLSocketFactory; import okhttp3.Authenticator; import okhttp3.Credentials; @@ -197,6 +198,10 @@ public final class OkHttpCommandExecutorService extends BaseHttpCommandExecutorS }; okHttpClientBuilder.proxyAuthenticator(proxyAuthenticator); } + + if (proxyConfig.isSslProxyEnabled()) { + okHttpClientBuilder.socketFactory(new DelegatingSocketFactory(SSLSocketFactory.getDefault())); + } OkHttpClient requestScopedClient = okHttpClientBuilder.build(); Response response = requestScopedClient.newCall(nativeRequest).execute();