Skip to content

Commit 7e13192

Browse files
authored
Merge pull request #218 from splitio/add-sse-headers
Add sse headers
2 parents eeeb747 + 6aa82ed commit 7e13192

File tree

10 files changed

+292
-153
lines changed

10 files changed

+292
-153
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import io.split.client.impressions.AsynchronousImpressionListener;
44
import io.split.client.impressions.ImpressionListener;
55
import io.split.client.impressions.ImpressionsManagerImpl;
6-
import io.split.client.interceptors.AddSplitHeadersFilter;
6+
import io.split.client.interceptors.AuthorizationInterceptorFilter;
7+
import io.split.client.interceptors.ClientKeyInterceptorFilter;
78
import io.split.client.interceptors.GzipDecoderResponseInterceptor;
89
import io.split.client.interceptors.GzipEncoderRequestInterceptor;
10+
import io.split.client.interceptors.SdkMetadataInterceptorFilter;
911
import io.split.client.metrics.HttpMetrics;
1012
import io.split.cache.InMemoryCacheImp;
1113
import io.split.cache.SplitCache;
@@ -48,6 +50,7 @@
4850
import java.io.IOException;
4951
import java.net.URI;
5052
import java.net.URISyntaxException;
53+
5154
import java.util.ArrayList;
5255
import java.util.List;
5356
import java.util.Random;
@@ -130,7 +133,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
130133
_eventClient = EventClientImpl.create(_httpclient, _eventsRootTarget, config.eventsQueueSize(), config.eventFlushIntervalInMillis(), config.waitBeforeShutdown());
131134

132135
// SyncManager
133-
_syncManager = SyncManagerImp.build(config.streamingEnabled(), _splitSynchronizationTask, _splitFetcher, _segmentSynchronizationTaskImp, _splitCache, config.authServiceURL(), _httpclient, config.streamingServiceURL(), config.authRetryBackoffBase(), buildSSEdHttpClient(config), _segmentCache, config.streamingRetryDelay(), _gates);
136+
_syncManager = SyncManagerImp.build(config.streamingEnabled(), _splitSynchronizationTask, _splitFetcher, _segmentSynchronizationTaskImp, _splitCache, config.authServiceURL(), _httpclient, config.streamingServiceURL(), config.authRetryBackoffBase(), buildSSEdHttpClient(apiToken, config), _segmentCache, config.streamingRetryDelay(), _gates);
134137
_syncManager.start();
135138

