Skip to content

Commit 4c5ec28

Browse files
Initial commit of custom CloseableHttpClient for OptimizelyFactory.
1 parent 803103f commit 4c5ec28

File tree

2 files changed

+55
-7
lines changed

2 files changed

+55
-7
lines changed

core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.optimizely.ab.event.EventHandler;
2424
import com.optimizely.ab.internal.PropertyUtils;
2525
import com.optimizely.ab.notification.NotificationCenter;
26+
import org.apache.http.impl.client.CloseableHttpClient;
2627
import org.slf4j.Logger;
2728
import org.slf4j.LoggerFactory;
2829

@@ -48,6 +49,7 @@
4849
*/
4950
public final class OptimizelyFactory {
5051
private static final Logger logger = LoggerFactory.getLogger(OptimizelyFactory.class);
52+
private static CloseableHttpClient customHttpClient;
5153

5254
/**
5355
* Convenience method for setting the maximum number of events contained within a batch.
@@ -221,7 +223,16 @@ public static Optimizely newDefaultInstance(String sdkKey) {
221223
return newDefaultInstance(() -> null);
222224
}
223225

224-
return newDefaultInstance(sdkKey, null);
226+
return newDefaultInstance(sdkKey, "");
227+
}
228+
229+
public static Optimizely newDefaultInstance(String sdkKey, CloseableHttpClient httpClient) {
230+
if (sdkKey == null || httpClient == null) {
231+
logger.error("Must provide an sdkKey and httpClient, returning non-op Optimizely client");
232+
return newDefaultInstance(() -> null);
233+
}
234+
customHttpClient = httpClient;
235+
return newDefaultInstance(sdkKey);
225236
}
226237

227238
/**
@@ -234,6 +245,7 @@ public static Optimizely newDefaultInstance(String sdkKey) {
234245
* @return A new Optimizely instance
235246
*/
236247
public static Optimizely newDefaultInstance(String sdkKey, String fallback) {
248+
if (fallback.equals("")) { fallback = null; }
237249
String datafileAccessToken = PropertyUtils.get(HttpProjectConfigManager.CONFIG_DATAFILE_AUTH_TOKEN);
238250
return newDefaultInstance(sdkKey, fallback, datafileAccessToken);
239251
}
@@ -248,12 +260,21 @@ public static Optimizely newDefaultInstance(String sdkKey, String fallback) {
248260
*/
249261
public static Optimizely newDefaultInstance(String sdkKey, String fallback, String datafileAccessToken) {
250262
NotificationCenter notificationCenter = new NotificationCenter();
251-
252-
HttpProjectConfigManager.Builder builder = HttpProjectConfigManager.builder()
253-
.withDatafile(fallback)
254-
.withNotificationCenter(notificationCenter)
255-
.withSdkKey(sdkKey);
256-
263+
HttpProjectConfigManager.Builder builder;
264+
if (customHttpClient != null) {
265+
OptimizelyHttpClient optimizelyHttpClient = new OptimizelyHttpClient(customHttpClient);
266+
267+
builder = HttpProjectConfigManager.builder()
268+
.withDatafile(fallback)
269+
.withNotificationCenter(notificationCenter)
270+
.withOptimizelyHttpClient(optimizelyHttpClient)
271+
.withSdkKey(sdkKey);
272+
} else {
273+
builder = HttpProjectConfigManager.builder()
274+
.withDatafile(fallback)
275+
.withNotificationCenter(notificationCenter)
276+
.withSdkKey(sdkKey);
277+
}
257278
if (datafileAccessToken != null) {
258279
builder.withDatafileAccessToken(datafileAccessToken);
259280
}

core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
import com.optimizely.ab.event.BatchEventProcessor;
2424
import com.optimizely.ab.internal.PropertyUtils;
2525
import com.optimizely.ab.notification.NotificationCenter;
26+
import org.apache.http.HttpHost;
27+
import org.apache.http.conn.routing.HttpRoutePlanner;
28+
import org.apache.http.impl.client.CloseableHttpClient;
29+
import org.apache.http.impl.client.HttpClientBuilder;
30+
import org.apache.http.impl.client.HttpClients;
31+
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
2632
import org.junit.After;
2733
import org.junit.Before;
2834
import org.junit.Test;
@@ -223,6 +229,27 @@ public void newDefaultInstanceWithSdkKey() throws Exception {
223229
assertFalse(optimizely.isValid());
224230
}
225231

232+
@Test
233+
public void newDefaultInstanceWithSdkKeyAndCustomHttpClient() throws Exception {
234+
// Set a blocking timeout so we don't block for too long.
235+
OptimizelyFactory.setBlockingTimeout(5, TimeUnit.MICROSECONDS);
236+
237+
// Add custom Proxy and Port here
238+
int port = 443;
239+
String proxyHostName = "localhost";
240+
HttpHost proxyHost = new HttpHost(proxyHostName, port);
241+
242+
HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyHost);
243+
244+
HttpClientBuilder clientBuilder = HttpClients.custom();
245+
clientBuilder = clientBuilder.setRoutePlanner(routePlanner);
246+
247+
CloseableHttpClient httpClient = clientBuilder.build();
248+
249+
optimizely = OptimizelyFactory.newDefaultInstance("sdk-key", httpClient);
250+
assertFalse(optimizely.isValid());
251+
}
252+
226253
@Test
227254
public void newDefaultInstanceWithFallback() throws Exception {
228255
String datafileString = Resources.toString(Resources.getResource("valid-project-config-v4.json"), Charsets.UTF_8);

0 commit comments

Comments
 (0)