Skip to content

Commit d1d4fbf

Browse files
committed
attempt migration to apache httpclient5
1 parent 7d16d13 commit d1d4fbf

31 files changed

+200
-196
lines changed

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.2-rc2</version>
8+
<version>4.1.2-rc3</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.13</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: 60 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,29 @@
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.CredentialsProvider;
26+
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
27+
import org.apache.hc.client5.http.config.RequestConfig;
28+
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
29+
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
30+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
31+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
32+
import org.apache.hc.client5.http.impl.classic.HttpClients;
33+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
34+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
35+
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner;
36+
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
37+
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
38+
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
39+
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
40+
import org.apache.hc.core5.http.config.Registry;
41+
import org.apache.hc.core5.http.config.RegistryBuilder;
42+
import org.apache.hc.core5.http.io.SocketConfig;
43+
import org.apache.hc.core5.http.ssl.TLS;
44+
import org.apache.hc.core5.ssl.SSLContexts;
45+
import org.apache.hc.core5.util.Timeout;
4146
import org.slf4j.Logger;
4247
import org.slf4j.LoggerFactory;
4348

@@ -65,46 +70,55 @@ public class SplitFactoryImpl implements SplitFactory {
6570
private final String _apiToken;
6671
private boolean isTerminated = false;
6772

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-
}
73+
private static CloseableHttpClient buildHttpClient(String apiToken, SplitClientConfig config) {
7874

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)
75+
SSLConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
76+
.setSslContext(SSLContexts.createSystemDefault())
77+
.setTlsVersions(TLS.V_1_1, TLS.V_1_2)
8878
.build();
8979

9080
RequestConfig requestConfig = RequestConfig.custom()
91-
.setConnectTimeout(config.connectionTimeout())
92-
.setSocketTimeout(config.readTimeout())
93-
.setCookieSpec(CookieSpecs.STANDARD)
81+
.setConnectTimeout(Timeout.ofMilliseconds(config.connectionTimeout()))
82+
.setCookieSpec(StandardCookieSpec.STRICT)
9483
.build();
9584

96-
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
85+
PoolingHttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
86+
.setSSLSocketFactory(sslSocketFactory)
87+
.setDefaultSocketConfig(SocketConfig.custom()
88+
.setSoTimeout(Timeout.ofMilliseconds(config.readTimeout()))
89+
.build())
90+
.build();
9791
cm.setMaxTotal(20);
9892
cm.setDefaultMaxPerRoute(20);
9993

10094
HttpClientBuilder httpClientbuilder = HttpClients.custom()
10195
.setConnectionManager(cm)
10296
.setDefaultRequestConfig(requestConfig)
103-
.setSSLSocketFactory(sslsf)
104-
.addInterceptorLast(AddSplitHeadersFilter.instance(apiToken, config.ipAddressEnabled()))
105-
.addInterceptorLast(new GzipEncoderRequestInterceptor())
106-
.addInterceptorLast(new GzipDecoderResponseInterceptor());
97+
.addRequestInterceptorLast(AddSplitHeadersFilter.instance(apiToken, config.ipAddressEnabled()))
98+
.addRequestInterceptorLast(new GzipEncoderRequestInterceptor())
99+
.addResponseInterceptorLast((new GzipDecoderResponseInterceptor()));
100+
101+
// Set up proxy is it exists
102+
if (config.proxy() != null) {
103+
_log.info("Initializing Split SDK with proxy settings");
104+
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(config.proxy());
105+
httpClientbuilder.setRoutePlanner(routePlanner);
106+
107+
if (config.proxyUsername() != null && config.proxyPassword() != null) {
108+
_log.debug("Proxy setup using credentials");
109+
BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
110+
AuthScope siteScope = new AuthScope(config.proxy().getHostName(), config.proxy().getPort());
111+
Credentials siteCreds = new UsernamePasswordCredentials(config.proxyUsername(), config.proxyPassword().toCharArray());
112+
credsProvider.setCredentials(siteScope, siteCreds);
113+
httpClientbuilder.setDefaultCredentialsProvider(credsProvider);
114+
}
115+
}
116+
117+
return httpClientbuilder.build();
118+
}
107119

