Skip to content

Commit bf7290e

Browse files
feat: Expose ConnectionPool customization on FlagsmithConfig.Builder (#208)
1 parent 104fbc1 commit bf7290e

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

src/main/java/com/flagsmith/config/FlagsmithConfig.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import javax.net.ssl.SSLSocketFactory;
1212
import javax.net.ssl.X509TrustManager;
1313
import lombok.Getter;
14+
import okhttp3.ConnectionPool;
1415
import okhttp3.HttpUrl;
1516
import okhttp3.Interceptor;
1617
import okhttp3.OkHttpClient;
@@ -64,6 +65,9 @@ protected FlagsmithConfig(Builder builder) {
6465
if (builder.proxy != null) {
6566
httpBuilder.proxy(builder.proxy);
6667
}
68+
if (builder.connectionPool != null) {
69+
httpBuilder.connectionPool(builder.connectionPool);
70+
}
6771
if (!builder.supportedProtocols.isEmpty()) {
6872
httpBuilder.protocols(
6973
builder.supportedProtocols.stream()
@@ -110,6 +114,7 @@ public static class Builder {
110114
private X509TrustManager trustManager;
111115
private FlagsmithFlagDefaults flagsmithFlagDefaults;
112116
private AnalyticsProcessor analyticsProcessor;
117+
private ConnectionPool connectionPool;
113118

114119
private Boolean enableLocalEvaluation = Boolean.FALSE;
115120
private Integer environmentRefreshIntervalSeconds = DEFAULT_ENVIRONMENT_REFRESH_SECONDS;
@@ -203,6 +208,18 @@ public Builder withProxy(Proxy proxy) {
203208
return this;
204209
}
205210

211+
/**
212+
* Provide a custom OkHttp ConnectionPool to tune keep-alive duration and maximum idle
213+
* connections. When not set, OkHttp's defaults are used.
214+
*
215+
* @param connectionPool the ConnectionPool to use for the HTTP client
216+
* @return the Builder
217+
*/
218+
public Builder connectionPool(ConnectionPool connectionPool) {
219+
this.connectionPool = connectionPool;
220+
return this;
221+
}
222+
206223
/**
207224
* Add retries for HTTP request to the builder.
208225
*

src/test/java/com/flagsmith/config/FlagsmithConfigTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
import static org.junit.Assert.assertNull;
44
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.junit.jupiter.api.Assertions.assertNotNull;
56
import static org.junit.jupiter.api.Assertions.assertTrue;
67

78
import com.flagsmith.config.FlagsmithConfig.Protocol;
89
import java.net.InetSocketAddress;
910
import java.net.Proxy;
1011
import java.util.Collections;
12+
import java.util.concurrent.TimeUnit;
13+
import okhttp3.ConnectionPool;
1114
import okhttp3.mock.MockInterceptor;
1215
import org.junit.jupiter.api.Test;
1316

@@ -53,6 +56,29 @@ public void configTest_multipleInterceptors() {
5356
assertEquals(2, flagsmithConfig.getHttpClient().interceptors().size());
5457
}
5558

59+
@Test
60+
public void configTest_customConnectionPool_respectsKeepAliveAndMaxIdle() throws Exception {
61+
final ConnectionPool pool = new ConnectionPool(7, 42, TimeUnit.SECONDS);
62+
63+
final FlagsmithConfig flagsmithConfig = FlagsmithConfig.newBuilder()
64+
.connectionPool(pool)
65+
.build();
66+
67+
final ConnectionPool wired = flagsmithConfig.getHttpClient().connectionPool();
68+
final Object delegate = readField(wired, "delegate");
69+
assertEquals(7, readInt(delegate, "maxIdleConnections"));
70+
assertEquals(TimeUnit.SECONDS.toNanos(42), readLong(delegate, "keepAliveDurationNs"));
71+
}
72+
73+
@Test
74+
public void configTest_nullConnectionPool_isSafeAndUsesDefault() {
75+
final FlagsmithConfig flagsmithConfig = FlagsmithConfig.newBuilder()
76+
.connectionPool(null)
77+
.build();
78+
79+
assertNotNull(flagsmithConfig.getHttpClient().connectionPool());
80+
}
81+
5682
@Test
5783
public void configTest_supportedProtocols() {
5884
final FlagsmithConfig defaultFlagsmithConfig = FlagsmithConfig.newBuilder().build();
@@ -65,4 +91,18 @@ public void configTest_supportedProtocols() {
6591
assertEquals(1, customFlagsmithConfig.getHttpClient().protocols().size());
6692
assertEquals(okhttp3.Protocol.HTTP_1_1, customFlagsmithConfig.getHttpClient().protocols().get(0));
6793
}
94+
95+
private static Object readField(Object target, String fieldName) throws Exception {
96+
java.lang.reflect.Field field = target.getClass().getDeclaredField(fieldName);
97+
field.setAccessible(true);
98+
return field.get(target);
99+
}
100+
101+
private static int readInt(Object target, String fieldName) throws Exception {
102+
return (int) readField(target, fieldName);
103+
}
104+
105+
private static long readLong(Object target, String fieldName) throws Exception {
106+
return (long) readField(target, fieldName);
107+
}
68108
}

0 commit comments

Comments
 (0)