Skip to content

Commit cf784b0

Browse files
authored
Merge pull request #169 from splitio/development
[4.1.2] Development into master
2 parents 31f31ce + 5be0f8e commit cf784b0

36 files changed

+399
-406
lines changed

client/CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
CHANGES
22

3+
4.1.2 (Nov 25, 2020)
4+
- Updated junit from 4.12 to 4.13.1
5+
- Updated HttpClient from 4.5.2 to 5.0.3
6+
37
4.1.1 (Sep 30, 2020)
48
- Fixed fetch retries after received an SPLIT_CHANGE.
59

client/pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>io.split.client</groupId>
77
<artifactId>java-client-parent</artifactId>
8-
<version>4.1.1</version>
8+
<version>4.1.2</version>
99
</parent>
1010
<artifactId>java-client</artifactId>
1111
<packaging>jar</packaging>
@@ -128,9 +128,9 @@
128128
<artifactId>slf4j-api</artifactId>
129129
</dependency>
130130
<dependency>
131-
<groupId>org.apache.httpcomponents</groupId>
132-
<artifactId>httpclient</artifactId>
133-
<version>4.5.2</version>
131+
<groupId>org.apache.httpcomponents.client5</groupId>
132+
<artifactId>httpclient5</artifactId>
133+
<version>5.0.3</version>
134134
</dependency>
135135
<dependency>
136136
<groupId>com.google.code.gson</groupId>

client/src/main/java/io/split/client/EventClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.split.client.dtos.Event;
55
import io.split.client.utils.GenericClientUtil;
66
import io.split.client.utils.Utils;
7-
import org.apache.http.impl.client.CloseableHttpClient;
7+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
1010

client/src/main/java/io/split/client/HttpSegmentChangeFetcher.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import io.split.client.utils.Utils;
77
import io.split.engine.metrics.Metrics;
88
import io.split.engine.segments.SegmentChangeFetcher;
9-
import org.apache.http.client.methods.CloseableHttpResponse;
10-
import org.apache.http.client.methods.HttpGet;
11-
import org.apache.http.client.utils.URIBuilder;
12-
import org.apache.http.impl.client.CloseableHttpClient;
13-
import org.apache.http.util.EntityUtils;
9+
import org.apache.hc.client5.http.classic.methods.HttpGet;
10+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
11+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
12+
import org.apache.hc.core5.http.io.entity.EntityUtils;
13+
import org.apache.hc.core5.net.URIBuilder;
1414
import org.slf4j.Logger;
1515
import org.slf4j.LoggerFactory;
1616