120+
public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException {
121+
_apiToken = apiToken;
108122

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

128142
}
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);
134143

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-
}
145144

146-
final CloseableHttpClient httpclient = httpClientbuilder.build();
145+
final CloseableHttpClient httpclient = buildHttpClient(apiToken, config);
147146

148147
URI rootTarget = URI.create(config.endpoint());
149148
URI eventsRootTarget = URI.create(config.eventsEndpoint());

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

client/src/main/java/io/split/client/interceptors/AddSplitHeadersFilter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package io.split.client.interceptors;
22

33
import io.split.client.SplitClientConfig;
4-
import org.apache.http.HttpException;
5-
import org.apache.http.HttpRequest;
6-
import org.apache.http.HttpRequestInterceptor;
7-
import org.apache.http.protocol.HttpContext;
4+
import org.apache.hc.core5.http.EntityDetails;
5+
import org.apache.hc.core5.http.HttpException;
6+
import org.apache.hc.core5.http.HttpRequest;
7+
import org.apache.hc.core5.http.HttpRequestInterceptor;
8+
import org.apache.hc.core5.http.protocol.HttpContext;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
1011

@@ -57,7 +58,7 @@ private AddSplitHeadersFilter(String apiToken, String hostname, String ip) {
5758
}
5859

5960
@Override
60-
public void process(HttpRequest request, HttpContext httpContext) {
61+
public void process(HttpRequest request, EntityDetails entity, HttpContext context) throws HttpException, IOException {
6162
request.addHeader(AUTHORIZATION_HEADER, _apiTokenBearer);
6263
request.addHeader(CLIENT_VERSION, SplitClientConfig.splitSdkVersion);
6364

@@ -68,6 +69,5 @@ public void process(HttpRequest request, HttpContext httpContext) {
6869
if (_ip != null) {
6970
request.addHeader(CLIENT_MACHINE_IP_HEADER, _ip);
7071
}
71-
7272
}
7373
}

client/src/main/java/io/split/client/interceptors/GzipDecoderResponseInterceptor.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package io.split.client.interceptors;
22

3-
import org.apache.http.Header;
4-
import org.apache.http.HeaderElement;
5-
import org.apache.http.HttpEntity;
6-
import org.apache.http.HttpException;
7-
import org.apache.http.HttpResponse;
8-
import org.apache.http.HttpResponseInterceptor;
9-
import org.apache.http.client.entity.GzipDecompressingEntity;
10-
import org.apache.http.protocol.HttpContext;
3+
4+
import org.apache.hc.core5.http.EntityDetails;
5+
import org.apache.hc.core5.http.HttpException;
6+
import org.apache.hc.core5.http.HttpResponse;
7+
import org.apache.hc.core5.http.HttpResponseInterceptor;
8+
import org.apache.hc.core5.http.protocol.HttpContext;
119

1210
import java.io.IOException;
1311

@@ -16,6 +14,7 @@
1614
*/
1715
public class GzipDecoderResponseInterceptor implements HttpResponseInterceptor {
1816

17+
/*
1918
@Override
2019
public void process(HttpResponse response, HttpContext httpContext) throws HttpException, IOException {
2120
HttpEntity entity = response.getEntity();
@@ -32,4 +31,10 @@ public void process(HttpResponse response, HttpContext httpContext) throws HttpE
3231
}
3332
}
3433
}
34+
*/
35+
// TODO: Check if this is still necessary
36+
@Override
37+
public void process(HttpResponse response, EntityDetails entity, HttpContext context) throws HttpException, IOException {
38+
39+
}
3540
}

0 commit comments

Comments
 (0)