Skip to content

Commit ec9f979

Browse files
authored
Merge pull request #682 from ahazeltonNF/#679-Use-correct-httpClient5-poolingConnectionManager
#679 switch out PoolingHttpClientConnectionManager with one that supports ziti
2 parents d2ab550 + 869410c commit ec9f979

File tree

5 files changed

+34
-409
lines changed

5 files changed

+34
-409
lines changed

samples/ziti-spring-boot-client/src/main/java/org/openziti/sample/springboot/client/config/SampleConfiguration.java

Lines changed: 0 additions & 39 deletions
This file was deleted.

ziti-springboot-client/src/main/java/org/openziti/springboot/client/web/config/ZitiHttpClientConfiguration.java

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,37 @@
1919
import java.io.IOException;
2020
import java.net.InetAddress;
2121
import java.net.UnknownHostException;
22+
import java.security.KeyManagementException;
23+
import java.security.KeyStoreException;
24+
import java.security.NoSuchAlgorithmException;
2225
import java.util.Iterator;
2326
import java.util.Optional;
2427
import java.util.concurrent.TimeUnit;
2528
import org.apache.hc.client5.http.ConnectionKeepAliveStrategy;
2629
import org.apache.hc.client5.http.DnsResolver;
30+
import org.apache.hc.client5.http.SchemePortResolver;
2731
import org.apache.hc.client5.http.classic.HttpClient;
2832
import org.apache.hc.client5.http.config.RequestConfig;
2933
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
3034
import org.apache.hc.client5.http.impl.classic.HttpClients;
35+
import org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator;
3136
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
32-
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
37+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
38+
import org.apache.hc.client5.http.io.HttpClientConnectionOperator;
39+
import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
40+
import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
41+
import org.apache.hc.client5.http.ssl.TrustAllStrategy;
3342
import org.apache.hc.core5.http.HeaderElement;
3443
import org.apache.hc.core5.http.HeaderElements;
3544
import org.apache.hc.core5.http.URIScheme;
36-
import org.apache.hc.core5.http.config.Registry;
3745
import org.apache.hc.core5.http.config.RegistryBuilder;
3846
import org.apache.hc.core5.http.message.MessageSupport;
3947
import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
4048
import org.apache.hc.core5.pool.PoolReusePolicy;
49+
import org.apache.hc.core5.ssl.SSLContextBuilder;
4150
import org.apache.hc.core5.util.TimeValue;
4251
import org.openziti.Ziti;
4352
import org.openziti.ZitiContext;
44-
import org.openziti.springboot.client.web.httpclient.ZitiConnectionSocketFactory;
45-
import org.openziti.springboot.client.web.httpclient.ZitiSSLConnectionSocketFactory;
4653
import org.springframework.beans.factory.BeanCreationException;
4754
import org.springframework.beans.factory.annotation.Qualifier;
4855
import org.springframework.beans.factory.annotation.Value;
@@ -70,9 +77,6 @@ public class ZitiHttpClientConfiguration {
7077
// The default time to keep a connection alive.
7178
private static final long DEFAULT_KEEP_ALIVE_TIME_MILLIS = 20 * 1000;
7279

73-
private ZitiConnectionSocketFactory zitiConnectionSocketFactory;
74-
private ZitiSSLConnectionSocketFactory zitiSSLConnectionSocketFactory;
75-
7680
@ConditionalOnProperty(value = "spring.ziti.client.rest-template.enabled", havingValue = "true", matchIfMissing = true)
7781
@Bean
7882
public RestTemplate zitiRestTemplate(@Qualifier("zitiRestTemplateBuilder") RestTemplateBuilder restTemplateBuilder) {
@@ -107,42 +111,39 @@ public ZitiContext context(@Value("${spring.ziti.client.identity.file:}") Resour
107111
return Ziti.newContext(identityFile.getInputStream(), password.toCharArray());
108112
}
109113

110-
@ConditionalOnProperty(value = "spring.ziti.client.connection-factory.enabled", havingValue = "true", matchIfMissing = true)
111-
@Bean("zitiConnectionSocketFactory")
112-
public ZitiConnectionSocketFactory connectionSocketFactory(ZitiContext zitiContext) {
113-
if (zitiConnectionSocketFactory == null) {
114-
zitiConnectionSocketFactory = new ZitiConnectionSocketFactory(zitiContext);
115-
}
116-
return zitiConnectionSocketFactory;
117-
}
118-
119-
@ConditionalOnProperty(value = "spring.ziti.client.ssl-connection-factory.enabled", havingValue = "true", matchIfMissing = true)
120-
@Bean("zitiSSLConnectionSocketFactory")
121-
public ZitiSSLConnectionSocketFactory sslConnectionSocketFactory(ZitiContext zitiContext) {
122-
if (zitiSSLConnectionSocketFactory == null) {
123-
zitiSSLConnectionSocketFactory = new ZitiSSLConnectionSocketFactory(zitiContext);
124-
}
125-
return zitiSSLConnectionSocketFactory;
114+
@ConditionalOnProperty(value = "spring.ziti.client.tls-socket-strategy.enabled", havingValue = "true", matchIfMissing = true)
115+
@Bean("zitiTlsSocketStrategy")
116+
public TlsSocketStrategy zitiTlsSocketStrategy() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
117+
return new DefaultClientTlsStrategy(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build());
126118
}
127119

128120
@ConditionalOnProperty(value = "spring.ziti.client.connection-manager.enabled", havingValue = "true", matchIfMissing = true)
129121
@Bean("zitiPoolingConnectionManager")
130122
public PoolingHttpClientConnectionManager poolingConnectionManager(
131-
@Qualifier("zitiConnectionSocketFactory") ZitiConnectionSocketFactory zitiConnectionSocketFactory,
132-
@Qualifier("zitiSSLConnectionSocketFactory") ZitiSSLConnectionSocketFactory zitiSSLConnectionSocketFactory,
133123
@Qualifier("zitiDnsResolver") DnsResolver zitiDnsResolver,
124+
@Qualifier("zitiTlsSocketStrategy") TlsSocketStrategy zitiTlsSocketStrategy,
134125
@Value("${spring.ziti.client.httpclient.max-total:}") Integer maxTotal,
135126
@Value("${spring.ziti.client.httpclient.max-per-route:}") Integer maxPerRoute) {
136127

137-
final Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
138-
.register(URIScheme.HTTPS.getId(), zitiSSLConnectionSocketFactory)
139-
.register(URIScheme.HTTP.getId(), zitiConnectionSocketFactory)
128+
final PoolingHttpClientConnectionManagerBuilder connectionManagerBuilder = new PoolingHttpClientConnectionManagerBuilder() {
129+
@Override
130+
protected HttpClientConnectionOperator createConnectionOperator(
131+
SchemePortResolver schemePortResolver, DnsResolver dnsResolver, TlsSocketStrategy tlsSocketStrategy) {
132+
return new DefaultHttpClientConnectionOperator(
133+
proxy -> Ziti.getSocketFactory().createSocket(),
134+
schemePortResolver,
135+
dnsResolver,
136+
RegistryBuilder.<TlsSocketStrategy>create()
137+
.register(URIScheme.HTTPS.id, tlsSocketStrategy)
138+
.build());
139+
}
140+
};
141+
final PoolingHttpClientConnectionManager poolingConnectionManager = connectionManagerBuilder
142+
.setDnsResolver(zitiDnsResolver)
143+
.setTlsSocketStrategy(zitiTlsSocketStrategy)
144+
.setConnPoolPolicy(PoolReusePolicy.LIFO)
145+
.setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
140146
.build();
141-
142-
final PoolingHttpClientConnectionManager poolingConnectionManager =
143-
new PoolingHttpClientConnectionManager(socketFactoryRegistry, PoolConcurrencyPolicy.STRICT, PoolReusePolicy.LIFO,
144-
TimeValue.NEG_ONE_MILLISECOND, null, zitiDnsResolver, null);
145-
146147
Optional.ofNullable(maxTotal).ifPresent(poolingConnectionManager::setMaxTotal);
147148
Optional.ofNullable(maxPerRoute).ifPresent(poolingConnectionManager::setDefaultMaxPerRoute);
148149
return poolingConnectionManager;
@@ -185,12 +186,6 @@ public CloseableHttpClient httpClient(
185186
.build();
186187
}
187188

188-
@PreDestroy
189-
public void destroy() {
190-
Optional.ofNullable(zitiConnectionSocketFactory).ifPresent(ZitiConnectionSocketFactory::shutdown);
191-
Optional.ofNullable(zitiSSLConnectionSocketFactory).ifPresent(ZitiSSLConnectionSocketFactory::shutdown);
192-
}
193-
194189
@ConditionalOnProperty(value = "spring.ziti.client.dns-resolver.enabled", havingValue = "true", matchIfMissing = true)
195190
@Bean("zitiDnsResolver")
196191
public static DnsResolver dnsResolver() {

ziti-springboot-client/src/main/java/org/openziti/springboot/client/web/httpclient/AbstractZitiConnectionSocketFactory.java

Lines changed: 0 additions & 115 deletions
This file was deleted.

ziti-springboot-client/src/main/java/org/openziti/springboot/client/web/httpclient/ZitiConnectionSocketFactory.java

Lines changed: 0 additions & 99 deletions
This file was deleted.

0 commit comments

Comments
 (0)