136139
// Evaluator
@@ -215,7 +218,8 @@ private static CloseableHttpClient buildHttpClient(String apiToken, SplitClientC
215218
HttpClientBuilder httpClientbuilder = HttpClients.custom()
216219
.setConnectionManager(cm)
217220
.setDefaultRequestConfig(requestConfig)
218-
.addRequestInterceptorLast(AddSplitHeadersFilter.instance(apiToken, config.ipAddressEnabled()))
221+
.addRequestInterceptorLast(AuthorizationInterceptorFilter.instance(apiToken))
222+
.addRequestInterceptorLast(SdkMetadataInterceptorFilter.instance(config.ipAddressEnabled(), SplitClientConfig.splitSdkVersion))
219223
.addRequestInterceptorLast(new GzipEncoderRequestInterceptor())
220224
.addResponseInterceptorLast((new GzipDecoderResponseInterceptor()));
221225

@@ -227,7 +231,7 @@ private static CloseableHttpClient buildHttpClient(String apiToken, SplitClientC
227231
return httpClientbuilder.build();
228232
}
229233

230-
private static CloseableHttpClient buildSSEdHttpClient(SplitClientConfig config) {
234+
private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitClientConfig config) {
231235
RequestConfig requestConfig = RequestConfig.custom()
232236
.setConnectTimeout(Timeout.ofMilliseconds(SSE_CONNECT_TIMEOUT))
233237
.build();
@@ -248,7 +252,9 @@ private static CloseableHttpClient buildSSEdHttpClient(SplitClientConfig config)
248252

249253
HttpClientBuilder httpClientbuilder = HttpClients.custom()
250254
.setConnectionManager(cm)
251-
.setDefaultRequestConfig(requestConfig);
255+
.setDefaultRequestConfig(requestConfig)
256+
.addRequestInterceptorLast(SdkMetadataInterceptorFilter.instance(config.ipAddressEnabled(), SplitClientConfig.splitSdkVersion))
257+
.addRequestInterceptorLast(ClientKeyInterceptorFilter.instance(apiToken));
252258

253259
// Set up proxy is it exists
254260
if (config.proxy() != null) {
@@ -311,5 +317,4 @@ private ImpressionsManagerImpl buildImpressionsManager(SplitClientConfig config)
311317

312318
return ImpressionsManagerImpl.instance(_httpclient, config, impressionListeners);
313319
}
314-
315320
}

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

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.split.client.interceptors;
2+
3+
import org.apache.hc.core5.http.EntityDetails;
4+
import org.apache.hc.core5.http.HttpException;
5+
import org.apache.hc.core5.http.HttpRequest;
6+
import org.apache.hc.core5.http.HttpRequestInterceptor;
7+
import org.apache.hc.core5.http.protocol.HttpContext;
8+
9+
import java.io.IOException;
10+
11+
import static com.google.common.base.Preconditions.checkNotNull;
12+
13+
public class AuthorizationInterceptorFilter implements HttpRequestInterceptor {
14+
static final String AUTHORIZATION_HEADER = "Authorization";
15+
16+
private final String _apiTokenBearer;
17+
18+
public static AuthorizationInterceptorFilter instance(String apiToken) {
19+
return new AuthorizationInterceptorFilter(apiToken);
20+
}
21+
22+
private AuthorizationInterceptorFilter(String apiToken) {
23+
_apiTokenBearer = "Bearer " + checkNotNull(apiToken);
24+
}
25+
26+
@Override
27+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
28+
httpRequest.addHeader(AUTHORIZATION_HEADER, _apiTokenBearer);
29+
}
30+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.split.client.interceptors;
2+
3+
import org.apache.hc.core5.http.EntityDetails;
4+
import org.apache.hc.core5.http.HttpException;
5+
import org.apache.hc.core5.http.HttpRequest;
6+
import org.apache.hc.core5.http.HttpRequestInterceptor;
7+
import org.apache.hc.core5.http.protocol.HttpContext;
8+
9+
import java.io.IOException;
10+
11+
public class ClientKeyInterceptorFilter implements HttpRequestInterceptor {
12+
static final String CLIENT_KEY = "SplitSDKClientKey";
13+
14+
private final String _clientKey;
15+
16+
public static ClientKeyInterceptorFilter instance(String apiToken) {
17+
return new ClientKeyInterceptorFilter(apiToken.substring(apiToken.length() - 4));
18+
}
19+
20+
private ClientKeyInterceptorFilter(String clientKey) {
21+
_clientKey = clientKey;
22+
}
23+
24+
@Override
25+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
26+
httpRequest.addHeader(CLIENT_KEY, _clientKey);
27+
}
28+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.split.client.interceptors;
2+
3+
import io.split.client.SplitClientConfig;
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;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import java.io.IOException;
13+
import java.net.InetAddress;
14+
15+
public class SdkMetadataInterceptorFilter implements HttpRequestInterceptor {
16+
private static final Logger _log = LoggerFactory.getLogger(SdkMetadataInterceptorFilter.class);
17+
18+
static final String CLIENT_MACHINE_NAME_HEADER = "SplitSDKMachineName";
19+
static final String CLIENT_MACHINE_IP_HEADER = "SplitSDKMachineIP";
20+
static final String CLIENT_VERSION = "SplitSDKVersion";
21+
22+
private final String _hostname;
23+
private final String _ip;
24+
private final String _sdkVersion;
25+
26+
public static SdkMetadataInterceptorFilter instance(boolean ipAddressEnabled, String sdkVersion) {
27+
String hostName = null;
28+
String ip = null;
29+
30+
if (ipAddressEnabled) {
31+
try {
32+
InetAddress localHost = InetAddress.getLocalHost();
33+
hostName = localHost.getHostName();
34+
ip = localHost.getHostAddress();
35+
} catch (Exception e) {
36+
_log.error("Could not resolve InetAddress", e);
37+
}
38+
}
39+
40+
return new SdkMetadataInterceptorFilter(hostName, ip, sdkVersion);
41+
}
42+
43+
private SdkMetadataInterceptorFilter(String hostName, String ip, String sdkVersion) {
44+
_sdkVersion = sdkVersion;
45+
_hostname = hostName;
46+
_ip = ip;
47+
}
48+
49+
@Override
50+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
51+
httpRequest.addHeader(CLIENT_VERSION, SplitClientConfig.splitSdkVersion);
52+
53+
if (_hostname != null) {
54+
httpRequest.addHeader(CLIENT_MACHINE_NAME_HEADER, _hostname);
55+
}
56+
57+
if (_ip != null) {
58+
httpRequest.addHeader(CLIENT_MACHINE_IP_HEADER, _ip);
59+
}
60+
}
61+
}

