From a5e4dc183c2c68b47d9387c8284263d47ca80c68 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 16 Jul 2025 16:46:46 -0700 Subject: [PATCH 1/9] Added new proxy config params --- client/pom.xml | 4 +- .../client/HttpClientDynamicCredentials.java | 9 +- .../client/ProxyCredentialsProvider.java | 10 -- .../io/split/client/SplitClientConfig.java | 95 ++++-------- .../io/split/client/SplitFactoryImpl.java | 51 +++++-- .../client/dtos/BasicCredentialsProvider.java | 7 + .../dtos/BearerCredentialsProvider.java | 6 + .../split/client/dtos/ProxyConfiguration.java | 57 +++++++ .../client/dtos/ProxyCredentialsProvider.java | 4 + .../io/split/client/dtos/ProxyMTLSAuth.java | 38 ----- .../split/client/SplitClientConfigTest.java | 139 +++++++----------- .../io/split/client/SplitFactoryImplTest.java | 71 ++++++--- okhttp-modules/pom.xml | 4 +- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 2 +- 17 files changed, 264 insertions(+), 239 deletions(-) delete mode 100644 client/src/main/java/io/split/client/ProxyCredentialsProvider.java create mode 100644 client/src/main/java/io/split/client/dtos/BasicCredentialsProvider.java create mode 100644 client/src/main/java/io/split/client/dtos/BearerCredentialsProvider.java create mode 100644 client/src/main/java/io/split/client/dtos/ProxyConfiguration.java create mode 100644 client/src/main/java/io/split/client/dtos/ProxyCredentialsProvider.java delete mode 100644 client/src/main/java/io/split/client/dtos/ProxyMTLSAuth.java 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 @@ io.split.client java-client-parent - 4.17.0-rc2 + 4.17.0-rc3 - 4.17.0-rc2 + 4.17.0-rc3 java-client jar Java Client diff --git a/client/src/main/java/io/split/client/HttpClientDynamicCredentials.java b/client/src/main/java/io/split/client/HttpClientDynamicCredentials.java index 01a32362..ebcbe667 100644 --- a/client/src/main/java/io/split/client/HttpClientDynamicCredentials.java +++ b/client/src/main/java/io/split/client/HttpClientDynamicCredentials.java @@ -1,5 +1,6 @@ package io.split.client; +import io.split.client.dtos.BearerCredentialsProvider; import org.apache.hc.client5.http.auth.AuthScope; import org.apache.hc.client5.http.auth.BearerToken; import org.apache.hc.client5.http.auth.Credentials; @@ -7,10 +8,10 @@ class HttpClientDynamicCredentials implements org.apache.hc.client5.http.auth.CredentialsProvider { - private final ProxyCredentialsProvider _proxyCredentialsProvider; + private final BearerCredentialsProvider _bearerCredentialsProvider; - public HttpClientDynamicCredentials (ProxyCredentialsProvider proxyCredentialsProvider) { - _proxyCredentialsProvider = proxyCredentialsProvider; + public HttpClientDynamicCredentials (BearerCredentialsProvider bearerCredentialsProvider) { + _bearerCredentialsProvider = bearerCredentialsProvider; } @Override @@ -18,7 +19,7 @@ public Credentials getCredentials(AuthScope authScope, HttpContext context) { // This Provider is invoked every time a request is made. // This should invoke a user-custom provider responsible for: - return new BearerToken(_proxyCredentialsProvider.getJwtToken()); + return new BearerToken(_bearerCredentialsProvider.getToken()); } } diff --git a/client/src/main/java/io/split/client/ProxyCredentialsProvider.java b/client/src/main/java/io/split/client/ProxyCredentialsProvider.java deleted file mode 100644 index 6fb595bc..00000000 --- a/client/src/main/java/io/split/client/ProxyCredentialsProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.split.client; - -public interface ProxyCredentialsProvider -{ - /** - * Get the additional headers needed for all http operations - * @return HashMap of addition headers - */ - String getJwtToken(); -} diff --git a/client/src/main/java/io/split/client/SplitClientConfig.java b/client/src/main/java/io/split/client/SplitClientConfig.java index d314baa7..eb612951 100644 --- a/client/src/main/java/io/split/client/SplitClientConfig.java +++ b/client/src/main/java/io/split/client/SplitClientConfig.java @@ -1,6 +1,6 @@ package io.split.client; -import io.split.client.dtos.ProxyMTLSAuth; +import io.split.client.dtos.ProxyConfiguration; import io.split.client.impressions.ImpressionListener; import io.split.client.impressions.ImpressionsManager; import io.split.client.utils.FileTypeEnum; @@ -91,11 +91,10 @@ private HttpScheme() { private final ThreadFactory _threadFactory; // Proxy configs + private final ProxyConfiguration _proxyConfiguration; private final HttpHost _proxy; private final String _proxyUsername; private final String _proxyPassword; - private final ProxyCredentialsProvider _proxyCredentialsProvider; - private final ProxyMTLSAuth _proxyMtlsAuth; // To be set during startup public static String splitSdkVersion; @@ -129,8 +128,7 @@ private SplitClientConfig(String endpoint, HttpHost proxy, String proxyUsername, String proxyPassword, - ProxyCredentialsProvider proxyCredentialsProvider, - ProxyMTLSAuth proxyMtlsAuth, + ProxyConfiguration proxyConfiguration, int eventsQueueSize, long eventSendIntervalInMillis, int maxStringLength, @@ -184,8 +182,7 @@ private SplitClientConfig(String endpoint, _proxy = proxy; _proxyUsername = proxyUsername; _proxyPassword = proxyPassword; - _proxyCredentialsProvider = proxyCredentialsProvider; - _proxyMtlsAuth = proxyMtlsAuth; + _proxyConfiguration = proxyConfiguration; _eventsQueueSize = eventsQueueSize; _eventSendIntervalInMillis = eventSendIntervalInMillis; _maxStringLength = maxStringLength; @@ -317,12 +314,8 @@ public String proxyPassword() { return _proxyPassword; } - public ProxyCredentialsProvider proxyCredentialsProvider() { - return _proxyCredentialsProvider; - } - - public ProxyMTLSAuth proxyMTLSAuth() { - return _proxyMtlsAuth; + public ProxyConfiguration proxyConfiguration() { + return _proxyConfiguration; } public long eventSendIntervalInMillis() { @@ -463,11 +456,9 @@ public static final class Builder { private int _waitBeforeShutdown = 5000; private String _proxyHost = "localhost"; private int _proxyPort = -1; - private String _proxyScheme = HttpScheme.HTTP; private String _proxyUsername; private String _proxyPassword; - private ProxyCredentialsProvider _proxyCredentialsProvider; - private ProxyMTLSAuth _proxyMtlsAuth; + private ProxyConfiguration _proxyConfiguration; private int _eventsQueueSize = 500; private long _eventSendIntervalInMillis = 30 * (long)1000; private int _maxStringLength = 250; @@ -760,10 +751,14 @@ public Builder waitBeforeShutdown(int waitTime) { /** * The host location of the proxy. Default is localhost. + * @deprecated + * This method is deprecated. + *

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..95a84cd7 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,43 @@ 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 { + 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) { + userName = config.proxyUsername(); + password = config.proxyPassword(); + } else { + io.split.client.dtos.BasicCredentialsProvider basicAuth = + (io.split.client.dtos.BasicCredentialsProvider) config.proxyConfiguration().getProxyCredentialsProvider(); + userName = basicAuth.getUsername(); + password = basicAuth.getPassword(); + } 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..f48a8c1c --- /dev/null +++ b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java @@ -0,0 +1,57 @@ +package io.split.client.dtos; + +import org.apache.hc.core5.http.HttpHost; + +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) { + _proxyHost = new HttpHost(url.getProtocol(), url.getHost(), url.getPort()); + return this; + } + + public ProxyConfiguration.Builder mtls(String p12File, String passKey) { + _passKey = passKey; + _p12File = p12File; + return this; + } + + public ProxyConfiguration build() { + 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..ce25746a 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,87 @@ public Map> getHeaderOverrides(RequestContext context) { } @Test - public void checkProxyParams() { + public void checkProxyParams() throws MalformedURLException { SplitClientConfig config = SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888).build(); - Assert.assertEquals("proxy-host", config.proxy().getHostName()); - Assert.assertEquals(8888, config.proxy().getPort()); + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("https://proxy-host:8888")) + .build()) + .build(); + Assert.assertEquals("proxy-host", config.proxyConfiguration().getHost().getHostName()); + Assert.assertEquals(8888, config.proxyConfiguration().getHost().getPort()); + Assert.assertEquals("https", config.proxyConfiguration().getHost().getSchemeName()); config = SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyScheme(SplitClientConfig.HttpScheme.HTTPS) - .proxyUsername("user") - .proxyPassword("pass") + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("https://proxy-host:888")) + .credentialsProvider(new io.split.client.dtos.BasicCredentialsProvider() { + @Override + public String getUsername() { + return "user"; + } + + @Override + public String getPassword() { + return "pass"; + } + }) + .build()) .build(); - Assert.assertEquals("user", config.proxyUsername()); - Assert.assertEquals("pass", config.proxyPassword()); + io.split.client.dtos.BasicCredentialsProvider basicAuth = (io.split.client.dtos.BasicCredentialsProvider) config.proxyConfiguration().getProxyCredentialsProvider(); + Assert.assertEquals("user", basicAuth.getUsername()); + Assert.assertEquals("pass", basicAuth.getPassword()); - ProxyCredentialsProvider proxyCredentialsProvider = new ProxyCredentialsProvider() { + io.split.client.dtos.BearerCredentialsProvider bearerCredentialsProvider = new io.split.client.dtos.BearerCredentialsProvider() { @Override - public String getJwtToken() { + public String getToken() { return "my-token"; } }; config = SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyCredentialsProvider(proxyCredentialsProvider) + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("https://proxy-host:888")) + .credentialsProvider(bearerCredentialsProvider) + .build()) .build(); - Assert.assertEquals(proxyCredentialsProvider, config.proxyCredentialsProvider()); + Assert.assertEquals(bearerCredentialsProvider, config.proxyConfiguration().getProxyCredentialsProvider()); config = SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyMtlsAuth(new ProxyMTLSAuth.Builder().proxyP12File("path/to/file").proxyP12FilePassKey("pass-key").build()) - .build(); - Assert.assertEquals("path/to/file", config.proxyMTLSAuth().getP12File()); - Assert.assertEquals("pass-key", config.proxyMTLSAuth().getP12FilePassKey()); - } - - @Test(expected = IllegalArgumentException.class) - public void cannotUseInvalidHttpScheme() { - SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyScheme("ftp") - .build(); - } - - @Test(expected = IllegalArgumentException.class) - public void cannotUseProxyTokenAndProxyUsername() { - ProxyCredentialsProvider proxyCredentialsProvider = new ProxyCredentialsProvider() { - @Override - public String getJwtToken() { - return "my-token"; - } - }; - - SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyUsername("user") - .proxyPassword("pass") - .proxyCredentialsProvider(proxyCredentialsProvider) - .build(); - } - - @Test(expected = IllegalArgumentException.class) - public void cannotUseProxyUserAndProxyMtls() { - SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyUsername("user") - .proxyPassword("pass") - .proxyMtlsAuth(new ProxyMTLSAuth.Builder().proxyP12File("path/to/file").proxyP12FilePassKey("pass-key").build()) + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("https://proxy-host:888")) + .mtls("path/to/file", "pass-key") + .build()) .build(); + Assert.assertEquals("path/to/file", config.proxyConfiguration().getP12File()); + Assert.assertEquals("pass-key", config.proxyConfiguration().getPassKey()); } @Test(expected = IllegalArgumentException.class) - public void cannotUseProxyTokenAndProxyMtls() { - ProxyCredentialsProvider proxyCredentialsProvider = new ProxyCredentialsProvider() { - @Override - public String getJwtToken() { - return "my-token"; - } - }; - + public void cannotUseInvalidHttpScheme() throws MalformedURLException { SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyCredentialsProvider(proxyCredentialsProvider) - .proxyMtlsAuth(new ProxyMTLSAuth.Builder().proxyP12File("path/to/file").proxyP12FilePassKey("pass-key").build()) + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("ftp://proxy-host:888")) + .build()) .build(); } @Test(expected = IllegalArgumentException.class) - public void mustUseP12FileWithProxyMtls() { + public void mustUseP12FileWithProxyMtls() throws MalformedURLException { SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyMtlsAuth(new ProxyMTLSAuth.Builder().proxyP12FilePassKey("pass-key").build()) + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("https://proxy-host:888")) + .mtls(null, "pass-key") + .build()) .build(); } @Test(expected = IllegalArgumentException.class) - public void mustUseP12PassKeyWithProxyMtls() { + public void mustUseP12PassKeyWithProxyMtls() throws MalformedURLException { SplitClientConfig.builder() - .proxyHost("proxy-host") - .proxyPort(8888) - .proxyMtlsAuth(new ProxyMTLSAuth.Builder().proxyP12File("path/to/file").build()) + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("https://proxy-host:888")) + .mtls("path/to/file", null) + .build()) .build(); } } \ No newline at end of file diff --git a/client/src/test/java/io/split/client/SplitFactoryImplTest.java b/client/src/test/java/io/split/client/SplitFactoryImplTest.java index 1214b246..a8b3f10c 100644 --- a/client/src/test/java/io/split/client/SplitFactoryImplTest.java +++ b/client/src/test/java/io/split/client/SplitFactoryImplTest.java @@ -1,6 +1,7 @@ package io.split.client; -import io.split.client.dtos.ProxyMTLSAuth; +import io.split.client.dtos.BearerCredentialsProvider; +import io.split.client.dtos.ProxyConfiguration; import io.split.client.impressions.ImpressionsManager; import io.split.client.utils.FileTypeEnum; import io.split.integrations.IntegrationsConfig; @@ -33,6 +34,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.URISyntaxException; +import java.net.URL; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -97,8 +99,40 @@ public void testFactoryInstantiationIntegrationsConfig() throws Exception { assertNotNull(splitFactory.manager()); } + @Test + public void testFactoryInstantiationWithLegacyProxy() throws Exception { + SplitClientConfig splitClientConfig = SplitClientConfig.builder() + .enableDebug() + .impressionsMode(ImpressionsManager.Mode.DEBUG) + .impressionsRefreshRate(1) + .endpoint(ENDPOINT, EVENTS_ENDPOINT) + .telemetryURL(SplitClientConfig.TELEMETRY_ENDPOINT) + .authServiceURL(AUTH_SERVICE) + .setBlockUntilReadyTimeout(1000) + .proxyPort(8888) + .proxyHost("proxy-host") + .proxyUsername("user") + .proxyPassword("pass") + .build(); + SplitFactoryImpl splitFactory = new SplitFactoryImpl(API_KEY, splitClientConfig); + assertNotNull(splitFactory.client()); + + splitFactory.destroy(); + } + @Test public void testFactoryInstantiationWithProxyCredentials() throws Exception { + class MyBearerCredentialsProvider implements io.split.client.dtos.BasicCredentialsProvider { + @Override + public String getUsername() { + return "test"; + } + @Override + public String getPassword() { + return "password"; + } + }; + SplitClientConfig splitClientConfig = SplitClientConfig.builder() .enableDebug() .impressionsMode(ImpressionsManager.Mode.DEBUG) @@ -107,10 +141,10 @@ public void testFactoryInstantiationWithProxyCredentials() throws Exception { .telemetryURL(SplitClientConfig.TELEMETRY_ENDPOINT) .authServiceURL(AUTH_SERVICE) .setBlockUntilReadyTimeout(1000) - .proxyPort(6060) - .proxyUsername("test") - .proxyPassword("password") - .proxyHost(ENDPOINT) + .proxyConfiguration(ProxyConfiguration.builder() + .url(new URL("http://proxy-name:6060")) + .credentialsProvider(new MyBearerCredentialsProvider()) + .build()) .build(); SplitFactoryImpl splitFactory = new SplitFactoryImpl(API_KEY, splitClientConfig); assertNotNull(splitFactory.client()); @@ -133,7 +167,7 @@ public void testFactoryInstantiationWithProxyCredentials() throws Exception { HttpHost proxy = (HttpHost) proxyField.get(routePlanner); Assert.assertEquals("http", proxy.getSchemeName()); - Assert.assertEquals(ENDPOINT, proxy.getHostName()); + Assert.assertEquals("proxy-name", proxy.getHostName()); Assert.assertEquals(6060, proxy.getPort()); Field credentialsProviderField = InternalHttp.getDeclaredField("credentialsProvider"); @@ -152,9 +186,9 @@ public void testFactoryInstantiationWithProxyCredentials() throws Exception { @Test public void testFactoryInstantiationWithProxyToken() throws Exception { - class MyProxyCredentialsProvider implements ProxyCredentialsProvider { + class MyBearerCredentialsProvider implements io.split.client.dtos.BearerCredentialsProvider { @Override - public String getJwtToken() { + public String getToken() { return "123456789"; } }; @@ -167,9 +201,10 @@ public String getJwtToken() { .telemetryURL(SplitClientConfig.TELEMETRY_ENDPOINT) .authServiceURL(AUTH_SERVICE) .setBlockUntilReadyTimeout(1000) - .proxyPort(6060) - .proxyCredentialsProvider(new MyProxyCredentialsProvider()) - .proxyHost(ENDPOINT) + .proxyConfiguration(ProxyConfiguration.builder() + .url(new URL("http://proxy-name:6060")) + .credentialsProvider(new MyBearerCredentialsProvider()) + .build()) .build(); SplitFactoryImpl splitFactory2 = new SplitFactoryImpl(API_KEY, splitClientConfig); assertNotNull(splitFactory2.client()); @@ -187,11 +222,11 @@ public String getJwtToken() { credentialsProviderField2.setAccessible(true); HttpClientDynamicCredentials credentialsProvider2 = (HttpClientDynamicCredentials) credentialsProviderField2.get(InternalHttp2.cast(httpClientField2.get(client2))); - Field proxyRuntimeField = HttpClientDynamicCredentials.class.getDeclaredField("_proxyCredentialsProvider"); + Field proxyRuntimeField = HttpClientDynamicCredentials.class.getDeclaredField("_bearerCredentialsProvider"); proxyRuntimeField.setAccessible(true); - MyProxyCredentialsProvider proxyRuntime = (MyProxyCredentialsProvider) proxyRuntimeField.get(credentialsProvider2); + MyBearerCredentialsProvider proxyRuntime = (MyBearerCredentialsProvider) proxyRuntimeField.get(credentialsProvider2); - assertNotNull("123456789", proxyRuntime.getJwtToken()); + assertNotNull("123456789", proxyRuntime.getToken()); splitFactory2.destroy(); } @@ -206,10 +241,10 @@ public void testFactoryInstantiationWithProxyMtls() throws Exception { .telemetryURL(SplitClientConfig.TELEMETRY_ENDPOINT) .authServiceURL(AUTH_SERVICE) .setBlockUntilReadyTimeout(1000) - .proxyPort(6060) - .proxyScheme("https") - .proxyMtlsAuth(new ProxyMTLSAuth.Builder().proxyP12File("src/test/resources/keyStore.p12").proxyP12FilePassKey("split").build()) - .proxyHost(ENDPOINT) + .proxyConfiguration(ProxyConfiguration.builder() + .url(new URL("http://proxy-name:6060")) + .mtls("src/test/resources/keyStore.p12", "split") + .build()) .build(); SplitFactoryImpl splitFactory3 = new SplitFactoryImpl(API_KEY, splitClientConfig); assertNotNull(splitFactory3.client()); diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index ff0bac2e..0dfc2529 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.17.0-rc2 + 4.17.0-rc3 4.0.0 - 4.17.0-rc2 + 4.17.0-rc3 okhttp-modules jar http-modules diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index 0353d0c5..3a908213 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.17.0-rc2 + 4.17.0-rc3 2.1.0 diff --git a/pom.xml b/pom.xml index cabb7d91..6f01df05 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.17.0-rc2 + 4.17.0-rc3 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index 0da0c71f..b65a1984 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.17.0-rc2 + 4.17.0-rc3 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index f7316b7b..f32fa9b3 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,7 +5,7 @@ io.split.client java-client-parent - 4.17.0-rc2 + 4.17.0-rc3 java-client-testing jar From 741e23d167c465b72a92f5329b4a0c1959394c1e Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 16 Jul 2025 16:51:20 -0700 Subject: [PATCH 2/9] revert version back --- client/pom.xml | 4 ++-- okhttp-modules/pom.xml | 4 ++-- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 88ad8875..5310cfea 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,9 +5,9 @@ io.split.client java-client-parent - 4.17.0-rc3 + 4.17.0-rc2 - 4.17.0-rc3 + 4.17.0-rc2 java-client jar Java Client diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index 0dfc2529..ff0bac2e 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.17.0-rc3 + 4.17.0-rc2 4.0.0 - 4.17.0-rc3 + 4.17.0-rc2 okhttp-modules jar http-modules diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index 3a908213..0353d0c5 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.17.0-rc3 + 4.17.0-rc2 2.1.0 diff --git a/pom.xml b/pom.xml index 6f01df05..cabb7d91 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.17.0-rc3 + 4.17.0-rc2 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index b65a1984..0da0c71f 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.17.0-rc3 + 4.17.0-rc2 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index f32fa9b3..f7316b7b 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,7 +5,7 @@ io.split.client java-client-parent - 4.17.0-rc3 + 4.17.0-rc2 java-client-testing jar From 9c11e854a69a5be68a4522af71ba424d6f9b3bc3 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 17 Jul 2025 11:56:08 -0700 Subject: [PATCH 3/9] Updated pom and proxy config --- .../io/split/client/dtos/ProxyConfiguration.java | 9 +++++++-- .../io/split/client/SplitClientConfigTest.java | 9 +++++++++ .../io/split/client/SplitFactoryImplTest.java | 1 - pom.xml | 16 ---------------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java index f48a8c1c..049afb8d 100644 --- a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java +++ b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java @@ -2,6 +2,7 @@ import org.apache.hc.core5.http.HttpHost; +import java.net.MalformedURLException; import java.net.URL; public class ProxyConfiguration { @@ -39,8 +40,12 @@ public ProxyConfiguration.Builder credentialsProvider(ProxyCredentialsProvider p return this; } - public ProxyConfiguration.Builder url(URL url) { - _proxyHost = new HttpHost(url.getProtocol(), url.getHost(), url.getPort()); + public ProxyConfiguration.Builder url(URL url) throws MalformedURLException { + try { + _proxyHost = new HttpHost(url.getProtocol(), url.getHost(), url.getPort()); + } catch (Exception exc) { + throw new MalformedURLException("roxy configuration is ignored. The proxy `url` was not provided or is malformed"); + } return this; } diff --git a/client/src/test/java/io/split/client/SplitClientConfigTest.java b/client/src/test/java/io/split/client/SplitClientConfigTest.java index ce25746a..4f166a73 100644 --- a/client/src/test/java/io/split/client/SplitClientConfigTest.java +++ b/client/src/test/java/io/split/client/SplitClientConfigTest.java @@ -324,6 +324,15 @@ public void cannotUseInvalidHttpScheme() throws MalformedURLException { .build(); } + @Test(expected = MalformedURLException.class) + public void cannotUseInvalidUrl() throws MalformedURLException { + SplitClientConfig.builder() + .proxyConfiguration(new ProxyConfiguration.Builder() + .url(new URL("")) + .build()) + .build(); + } + @Test(expected = IllegalArgumentException.class) public void mustUseP12FileWithProxyMtls() throws MalformedURLException { SplitClientConfig.builder() diff --git a/client/src/test/java/io/split/client/SplitFactoryImplTest.java b/client/src/test/java/io/split/client/SplitFactoryImplTest.java index a8b3f10c..222ddc82 100644 --- a/client/src/test/java/io/split/client/SplitFactoryImplTest.java +++ b/client/src/test/java/io/split/client/SplitFactoryImplTest.java @@ -1,6 +1,5 @@ package io.split.client; -import io.split.client.dtos.BearerCredentialsProvider; import io.split.client.dtos.ProxyConfiguration; import io.split.client.impressions.ImpressionsManager; import io.split.client.utils.FileTypeEnum; diff --git a/pom.xml b/pom.xml index cabb7d91..b1c91c81 100644 --- a/pom.xml +++ b/pom.xml @@ -53,16 +53,8 @@ ossrh https://oss.sonatype.org/content/repositories/releases - - maven-all-virtual - https://splitio.jfrog.io/artifactory/maven-all-virtual - - - maven-all-virtual - https://splitio.jfrog.io/artifactory/maven-all-virtual - UTF-8 @@ -146,14 +138,6 @@ test - - maven-dev - https://splitio.jfrog.io/artifactory/maven-dev/ - - - maven-dev - https://splitio.jfrog.io/artifactory/maven-dev/ - From dfd9cfc47f220b3c49fbbb5e9661fffdc59c6df3 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 17 Jul 2025 11:59:04 -0700 Subject: [PATCH 4/9] removed empty element --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index b1c91c81..c2c595f0 100644 --- a/pom.xml +++ b/pom.xml @@ -137,8 +137,6 @@ test - - From b127c0eca661e83ab4f422be40087d0776b354b1 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany <41021307+chillaq@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:12:57 -0700 Subject: [PATCH 5/9] Update ci.yml --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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') From 264f0842611528b8d949f1d213f0ba4ee1b94a4e Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 17 Jul 2025 12:40:45 -0700 Subject: [PATCH 6/9] Update SDK version to rc3 --- client/pom.xml | 4 ++-- okhttp-modules/pom.xml | 4 ++-- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) 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 @@ io.split.client java-client-parent - 4.17.0-rc2 + 4.17.0-rc3 - 4.17.0-rc2 + 4.17.0-rc3 java-client jar Java Client diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index ff0bac2e..0dfc2529 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.17.0-rc2 + 4.17.0-rc3 4.0.0 - 4.17.0-rc2 + 4.17.0-rc3 okhttp-modules jar http-modules diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index 0353d0c5..3a908213 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.17.0-rc2 + 4.17.0-rc3 2.1.0 diff --git a/pom.xml b/pom.xml index c2c595f0..e8acb3c8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.17.0-rc2 + 4.17.0-rc3 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index 0da0c71f..b65a1984 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.17.0-rc2 + 4.17.0-rc3 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index f7316b7b..ee52481f 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,11 +5,11 @@ io.split.client java-client-parent - 4.17.0-rc2 + 4.17.0-rc3 java-client-testing jar - 4.17.0-rc2 + 4.17.0-rc3 Java Client For Testing Testing suite for Java SDK for Split From d30ef5a02f32bf445e0e8f674ae0a104d9cc47bb Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany <41021307+chillaq@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:52:22 -0700 Subject: [PATCH 7/9] Update client/src/main/java/io/split/client/dtos/ProxyConfiguration.java Co-authored-by: Emiliano Sanchez --- .../src/main/java/io/split/client/dtos/ProxyConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java index 049afb8d..a3be9029 100644 --- a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java +++ b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java @@ -44,7 +44,7 @@ public ProxyConfiguration.Builder url(URL url) throws MalformedURLException { try { _proxyHost = new HttpHost(url.getProtocol(), url.getHost(), url.getPort()); } catch (Exception exc) { - throw new MalformedURLException("roxy configuration is ignored. The proxy `url` was not provided or is malformed"); + throw new MalformedURLException("Proxy configuration is ignored. The proxy `url` was not provided or is malformed"); } return this; } From 9bb8b29bfbd7a6c2976b4f17afa7c3c584a166dc Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 17 Jul 2025 13:01:25 -0700 Subject: [PATCH 8/9] Added check for missing url --- .../java/io/split/client/dtos/ProxyConfiguration.java | 5 ++++- .../test/java/io/split/client/SplitClientConfigTest.java | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java index 049afb8d..93d58c4c 100644 --- a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java +++ b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java @@ -44,7 +44,7 @@ public ProxyConfiguration.Builder url(URL url) throws MalformedURLException { try { _proxyHost = new HttpHost(url.getProtocol(), url.getHost(), url.getPort()); } catch (Exception exc) { - throw new MalformedURLException("roxy configuration is ignored. The proxy `url` was not provided or is malformed"); + throw new MalformedURLException("Proxy configuration is invalid. The proxy `url` is malformed"); } return this; } @@ -56,6 +56,9 @@ public ProxyConfiguration.Builder mtls(String p12File, String passKey) { } 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); } } diff --git a/client/src/test/java/io/split/client/SplitClientConfigTest.java b/client/src/test/java/io/split/client/SplitClientConfigTest.java index 4f166a73..8330f13a 100644 --- a/client/src/test/java/io/split/client/SplitClientConfigTest.java +++ b/client/src/test/java/io/split/client/SplitClientConfigTest.java @@ -333,6 +333,14 @@ public void cannotUseInvalidUrl() throws MalformedURLException { .build(); } + @Test(expected = IllegalArgumentException.class) + public void mustUseUrl() throws MalformedURLException { + SplitClientConfig.builder() + .proxyConfiguration(new ProxyConfiguration.Builder() + .build()) + .build(); + } + @Test(expected = IllegalArgumentException.class) public void mustUseP12FileWithProxyMtls() throws MalformedURLException { SplitClientConfig.builder() From bdad865882a9149bd0f13128276f04d2609f1e32 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 17 Jul 2025 13:18:27 -0700 Subject: [PATCH 9/9] polishing --- .../main/java/io/split/client/SplitFactoryImpl.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java index 95a84cd7..e3badac7 100644 --- a/client/src/main/java/io/split/client/SplitFactoryImpl.java +++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java @@ -632,6 +632,7 @@ private static HttpClientBuilder setupProxy(HttpClientBuilder httpClientbuilder, 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); @@ -643,14 +644,16 @@ private static HttpClientBuilder setupProxy(HttpClientBuilder httpClientbuilder, _log.debug("Proxy setup using credentials"); String userName; String password; - if (config.proxyUsername() != null && config.proxyPassword() != null) { - userName = config.proxyUsername(); - password = config.proxyPassword(); - } else { + 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(proxyHost.getHostName(), proxyHost.getPort());