diff --git a/CHANGES.txt b/CHANGES.txt
index ceaef9e6a..4dbbb9ee4 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,7 @@
+4.17.0 (Aug 22, 2025)
+- Added a maximum size payload when posting unique keys telemetry in batches
+- Added ProxyConfiguration parameter to support proxies, including Harness Forward Proxy, allowing also for more secured authentication options: MTLS, Bearer token and user/password authentication. Read more in our docs.
+
4.16.1 (Jul 21, 2025)
- Fixed vulnerabilities:
- Upgraded org.apache.commons-commons-lang3 to 3.18.0
diff --git a/client/pom.xml b/client/pom.xml
index 0e21b1bf5..768f79e9f 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
- 4.17.0-rc3
+ 4.17.0
java-client
jar
Java Client
diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java
index 586e7fde1..c84e290ed 100644
--- a/client/src/main/java/io/split/client/SplitFactoryImpl.java
+++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java
@@ -121,7 +121,6 @@
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
-import java.nio.file.Paths;
import java.security.KeyStore;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
@@ -606,7 +605,7 @@ private static SSLContext buildSSLContext(SplitClientConfig config) throws IOExc
InputStream keystoreStream = null;
try {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
- keystoreStream = java.nio.file.Files.newInputStream(Paths.get(config.proxyConfiguration().getP12File()));
+ keystoreStream = config.proxyConfiguration().getP12File();
keyStore.load(keystoreStream, config.proxyConfiguration().getPassKey().toCharArray());
sslContext = SSLContexts.custom()
.loadKeyMaterial(keyStore, config.proxyConfiguration().getPassKey().toCharArray())
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 93d58c4cd..c1ed2b409 100644
--- a/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java
+++ b/client/src/main/java/io/split/client/dtos/ProxyConfiguration.java
@@ -2,18 +2,19 @@
import org.apache.hc.core5.http.HttpHost;
+import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class ProxyConfiguration {
private final HttpHost _proxyHost;
private ProxyCredentialsProvider _provider;
- private final String _p12File;
+ private final InputStream _p12File;
private final String _passKey;
private ProxyConfiguration(HttpHost proxyHost,
ProxyCredentialsProvider proxyCredentialsProvider,
- String p12File, String passKey) {
+ InputStream p12File, String passKey) {
_proxyHost = proxyHost;
_p12File = p12File;
_passKey = passKey;
@@ -21,7 +22,7 @@ private ProxyConfiguration(HttpHost proxyHost,
}
public HttpHost getHost() { return _proxyHost; }
- public String getP12File() { return _p12File; }
+ public InputStream getP12File() { return _p12File; }
public String getPassKey() { return _passKey; }
public ProxyCredentialsProvider getProxyCredentialsProvider() { return _provider; }
@@ -32,7 +33,7 @@ public static ProxyConfiguration.Builder builder() {
public static class Builder {
private ProxyCredentialsProvider _provider;
private HttpHost _proxyHost;
- private String _p12File;
+ private InputStream _p12File;
private String _passKey;
public ProxyConfiguration.Builder credentialsProvider(ProxyCredentialsProvider provider) {
@@ -49,7 +50,7 @@ public ProxyConfiguration.Builder url(URL url) throws MalformedURLException {
return this;
}
- public ProxyConfiguration.Builder mtls(String p12File, String passKey) {
+ public ProxyConfiguration.Builder mtls(InputStream p12File, String passKey) {
_passKey = passKey;
_p12File = p12File;
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 8330f13ad..be9e85544 100644
--- a/client/src/test/java/io/split/client/SplitClientConfigTest.java
+++ b/client/src/test/java/io/split/client/SplitClientConfigTest.java
@@ -13,6 +13,8 @@
import org.junit.Test;
import org.mockito.Mockito;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
@@ -260,7 +262,7 @@ public Map> getHeaderOverrides(RequestContext context) {
}
@Test
- public void checkProxyParams() throws MalformedURLException {
+ public void checkProxyParams() throws MalformedURLException, FileNotFoundException {
SplitClientConfig config = SplitClientConfig.builder()
.proxyConfiguration(new ProxyConfiguration.Builder()
.url(new URL("https://proxy-host:8888"))
@@ -304,14 +306,14 @@ public String getToken() {
.build())
.build();
Assert.assertEquals(bearerCredentialsProvider, config.proxyConfiguration().getProxyCredentialsProvider());
-
+ FileInputStream p12File = new FileInputStream("src/test/resources/keyStore.p12");
config = SplitClientConfig.builder()
.proxyConfiguration(new ProxyConfiguration.Builder()
.url(new URL("https://proxy-host:888"))
- .mtls("path/to/file", "pass-key")
+ .mtls(p12File, "pass-key")
.build())
.build();
- Assert.assertEquals("path/to/file", config.proxyConfiguration().getP12File());
+ Assert.assertEquals(p12File, config.proxyConfiguration().getP12File());
Assert.assertEquals("pass-key", config.proxyConfiguration().getPassKey());
}
@@ -352,11 +354,11 @@ public void mustUseP12FileWithProxyMtls() throws MalformedURLException {
}
@Test(expected = IllegalArgumentException.class)
- public void mustUseP12PassKeyWithProxyMtls() throws MalformedURLException {
+ public void mustUseP12PassKeyWithProxyMtls() throws MalformedURLException, FileNotFoundException {
SplitClientConfig.builder()
.proxyConfiguration(new ProxyConfiguration.Builder()
.url(new URL("https://proxy-host:888"))
- .mtls("path/to/file", null)
+ .mtls(new FileInputStream("src/test/resources/keyStore.p12"), null)
.build())
.build();
}
diff --git a/client/src/test/java/io/split/client/SplitFactoryImplTest.java b/client/src/test/java/io/split/client/SplitFactoryImplTest.java
index 222ddc82b..9826b47e2 100644
--- a/client/src/test/java/io/split/client/SplitFactoryImplTest.java
+++ b/client/src/test/java/io/split/client/SplitFactoryImplTest.java
@@ -242,7 +242,7 @@ public void testFactoryInstantiationWithProxyMtls() throws Exception {
.setBlockUntilReadyTimeout(1000)
.proxyConfiguration(ProxyConfiguration.builder()
.url(new URL("http://proxy-name:6060"))
- .mtls("src/test/resources/keyStore.p12", "split")
+ .mtls(new FileInputStream("src/test/resources/keyStore.p12"), "split")
.build())
.build();
SplitFactoryImpl splitFactory3 = new SplitFactoryImpl(API_KEY, splitClientConfig);
diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml
index 0dfc25296..fc646f3d7 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
4.0.0
- 4.17.0-rc3
+ 4.17.0
okhttp-modules
jar
http-modules
diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml
index 3a9082133..4b7e01562 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
2.1.0
diff --git a/pom.xml b/pom.xml
index e8acb3c8a..c20814b19 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
diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml
index b65a19846..8bf6c4246 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
redis-wrapper
3.1.1
diff --git a/testing/pom.xml b/testing/pom.xml
index c73a45694..b7f0bf906 100644
--- a/testing/pom.xml
+++ b/testing/pom.xml
@@ -5,11 +5,11 @@
io.split.client
java-client-parent
- 4.17.0-rc3
+ 4.17.0
java-client-testing
jar
- 4.17.0-rc3
+ 4.17.0
Java Client For Testing
Testing suite for Java SDK for Split