diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 721a6707..bff41c9d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -59,9 +59,9 @@ jobs:
if: matrix.jdk == '8' && github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/development'
run: mvn checkstyle::check
- - name: Deploy
- if: matrix.jdk == '8' && github.event_name == 'push' && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/development'
- run: mvn --batch-mode deploy -P test
+# - name: Deploy
+# if: matrix.jdk == '8' && github.event_name == 'push' && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/development'
+# run: mvn --batch-mode deploy -P test
- name: SonarQube Scan (Push)
if: matrix.jdk == '11' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/development')
diff --git a/client/pom.xml b/client/pom.xml
index 5310cfea..88ad8875 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -5,9 +5,9 @@
Use {@link ProxyConfiguration)} instead. * * @param proxyHost location of the proxy * @return this builder */ + @Deprecated public Builder proxyHost(String proxyHost) { _proxyHost = proxyHost; return this; @@ -771,32 +766,29 @@ public Builder proxyHost(String proxyHost) { /** * The port of the proxy. Default is -1. + * @deprecated + * This method is deprecated. + *
Use {@link ProxyConfiguration)} instead. * * @param proxyPort port for the proxy * @return this builder */ + @Deprecated public Builder proxyPort(int proxyPort) { _proxyPort = proxyPort; return this; } - /** - * The http scheme of the proxy. Default is http. - * - * @param proxyScheme protocol for the proxy - * @return this builder - */ - public Builder proxyScheme(String proxyScheme) { - _proxyScheme = proxyScheme; - return this; - } - /** * Set the username for authentication against the proxy (if proxy settings are enabled). (Optional). + * @deprecated + * This method is deprecated. + *
Use {@link ProxyConfiguration)} instead.
*
* @param proxyUsername
* @return this builder
*/
+ @Deprecated
public Builder proxyUsername(String proxyUsername) {
_proxyUsername = proxyUsername;
return this;
@@ -813,25 +805,14 @@ public Builder proxyPassword(String proxyPassword) {
return this;
}
- /**
- * Set the token for authentication against the proxy (if proxy settings are enabled). (Optional).
- *
- * @param proxyCredentialsProvider
- * @return this builder
- */
- public Builder proxyCredentialsProvider(ProxyCredentialsProvider proxyCredentialsProvider) {
- _proxyCredentialsProvider = proxyCredentialsProvider;
- return this;
- }
-
/**
* Set the mtls authentication against the proxy (if proxy settings are enabled). (Optional).
*
- * @param proxyMtlsAuth
+ * @param proxyConfiguration
* @return this builder
*/
- public Builder proxyMtlsAuth(ProxyMTLSAuth proxyMtlsAuth) {
- _proxyMtlsAuth = proxyMtlsAuth;
+ public Builder proxyConfiguration(ProxyConfiguration proxyConfiguration) {
+ _proxyConfiguration = proxyConfiguration;
return this;
}
@@ -847,7 +828,7 @@ public Builder disableDestroyOnShutDown() {
HttpHost proxy() {
if (_proxyPort != -1) {
- return new HttpHost(_proxyScheme, _proxyHost, _proxyPort);
+ return new HttpHost(_proxyHost, _proxyPort);
}
// Default is no proxy.
return null;
@@ -986,7 +967,7 @@ public Builder operationMode(OperationMode mode) {
/**
*
- * @param storage mode
+ * @param mode
* @return this builder
*/
public Builder storageMode(StorageMode mode) {
@@ -1156,31 +1137,16 @@ private void verifyAlternativeClient() {
}
private void verifyProxy() {
- if (_proxyPort == -1) {
+ if (_proxyConfiguration == null)
return;
- }
- if (!(_proxyScheme.equals(HttpScheme.HTTP) || _proxyScheme.equals(HttpScheme.HTTPS))) {
+ if (!(_proxyConfiguration.getHost().getSchemeName().equals(HttpScheme.HTTP) ||
+ _proxyConfiguration.getHost().getSchemeName().equals(HttpScheme.HTTPS))) {
throw new IllegalArgumentException("Proxy scheme must be either http or https.");
}
- if (_proxyUsername == null && _proxyCredentialsProvider == null && _proxyMtlsAuth == null) {
- return;
- }
-
- if (_proxyUsername != null && _proxyCredentialsProvider != null) {
- throw new IllegalArgumentException("Proxy user and Proxy token params are updated, set only one param.");
- }
-
- if (_proxyUsername != null && _proxyMtlsAuth != null) {
- throw new IllegalArgumentException("Proxy user and Proxy mTLS params are updated, set only one param.");
- }
-
- if (_proxyCredentialsProvider != null && _proxyMtlsAuth != null) {
- throw new IllegalArgumentException("Proxy token and Proxy mTLS params are updated, set only one param.");
- }
-
- if (_proxyMtlsAuth != null && (_proxyMtlsAuth.getP12File() == null || _proxyMtlsAuth.getP12FilePassKey() == null)) {
+ if ((_proxyConfiguration.getP12File() != null && _proxyConfiguration.getPassKey() == null) ||
+ (_proxyConfiguration.getP12File() == null && _proxyConfiguration.getPassKey() != null)) {
throw new IllegalArgumentException("Proxy mTLS must have p12 file path and name, and pass phrase.");
}
}
@@ -1224,8 +1190,7 @@ public SplitClientConfig build() {
proxy(),
_proxyUsername,
_proxyPassword,
- _proxyCredentialsProvider,
- _proxyMtlsAuth,
+ _proxyConfiguration,
_eventsQueueSize,
_eventSendIntervalInMillis,
_maxStringLength,
diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java
index 6e9d9913..e3badac7 100644
--- a/client/src/main/java/io/split/client/SplitFactoryImpl.java
+++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java
@@ -1,6 +1,7 @@
package io.split.client;
import com.google.common.io.Files;
+import io.split.client.dtos.BearerCredentialsProvider;
import io.split.client.dtos.Metadata;
import io.split.client.events.EventsSender;
import io.split.client.events.EventsStorage;
@@ -105,6 +106,7 @@
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
+import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.http.ssl.TLS;
import org.apache.hc.core5.ssl.SSLContexts;
@@ -551,7 +553,7 @@ protected static SplitHttpClient buildSplitHttpClient(String apiToken, SplitClie
.addResponseInterceptorLast((new GzipDecoderResponseInterceptor()));
// Set up proxy is it exists
- if (config.proxy() != null) {
+ if (config.proxy() != null || config.proxyConfiguration() != null) {
httpClientbuilder = setupProxy(httpClientbuilder, config);
}
@@ -590,7 +592,7 @@ private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitCli
.addRequestInterceptorLast(ClientKeyInterceptorFilter.instance(apiToken));
// Set up proxy is it exists
- if (config.proxy() != null) {
+ if (config.proxy() != null || config.proxyConfiguration() != null) {
httpClientbuilder = setupProxy(httpClientbuilder, config);
}
@@ -599,15 +601,15 @@ private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitCli
private static SSLContext buildSSLContext(SplitClientConfig config) throws IOException, NullPointerException {
SSLContext sslContext;
- if (config.proxyMTLSAuth() != null) {
+ if (config.proxyConfiguration() != null && config.proxyConfiguration().getP12File() != null) {
_log.debug("Proxy setup using mTLS");
InputStream keystoreStream = null;
try {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
- keystoreStream = java.nio.file.Files.newInputStream(Paths.get(config.proxyMTLSAuth().getP12File()));
- keyStore.load(keystoreStream, config.proxyMTLSAuth().getP12FilePassKey().toCharArray());
+ keystoreStream = java.nio.file.Files.newInputStream(Paths.get(config.proxyConfiguration().getP12File()));
+ keyStore.load(keystoreStream, config.proxyConfiguration().getPassKey().toCharArray());
sslContext = SSLContexts.custom()
- .loadKeyMaterial(keyStore, config.proxyMTLSAuth().getP12FilePassKey().toCharArray())
+ .loadKeyMaterial(keyStore, config.proxyConfiguration().getPassKey().toCharArray())
.build();
} catch (Exception e) {
_log.error("Exception caught while processing p12 file for Proxy mTLS auth: ", e);
@@ -626,22 +628,46 @@ private static SSLContext buildSSLContext(SplitClientConfig config) throws IOExc
private static HttpClientBuilder setupProxy(HttpClientBuilder httpClientbuilder, SplitClientConfig config) {
_log.info("Initializing Split SDK with proxy settings");
- DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(config.proxy());
+ HttpHost proxyHost;
+ if (config.proxyConfiguration() != null && config.proxyConfiguration().getHost() != null) {
+ proxyHost = config.proxyConfiguration().getHost();
+ } else {
+ _log.warn("`proxyHost`, `proxyPort` configuration methods are deprecated. Please use `ProxyConfiguration` builder instead.");
+ proxyHost = config.proxy();
+ }
+ DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyHost);
httpClientbuilder.setRoutePlanner(routePlanner);
- if (config.proxyUsername() != null && config.proxyPassword() != null) {
+ if ((config.proxyUsername() != null && config.proxyPassword() != null) ||
+ (config.proxyConfiguration() != null && config.proxyConfiguration().getProxyCredentialsProvider() != null &&
+ config.proxyConfiguration().getProxyCredentialsProvider() instanceof io.split.client.dtos.BasicCredentialsProvider)) {
_log.debug("Proxy setup using credentials");
+ String userName;
+ String password;
+ if (config.proxyUsername() == null && config.proxyPassword() == null) {
+ io.split.client.dtos.BasicCredentialsProvider basicAuth =
+ (io.split.client.dtos.BasicCredentialsProvider) config.proxyConfiguration().getProxyCredentialsProvider();
+ userName = basicAuth.getUsername();
+ password = basicAuth.getPassword();
+ } else {
+ _log.warn("`proxyUsername` and `proxyPassword` configuration methods are deprecated. " +
+ "Please use `ProxyConfiguration` builder instead.");
+ userName = config.proxyUsername();
+ password = config.proxyPassword();
+ }
BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
- AuthScope siteScope = new AuthScope(config.proxy().getHostName(), config.proxy().getPort());
- Credentials siteCreds = new UsernamePasswordCredentials(config.proxyUsername(),
- config.proxyPassword().toCharArray());
+ AuthScope siteScope = new AuthScope(proxyHost.getHostName(), proxyHost.getPort());
+ Credentials siteCreds = new UsernamePasswordCredentials(userName,
+ password.toCharArray());
credsProvider.setCredentials(siteScope, siteCreds);
httpClientbuilder.setDefaultCredentialsProvider(credsProvider);
}
- if (config.proxyCredentialsProvider() != null) {
- _log.debug("Proxy setup using token");
- httpClientbuilder.setDefaultCredentialsProvider(new HttpClientDynamicCredentials(config.proxyCredentialsProvider()));
+ if (config.proxyConfiguration() != null &&
+ config.proxyConfiguration().getProxyCredentialsProvider() instanceof io.split.client.dtos.BearerCredentialsProvider) {
+ _log.debug("Proxy setup using Bearer token");
+ httpClientbuilder.setDefaultCredentialsProvider(new HttpClientDynamicCredentials(
+ (BearerCredentialsProvider) config.proxyConfiguration().getProxyCredentialsProvider()));
}
return httpClientbuilder;
diff --git a/client/src/main/java/io/split/client/dtos/BasicCredentialsProvider.java b/client/src/main/java/io/split/client/dtos/BasicCredentialsProvider.java
new file mode 100644
index 00000000..b77c9f59
--- /dev/null
+++ b/client/src/main/java/io/split/client/dtos/BasicCredentialsProvider.java
@@ -0,0 +1,7 @@
+package io.split.client.dtos;
+
+public interface BasicCredentialsProvider extends ProxyCredentialsProvider
+{
+ String getUsername();
+ String getPassword();
+}
diff --git a/client/src/main/java/io/split/client/dtos/BearerCredentialsProvider.java b/client/src/main/java/io/split/client/dtos/BearerCredentialsProvider.java
new file mode 100644
index 00000000..d4e98c5f
--- /dev/null
+++ b/client/src/main/java/io/split/client/dtos/BearerCredentialsProvider.java
@@ -0,0 +1,6 @@
+package io.split.client.dtos;
+
+public interface BearerCredentialsProvider extends ProxyCredentialsProvider
+{
+ String getToken();
+}
diff --git a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java
new file mode 100644
index 00000000..93d58c4c
--- /dev/null
+++ b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java
@@ -0,0 +1,65 @@
+package io.split.client.dtos;
+
+import org.apache.hc.core5.http.HttpHost;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class ProxyConfiguration {
+ private final HttpHost _proxyHost;
+ private ProxyCredentialsProvider _provider;
+ private final String _p12File;
+ private final String _passKey;
+
+ private ProxyConfiguration(HttpHost proxyHost,
+ ProxyCredentialsProvider proxyCredentialsProvider,
+ String p12File, String passKey) {
+ _proxyHost = proxyHost;
+ _p12File = p12File;
+ _passKey = passKey;
+ _provider = proxyCredentialsProvider;
+ }
+
+ public HttpHost getHost() { return _proxyHost; }
+ public String getP12File() { return _p12File; }
+ public String getPassKey() { return _passKey; }
+ public ProxyCredentialsProvider getProxyCredentialsProvider() { return _provider; }
+
+ public static ProxyConfiguration.Builder builder() {
+ return new ProxyConfiguration.Builder();
+ }
+
+ public static class Builder {
+ private ProxyCredentialsProvider _provider;
+ private HttpHost _proxyHost;
+ private String _p12File;
+ private String _passKey;
+
+ public ProxyConfiguration.Builder credentialsProvider(ProxyCredentialsProvider provider) {
+ _provider = provider;
+ return this;
+ }
+
+ public ProxyConfiguration.Builder url(URL url) throws MalformedURLException {
+ try {
+ _proxyHost = new HttpHost(url.getProtocol(), url.getHost(), url.getPort());
+ } catch (Exception exc) {
+ throw new MalformedURLException("Proxy configuration is invalid. The proxy `url` is malformed");
+ }
+ return this;
+ }
+
+ public ProxyConfiguration.Builder mtls(String p12File, String passKey) {
+ _passKey = passKey;
+ _p12File = p12File;
+ return this;
+ }
+
+ public ProxyConfiguration build() {
+ if (_proxyHost == null) {
+ throw new IllegalArgumentException("Proxy configuration is invalid. The proxy `url` was not provided");
+ }
+ return new ProxyConfiguration(_proxyHost, _provider, _p12File, _passKey);
+ }
+ }
+}
\ No newline at end of file
diff --git a/client/src/main/java/io/split/client/dtos/ProxyCredentialsProvider.java b/client/src/main/java/io/split/client/dtos/ProxyCredentialsProvider.java
new file mode 100644
index 00000000..e1653d5f
--- /dev/null
+++ b/client/src/main/java/io/split/client/dtos/ProxyCredentialsProvider.java
@@ -0,0 +1,4 @@
+package io.split.client.dtos;
+
+public interface ProxyCredentialsProvider
+{}
diff --git a/client/src/main/java/io/split/client/dtos/ProxyMTLSAuth.java b/client/src/main/java/io/split/client/dtos/ProxyMTLSAuth.java
deleted file mode 100644
index 5cca5abd..00000000
--- a/client/src/main/java/io/split/client/dtos/ProxyMTLSAuth.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.split.client.dtos;
-
-public class ProxyMTLSAuth {
- private final String _proxyP12File;
- private final String _proxyP12FilePassKey;
-
- private ProxyMTLSAuth(String proxyP12File, String proxyP12FilePassKey) {
- _proxyP12File = proxyP12File;
- _proxyP12FilePassKey = proxyP12FilePassKey;
- }
-
- public String getP12File() { return _proxyP12File; }
-
- public String getP12FilePassKey() { return _proxyP12FilePassKey; }
-
- public static ProxyMTLSAuth.Builder builder() {
- return new ProxyMTLSAuth.Builder();
- }
-
- public static class Builder {
- private String _p12File;
- private String _p12FilePassKey;
-
- public ProxyMTLSAuth.Builder proxyP12File(String p12File) {
- _p12File = p12File;
- return this;
- }
-
- public ProxyMTLSAuth.Builder proxyP12FilePassKey(String p12FilePassKey) {
- _p12FilePassKey = p12FilePassKey;
- return this;
- }
-
- public ProxyMTLSAuth build() {
- return new ProxyMTLSAuth(_p12File, _p12FilePassKey);
- }
- }
-}
\ No newline at end of file
diff --git a/client/src/test/java/io/split/client/SplitClientConfigTest.java b/client/src/test/java/io/split/client/SplitClientConfigTest.java
index 81ad9913..8330f13a 100644
--- a/client/src/test/java/io/split/client/SplitClientConfigTest.java
+++ b/client/src/test/java/io/split/client/SplitClientConfigTest.java
@@ -1,7 +1,9 @@
package io.split.client;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import io.split.client.dtos.ProxyMTLSAuth;
+import io.split.client.dtos.BasicCredentialsProvider;
+import io.split.client.dtos.BearerCredentialsProvider;
+import io.split.client.dtos.ProxyConfiguration;
import io.split.client.impressions.Impression;
import io.split.client.impressions.ImpressionListener;
import io.split.client.impressions.ImpressionsManager;
@@ -11,6 +13,8 @@
import org.junit.Test;
import org.mockito.Mockito;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -256,116 +260,104 @@ public Map