client/src/main/java/io/split/engine/sse/client/SSEClient.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ private void connectAndLoop(URI uri, CountDownLatch signal) {
156156
}
157157

158158
private boolean establishConnection(URI uri, CountDownLatch signal) {
159-
160159
_ongoingRequest.set(new HttpGet(uri));
161160

162161
try {

client/src/test/java/io/split/client/interceptors/AddSplitHeadersFilterTest.java

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.split.client.interceptors;
2+
3+
import org.apache.hc.core5.http.HttpException;
4+
import org.apache.hc.core5.http.HttpRequest;
5+
import org.apache.hc.core5.http.protocol.HttpContext;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.mockito.ArgumentCaptor;
9+
import org.mockito.Captor;
10+
import org.mockito.Mockito;
11+
import org.mockito.runners.MockitoJUnitRunner;
12+
13+
import java.io.IOException;
14+
import java.util.List;
15+
16+
import static org.hamcrest.Matchers.contains;
17+
import static org.junit.Assert.*;
18+
19+
@RunWith(MockitoJUnitRunner.class)
20+
public class AuthorizationInterceptorFilterTest {
21+
22+
@Captor
23+
private ArgumentCaptor<String> headerNameCaptor;
24+
25+
@Captor
26+
private ArgumentCaptor<String> headerValueCaptor;
27+
28+
@Test
29+
public void authorizationInterceptorWithValue() throws IOException, HttpException {
30+
AuthorizationInterceptorFilter filter = AuthorizationInterceptorFilter.instance("api-token-test");
31+
HttpRequest req = Mockito.mock(HttpRequest.class);
32+
HttpContext ctx = Mockito.mock(HttpContext.class);
33+
34+
filter.process(req, null, ctx);
35+
Mockito.verify(req, Mockito.times(1)).addHeader(headerNameCaptor.capture(), headerValueCaptor.capture());
36+
37+
List<String> headerNames = headerNameCaptor.getAllValues();
38+
List<String> headerValues = headerValueCaptor.getAllValues();
39+
40+
assertEquals(1, headerNames.size());
41+
assertEquals(1, headerValues.size());
42+
43+
assertThat(headerNames, contains(AuthorizationInterceptorFilter.AUTHORIZATION_HEADER));
44+
assertThat(headerValues, contains("Bearer api-token-test"));
45+
}
46+
47+
@Test(expected = Exception.class)
48+
public void authorizationInterceptorWithoutValue() {
49+
AuthorizationInterceptorFilter filter = AuthorizationInterceptorFilter.instance(null);
50+
}
51+
}

0 commit comments

Comments
 (0)