@@ -60,7 +60,7 @@ public SegmentChange fetch(String segmentName, long since) {
6060
HttpGet request = new HttpGet(uri);
6161
response = _client.execute(request);
6262

63-
int statusCode = response.getStatusLine().getStatusCode();
63+
int statusCode = response.getCode();
6464

6565
if (statusCode < 200 || statusCode >= 300) {
6666
_log.error("Response status was: " + statusCode);

client/src/main/java/io/split/client/HttpSplitChangeFetcher.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import io.split.client.utils.Utils;
77
import io.split.engine.experiments.SplitChangeFetcher;
88
import io.split.engine.metrics.Metrics;
9-
import org.apache.http.client.methods.CloseableHttpResponse;
10-
import org.apache.http.client.methods.HttpGet;
11-
import org.apache.http.client.utils.URIBuilder;
12-
import org.apache.http.impl.client.CloseableHttpClient;
13-
import org.apache.http.util.EntityUtils;
9+
import org.apache.hc.client5.http.classic.methods.HttpGet;
10+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
11+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
12+
import org.apache.hc.core5.http.io.entity.EntityUtils;
13+
import org.apache.hc.core5.net.URIBuilder;
1414
import org.slf4j.Logger;
1515
import org.slf4j.LoggerFactory;
1616

@@ -61,7 +61,7 @@ public SplitChange fetch(long since) {
6161
HttpGet request = new HttpGet(uri);
6262
response = _client.execute(request);
6363

64-
int statusCode = response.getStatusLine().getStatusCode();
64+
int statusCode = response.getCode();
6565

6666
if (statusCode < 200 || statusCode >= 300) {
6767
_metrics.count(PREFIX + ".status." + statusCode, 1);

client/src/main/java/io/split/client/SplitClientConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.split.client.impressions.ImpressionListener;
55
import io.split.client.impressions.ImpressionsManager;
66
import io.split.integrations.IntegrationsConfig;
7-
import org.apache.http.HttpHost;
7+
import org.apache.hc.core5.http.HttpHost;
88

99
import java.io.IOException;
1010
import java.util.Properties;

client/src/main/java/io/split/client/SplitFactoryImpl.java

Lines changed: 96 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,30 @@
2020
import io.split.engine.segments.RefreshableSegmentFetcher;
2121
import io.split.engine.segments.SegmentChangeFetcher;
2222
import io.split.integrations.IntegrationsConfig;
23-
import org.apache.http.auth.AuthScope;
24-
import org.apache.http.auth.Credentials;
25-
import org.apache.http.auth.UsernamePasswordCredentials;
26-
import org.apache.http.client.CredentialsProvider;
27-
import org.apache.http.client.config.CookieSpecs;
28-
import org.apache.http.client.config.RequestConfig;
29-
import org.apache.http.config.Registry;
30-
import org.apache.http.config.RegistryBuilder;
31-
import org.apache.http.conn.socket.ConnectionSocketFactory;
32-
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
33-
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
34-
import org.apache.http.conn.ssl.SSLContexts;
35-
import org.apache.http.impl.client.BasicCredentialsProvider;
36-
import org.apache.http.impl.client.CloseableHttpClient;
37-
import org.apache.http.impl.client.HttpClientBuilder;
38-
import org.apache.http.impl.client.HttpClients;
39-
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
40-
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
23+
import org.apache.hc.client5.http.auth.AuthScope;
24+
import org.apache.hc.client5.http.auth.Credentials;
25+
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
26+
import org.apache.hc.client5.http.config.RequestConfig;
27+
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
28+
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
29+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
30+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
31+
import org.apache.hc.client5.http.impl.classic.HttpClients;
32+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
33+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
34+
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner;
35+
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
36+
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
37+
import org.apache.hc.core5.http.io.SocketConfig;
38+
import org.apache.hc.core5.http.ssl.TLS;
39+
import org.apache.hc.core5.ssl.SSLContexts;
40+
import org.apache.hc.core5.util.Timeout;
4141
import org.slf4j.Logger;
4242
import org.slf4j.LoggerFactory;
4343

44-
import javax.net.ssl.SSLContext;
4544
import java.io.IOException;
4645
import java.net.URI;
4746
import java.net.URISyntaxException;
48-
import java.security.KeyManagementException;
49-
import java.security.NoSuchAlgorithmException;
5047
import java.util.ArrayList;
5148
import java.util.List;
5249
import java.util.Random;
@@ -55,6 +52,8 @@
5552

5653
public class SplitFactoryImpl implements SplitFactory {
5754
private static final Logger _log = LoggerFactory.getLogger(SplitFactory.class);
55+
private final static long SSE_CONNECT_TIMEOUT = 30000;
56+
private final static long SSE_SOCKET_TIMEOUT = 70000;
5857

5958
private static final Multiset<String> USED_API_TOKENS = ConcurrentHashMultiset.create();
6059
private static Random RANDOM = new Random();
@@ -65,46 +64,92 @@ public class SplitFactoryImpl implements SplitFactory {
6564
private final String _apiToken;
6665
private boolean isTerminated = false;
6766

68-
public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException {
69-
_apiToken = apiToken;
70-
SSLContext sslContext = null;
71-
try {
72-
sslContext = SSLContexts.custom()
73-
.useTLS()
74-
.build();
75-
} catch (NoSuchAlgorithmException | KeyManagementException e) {
76-
throw new RuntimeException("Unable to create support for secure connection.");
77-
}
67+
private static CloseableHttpClient buildHttpClient(String apiToken, SplitClientConfig config) {
7868

79-
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
80-
sslContext,
81-
new String[]{"TLSv1.1", "TLSv1.2"},
82-
null,
83-
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
84-
85-
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
86-
.register("http", PlainConnectionSocketFactory.getSocketFactory())
87-
.register("https", sslsf)
69+
SSLConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
70+
.setSslContext(SSLContexts.createSystemDefault())
71+
.setTlsVersions(TLS.V_1_1, TLS.V_1_2)
8872
.build();
8973

9074
RequestConfig requestConfig = RequestConfig.custom()
91-
.setConnectTimeout(config.connectionTimeout())
92-
.setSocketTimeout(config.readTimeout())
93-
.setCookieSpec(CookieSpecs.STANDARD)
75+
.setConnectTimeout(Timeout.ofMilliseconds(config.connectionTimeout()))
76+
.setCookieSpec(StandardCookieSpec.STRICT)
9477
.build();
9578

96-
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
79+
PoolingHttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
80+
.setSSLSocketFactory(sslSocketFactory)
81+
.setDefaultSocketConfig(SocketConfig.custom()
82+
.setSoTimeout(Timeout.ofMilliseconds(config.readTimeout()))
83+
.build())
84+
.build();
9785
cm.setMaxTotal(20);
9886
cm.setDefaultMaxPerRoute(20);
9987

10088
HttpClientBuilder httpClientbuilder = HttpClients.custom()
10189
.setConnectionManager(cm)
10290
.setDefaultRequestConfig(requestConfig)
103-
.setSSLSocketFactory(sslsf)
104-
.addInterceptorLast(AddSplitHeadersFilter.instance(apiToken, config.ipAddressEnabled()))
105-
.addInterceptorLast(new GzipEncoderRequestInterceptor())
106-
.addInterceptorLast(new GzipDecoderResponseInterceptor());
91+
.addRequestInterceptorLast(AddSplitHeadersFilter.instance(apiToken, config.ipAddressEnabled()))
92+
.addRequestInterceptorLast(new GzipEncoderRequestInterceptor())
93+
.addResponseInterceptorLast((new GzipDecoderResponseInterceptor()));
94+
95+
// Set up proxy is it exists
96+
if (config.proxy() != null) {
97+
httpClientbuilder = setupProxy(httpClientbuilder, config);
98+
}
99+
100+
return httpClientbuilder.build();
101+
}
102+
103+
private static CloseableHttpClient buildSSEdHttpClient(SplitClientConfig config) {
104+
RequestConfig requestConfig = RequestConfig.custom()
105+
.setConnectTimeout(Timeout.ofMilliseconds(SSE_CONNECT_TIMEOUT))
106+
.build();
107+
108+
SSLConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
109+
.setSslContext(SSLContexts.createSystemDefault())
110+
.setTlsVersions(TLS.V_1_1, TLS.V_1_2)
111+
.build();
112+
113+
PoolingHttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
114+
.setSSLSocketFactory(sslSocketFactory)
115+
.setDefaultSocketConfig(SocketConfig.custom()
116+
.setSoTimeout(Timeout.ofMilliseconds(SSE_SOCKET_TIMEOUT))
117+
.build())
118+
.build();
119+
cm.setMaxTotal(1);
120+
cm.setDefaultMaxPerRoute(1);
121+
122+
HttpClientBuilder httpClientbuilder = HttpClients.custom()
123+
.setConnectionManager(cm)
124+
.setDefaultRequestConfig(requestConfig);
125+
126+
// Set up proxy is it exists
127+
if (config.proxy() != null) {
128+
httpClientbuilder = setupProxy(httpClientbuilder, config);
129+
}
107130

131+
return httpClientbuilder.build();
132+
}
133+
134+
private static HttpClientBuilder setupProxy(HttpClientBuilder httpClientbuilder, SplitClientConfig config) {
135+
_log.info("Initializing Split SDK with proxy settings");
136+
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(config.proxy());
137+
httpClientbuilder.setRoutePlanner(routePlanner);
138+
139+
if (config.proxyUsername() != null && config.proxyPassword() != null) {
140+
_log.debug("Proxy setup using credentials");
141+
BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
142+
AuthScope siteScope = new AuthScope(config.proxy().getHostName(), config.proxy().getPort());
143+
Credentials siteCreds = new UsernamePasswordCredentials(config.proxyUsername(), config.proxyPassword().toCharArray());
144+
credsProvider.setCredentials(siteScope, siteCreds);
145+
httpClientbuilder.setDefaultCredentialsProvider(credsProvider);
146+
}
147+
148+
return httpClientbuilder;
149+
}
150+
151+
public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException {
152+
_apiToken = apiToken;
108153

109154
if (USED_API_TOKENS.contains(apiToken)) {
110155
String message = String.format("factory instantiation: You already have %s with this API Key. " +
@@ -126,24 +171,9 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
126171
"if no ready config has been set when building factory");
127172

128173
}
129-
// Set up proxy is it exists
130-
if (config.proxy() != null) {
131-
_log.info("Initializing Split SDK with proxy settings");
132-
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(config.proxy());
133-
httpClientbuilder.setRoutePlanner(routePlanner);
134-
135-
if (config.proxyUsername() != null && config.proxyPassword() != null) {
136-
_log.debug("Proxy setup using credentials");
137-
CredentialsProvider credsProvider = new BasicCredentialsProvider();
138-
AuthScope siteScope = new AuthScope(config.proxy().getHostName(), config.proxy().getPort());
139-
Credentials siteCreds = new UsernamePasswordCredentials(config.proxyUsername(), config.proxyPassword());
140-
credsProvider.setCredentials(siteScope, siteCreds);
141-
142-
httpClientbuilder.setDefaultCredentialsProvider(credsProvider);
143-
}
144-
}
145174

146-
final CloseableHttpClient httpclient = httpClientbuilder.build();
175+
176+
final CloseableHttpClient httpclient = buildHttpClient(apiToken, config);
147177

148178
URI rootTarget = URI.create(config.endpoint());
149179
URI eventsRootTarget = URI.create(config.eventsEndpoint());
@@ -191,7 +221,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
191221
final EventClient eventClient = EventClientImpl.create(httpclient, eventsRootTarget, config.eventsQueueSize(), config.eventFlushIntervalInMillis(), config.waitBeforeShutdown());
192222

193223
// SyncManager
194-
final SyncManager syncManager = SyncManagerImp.build(config.streamingEnabled(), splitFetcherProvider, segmentFetcher, config.authServiceURL(), httpclient, config.streamingServiceURL(), config.authRetryBackoffBase());
224+
final SyncManager syncManager = SyncManagerImp.build(config.streamingEnabled(), splitFetcherProvider, segmentFetcher, config.authServiceURL(), httpclient, config.streamingServiceURL(), config.authRetryBackoffBase(), buildSSEdHttpClient(config));
195225
syncManager.start();
196226

197227
destroyer = new Runnable() {

client/src/main/java/io/split/client/impressions/HttpImpressionsSender.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
import io.split.client.dtos.TestImpressions;
66
import io.split.client.utils.Utils;
77

8-
import org.apache.http.client.methods.CloseableHttpResponse;
9-
import org.apache.http.client.methods.HttpPost;
10-
import org.apache.http.entity.StringEntity;
11-
import org.apache.http.impl.client.CloseableHttpClient;
8+
import org.apache.hc.client5.http.classic.methods.HttpPost;
9+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
10+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
11+
import org.apache.hc.core5.http.HttpEntity;
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414

@@ -54,15 +54,15 @@ public void postImpressionsBulk(List<TestImpressions> impressions) {
5454
CloseableHttpResponse response = null;
5555

5656
try {
57-
StringEntity entity = Utils.toJsonEntity(impressions);
57+
HttpEntity entity = Utils.toJsonEntity(impressions);
5858

5959
HttpPost request = new HttpPost(_impressionBulkTarget);
6060
request.addHeader(IMPRESSIONS_MODE_HEADER, _mode.toString());
6161
request.setEntity(entity);
6262

6363
response = _client.execute(request);
6464

65-
int status = response.getStatusLine().getStatusCode();
65+
int status = response.getCode();
6666

6767
if (status < 200 || status >= 300) {
6868
_logger.warn("Response status was: " + status);
@@ -86,7 +86,7 @@ public void postCounters(HashMap<ImpressionCounter.Key, Integer> raw) {
8686
HttpPost request = new HttpPost(_impressionCountTarget);
8787
request.setEntity(Utils.toJsonEntity(ImpressionCount.fromImpressionCounterData(raw)));
8888
try (CloseableHttpResponse response = _client.execute(request)) {
89-
int status = response.getStatusLine().getStatusCode();
89+
int status = response.getCode();
9090
if (status < 200 || status >= 300) {
9191
_logger.warn("Response status was: " + status);
9292
}

client/src/main/java/io/split/client/impressions/ImpressionsManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import io.split.client.SplitClientConfig;
66
import io.split.client.dtos.KeyImpression;
77
import io.split.client.dtos.TestImpressions;
8-
import org.apache.http.impl.client.CloseableHttpClient;
8+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
99
import org.slf4j.Logger;
1010
import org.slf4j.LoggerFactory;
1111

0 commit comments

Comments
 (0)