Skip to content

Commit 62c8584

Browse files
committed
First pass adding config hooks interface
1 parent 4ae7bee commit 62c8584

File tree

4 files changed

+155
-8
lines changed

4 files changed

+155
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
The format is based on [Keep a Changelog](http://keepachangelog.com/)
33
and this project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## 3.1.3 (08/11/2021)
6+
- [Issue-55](https://github.com/SourceLabOrg/kafka-connect-client/issues/55) Create new HttpContext for every request.
7+
-
8+
59
## 3.1.2 (07/21/2021)
610

711
- [Issue-54](https://github.com/SourceLabOrg/kafka-connect-client/issues/54) Resolution for issue-54
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.sourcelab.kafka.connect.apiclient.rest;
2+
3+
/**
4+
* Default implementation makes no modifications.
5+
*/
6+
public class DefaultHttpClientConfigHooks implements HttpClientConfigHooks {
7+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package org.sourcelab.kafka.connect.apiclient.rest;
2+
3+
import org.apache.http.client.AuthCache;
4+
import org.apache.http.client.CredentialsProvider;
5+
import org.apache.http.client.config.RequestConfig;
6+
import org.apache.http.client.protocol.HttpClientContext;
7+
import org.apache.http.impl.client.BasicAuthCache;
8+
import org.apache.http.impl.client.BasicCredentialsProvider;
9+
import org.apache.http.impl.client.HttpClientBuilder;
10+
import org.sourcelab.kafka.connect.apiclient.Configuration;
11+
12+
/**
13+
* HttpClient configuration hooks.
14+
*
15+
* Provides an interface for modifying how the underlying HttpClient instance is created.
16+
*/
17+
public interface HttpClientConfigHooks {
18+
/**
19+
* Create HttpClientBuilder instance.
20+
* @param configuration KafkaConnectClient configuration.
21+
* @return HttpClientBuilder instance.
22+
*/
23+
default HttpClientBuilder createHttpClientBuilder(final Configuration configuration) {
24+
return HttpClientBuilder.create();
25+
}
26+
27+
/**
28+
* Create HttpsContextBuilder instance.
29+
* @param configuration KafkaConnectClient configuration.
30+
* @return HttpsContextBuilder instance.
31+
*/
32+
default HttpsContextBuilder createHttpsContextBuilder(final Configuration configuration) {
33+
return new HttpsContextBuilder(configuration);
34+
}
35+
36+
/**
37+
* Create RequestConfig.Builder instance.
38+
* @param configuration KafkaConnectClient configuration.
39+
* @return RequestConfig.Builder instance.
40+
*/
41+
default RequestConfig.Builder createRequestConfigBuilder(final Configuration configuration) {
42+
return RequestConfig.custom();
43+
}
44+
45+
/**
46+
* Create AuthCache instance.
47+
* @param configuration KafkaConnectClient configuration.
48+
* @return AuthCache instance.
49+
*/
50+
default AuthCache createAuthCache(final Configuration configuration) {
51+
return new BasicAuthCache();
52+
}
53+
54+
/**
55+
* Create CredentialsProvider instance.
56+
* @param configuration KafkaConnectClient configuration.
57+
* @return CredentialsProvider instance.
58+
*/
59+
default CredentialsProvider createCredentialsProvider(final Configuration configuration) {
60+
return new BasicCredentialsProvider();
61+
}
62+
63+
/**
64+
* Create HttpClientContext instance.
65+
* @param configuration KafkaConnectClient configuration.
66+
* @return HttpClientContext instance.
67+
*/
68+
default HttpClientContext createHttpClientContext(final Configuration configuration) {
69+
return HttpClientContext.create();
70+
}
71+
72+
/**
73+
* Ability to modify or replace the AuthCache instance after initial configuration has been performed on it.
74+
* @param configuration KafkaConnectClient configuration.
75+
* @return AuthCache instance.
76+
*/
77+
default AuthCache modifyAuthCache(final Configuration configuration, final AuthCache authCache) {
78+
return authCache;
79+
}
80+
81+
/**
82+
* Ability to modify or replace the CredentialsProvider instance after initial configuration has been performed on it.
83+
* @param configuration KafkaConnectClient configuration.
84+
* @return CredentialsProvider instance.
85+
*/
86+
default CredentialsProvider modifyCredentialsProvider(final Configuration configuration, final CredentialsProvider credentialsProvider) {
87+
return credentialsProvider;
88+
}
89+
90+
/**
91+
* Ability to modify or replace the RequestConfig.Builder instance after initial configuration has been performed on it.
92+
* @param configuration KafkaConnectClient configuration.
93+
* @return RequestConfig.Builder instance.
94+
*/
95+
default RequestConfig.Builder modifyRequestConfig(final Configuration configuration, final RequestConfig.Builder builder) {
96+
return builder;
97+
}
98+
99+
/**
100+
* Ability to modify or replace the HttpClientBuilder instance after initial configuration has been performed on it.
101+
* @param configuration KafkaConnectClient configuration.
102+
* @return HttpClientBuilder instance.
103+
*/
104+
default HttpClientBuilder modifyHttpClientBuilder(final Configuration configuration, final HttpClientBuilder builder) {
105+
return builder;
106+
}
107+
108+
/**
109+
* Ability to modify or replace the HttpClientContext instance after initial configuration has been performed on it.
110+
* @param configuration KafkaConnectClient configuration.
111+
* @return HttpClientContext instance.
112+
*/
113+
default HttpClientContext modifyHttpClientContext(final Configuration configuration, final HttpClientContext context) {
114+
return context;
115+
}
116+
}

src/main/java/org/sourcelab/kafka/connect/apiclient/rest/HttpClientRestClient.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,24 @@ public class HttpClientRestClient implements RestClient {
9696
*/
9797
private CredentialsProvider credsProvider;
9898

99+
/**
100+
* Provides an interface for modifying how the underlying HttpClient instance is created.
101+
*/
102+
private final HttpClientConfigHooks configHooks;
103+
99104
/**
100105
* Constructor.
101106
*/
102107
public HttpClientRestClient() {
108+
this(new DefaultHttpClientConfigHooks());
109+
}
110+
111+
/**
112+
* Constructor allowing for injecting configuration hooks.
113+
* @param configHooks For hooking/overriding into how the underlying HttpClient is configured.
114+
*/
115+
public HttpClientRestClient(final HttpClientConfigHooks configHooks) {
116+
this.configHooks = configHooks;
103117
}
104118

105119
/**
@@ -113,10 +127,10 @@ public void init(final Configuration configuration) {
113127
this.configuration = configuration;
114128

115129
// Create https context builder utility.
116-
final HttpsContextBuilder httpsContextBuilder = new HttpsContextBuilder(configuration);
130+
final HttpsContextBuilder httpsContextBuilder = configHooks.createHttpsContextBuilder(configuration);
117131

118-
// Setup client builder
119-
final HttpClientBuilder clientBuilder = createHttpClientBuilder();
132+
// Create and setup client builder
133+
HttpClientBuilder clientBuilder = configHooks.createHttpClientBuilder(configuration);
120134
clientBuilder
121135
// Define timeout
122136
.setConnectionTimeToLive(configuration.getConnectionTimeToLiveInSeconds(), TimeUnit.SECONDS)
@@ -125,15 +139,15 @@ public void init(final Configuration configuration) {
125139
.setSSLSocketFactory(httpsContextBuilder.createSslSocketFactory());
126140

127141
// Define our RequestConfigBuilder
128-
final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
142+
RequestConfig.Builder requestConfigBuilder = configHooks.createRequestConfigBuilder(configuration);
129143

130144
requestConfigBuilder.setConnectTimeout(configuration.getRequestTimeoutInSeconds() * 1_000);
131145

132146
// Define our Credentials Provider
133-
credsProvider = new BasicCredentialsProvider();
147+
credsProvider = configHooks.createCredentialsProvider(configuration);
134148

135149
// Define our auth cache
136-
authCache = new BasicAuthCache();
150+
authCache = configHooks.createAuthCache(configuration);
137151

138152
// If we have a configured proxy host
139153
if (configuration.getProxyHost() != null) {
@@ -186,13 +200,19 @@ public void init(final Configuration configuration) {
186200
}
187201
}
188202

203+
// Call Modify hooks
204+
authCache = configHooks.modifyAuthCache(configuration, authCache);
205+
credsProvider = configHooks.modifyCredentialsProvider(configuration, credsProvider);
206+
requestConfigBuilder = configHooks.modifyRequestConfig(configuration, requestConfigBuilder);
207+
189208
// Attach Credentials provider to client builder.
190209
clientBuilder.setDefaultCredentialsProvider(credsProvider);
191210

192211
// Attach default request config
193212
clientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());
194213

195214
// build http client
215+
clientBuilder = configHooks.modifyHttpClientBuilder(configuration, clientBuilder);
196216
httpClient = clientBuilder.build();
197217
}
198218

@@ -407,12 +427,12 @@ private String constructApiUrl(final String endPoint) {
407427
*/
408428
private HttpClientContext createHttpClientContext() {
409429
// Define our context
410-
final HttpClientContext httpClientContext = HttpClientContext.create();
430+
final HttpClientContext httpClientContext = configHooks.createHttpClientContext(configuration);
411431

412432
// Configure context.
413433
httpClientContext.setAuthCache(authCache);
414434
httpClientContext.setCredentialsProvider(credsProvider);
415435

416-
return httpClientContext;
436+
return configHooks.modifyHttpClientContext(configuration, httpClientContext);
417437
}
418438
}

0 commit comments

Comments
 (0)