Skip to content

Commit 3b0cb76

Browse files
author
Leo
committed
Add connectionConfigCallback of TransportBuilder
Signed-off-by: Leo <yggb159@gmail.com>
1 parent 1109526 commit 3b0cb76

2 files changed

Lines changed: 42 additions & 31 deletions

File tree

java-client/src/main/java/org/opensearch/client/transport/httpclient5/ApacheHttpClient5TransportBuilder.java

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
package org.opensearch.client.transport.httpclient5;
1010

11+
import javax.net.ssl.SSLContext;
1112
import java.security.AccessController;
1213
import java.security.NoSuchAlgorithmException;
1314
import java.security.PrivilegedAction;
@@ -16,19 +17,17 @@
1617
import java.util.Objects;
1718
import java.util.Optional;
1819
import java.util.stream.Collectors;
19-
import javax.net.ssl.SSLContext;
20-
import javax.net.ssl.SSLEngine;
21-
import org.apache.hc.client5.http.auth.CredentialsProvider;
20+
import org.apache.hc.client5.http.config.ConnectionConfig;
2221
import org.apache.hc.client5.http.config.RequestConfig;
2322
import org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy;
2423
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
2524
import org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder;
25+
import org.apache.hc.client5.http.impl.async.InternalHttpAsyncClient;
2626
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
2727
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
2828
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
2929
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
3030
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
31-
import org.apache.hc.core5.function.Factory;
3231
import org.apache.hc.core5.http.Header;
3332
import org.apache.hc.core5.http.HttpHost;
3433
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
@@ -65,6 +64,7 @@ public class ApacheHttpClient5TransportBuilder {
6564
private ApacheHttpClient5Transport.FailureListener failureListener;
6665
private HttpClientConfigCallback httpClientConfigCallback;
6766
private RequestConfigCallback requestConfigCallback;
67+
private ConnectionConfigCallback connectionConfigCallback;
6868
private String pathPrefix;
6969
private NodeSelector nodeSelector = NodeSelector.ANY;
7070
private boolean strictDeprecationMode = false;
@@ -144,6 +144,18 @@ public ApacheHttpClient5TransportBuilder setRequestConfigCallback(RequestConfigC
144144
return this;
145145
}
146146

147+
/**
148+
* Sets the {@link ConnectionConfigCallback} to be used to customize http client configuration
149+
*
150+
* @param connectionConfigCallback the {@link ConnectionConfigCallback} to be used
151+
* @throws NullPointerException if {@code connectionConfigCallback} is {@code null}.
152+
*/
153+
public ApacheHttpClient5TransportBuilder setConnectionConfigCallback(ConnectionConfigCallback connectionConfigCallback) {
154+
Objects.requireNonNull(connectionConfigCallback, "connectionConfigCallback must not be null");
155+
this.connectionConfigCallback = connectionConfigCallback;
156+
return this;
157+
}
158+
147159
/**
148160
* Sets the path's prefix for every request used by the http client.
149161
* <p>
@@ -324,24 +336,25 @@ private CloseableHttpAsyncClient createHttpClient() {
324336
// default timeouts are all infinite
325337
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom()
326338
.setResponseTimeout(Timeout.ofMilliseconds(DEFAULT_RESPONSE_TIMEOUT_MILLIS));
339+
ConnectionConfig.Builder connectionConfigBuilder = ConnectionConfig.custom();
327340

328341
if (requestConfigCallback != null) {
329342
requestConfigBuilder = requestConfigCallback.customizeRequestConfig(requestConfigBuilder);
330343
}
331344

345+
if (connectionConfigCallback != null) {
346+
connectionConfigBuilder = connectionConfigCallback.customizeConnectionConfig(connectionConfigBuilder);
347+
}
348+
332349
try {
333350
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
334351
.setSslContext(SSLContext.getDefault())
335352
// See https://issues.apache.org/jira/browse/HTTPCLIENT-2219
336-
.setTlsDetailsFactory(new Factory<SSLEngine, TlsDetails>() {
337-
@Override
338-
public TlsDetails create(final SSLEngine sslEngine) {
339-
return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol());
340-
}
341-
})
353+
.setTlsDetailsFactory(sslEngine -> new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol()))
342354
.build();
343355

344356
final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder.create()
357+
.setDefaultConnectionConfig(connectionConfigBuilder.build())
345358
.setMaxConnPerRoute(DEFAULT_MAX_CONN_PER_ROUTE)
346359
.setMaxConnTotal(DEFAULT_MAX_CONN_TOTAL)
347360
.setTlsStrategy(tlsStrategy)
@@ -379,16 +392,27 @@ public interface RequestConfigCallback {
379392
}
380393

381394
/**
382-
* Callback used to customize the {@link CloseableHttpClient} instance used by a {@link RestClient} instance.
395+
* Callback used to customize the default {@link ConnectionConfig} that will be set on the {@link CloseableHttpClient}.
396+
* @see PoolingAsyncClientConnectionManagerBuilder#setDefaultConnectionConfig
397+
*/
398+
public interface ConnectionConfigCallback {
399+
/**
400+
* Allows to customize the {@link ConnectionConfig} used by the connection manager of the {@link InternalHttpAsyncClient}.
401+
* Commonly used to adjust connection-related settings without losing other default values
402+
*
403+
* @param connectionConfigBuilder the {@link ConnectionConfig.Builder} for customizing the connection configuration.
404+
*/
405+
ConnectionConfig.Builder customizeConnectionConfig(ConnectionConfig.Builder connectionConfigBuilder);
406+
}
407+
408+
/**
409+
* Callback used to customize the {@link CloseableHttpClient} instance used by a {@link InternalHttpAsyncClient} instance.
383410
* Allows to customize default {@link RequestConfig} being set to the client and any parameter that
384411
* can be set through {@link HttpClientBuilder}
385412
*/
386413
public interface HttpClientConfigCallback {
387414
/**
388-
* Allows to customize the {@link CloseableHttpAsyncClient} being created and used by the {@link RestClient}.
389-
* Commonly used to customize the default {@link CredentialsProvider} for authentication for communication
390-
* through TLS/SSL without losing any other useful default value that the {@link RestClientBuilder} internally
391-
* sets, like connection pooling.
415+
* Allows to customize the {@link CloseableHttpAsyncClient} being created and used by the {@link InternalHttpAsyncClient}.
392416
*
393417
* @param httpClientBuilder the {@link HttpClientBuilder} for customizing the client instance.
394418
*/

java-client/src/test/java/org/opensearch/client/transport/httpclient5/ApacheHttpClient5TransportBuilderTest.java

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
import com.fasterxml.jackson.databind.JsonNode;
44
import org.apache.hc.client5.http.ConnectTimeoutException;
5-
import org.apache.hc.client5.http.config.ConnectionConfig;
6-
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
7-
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
85
import org.apache.hc.core5.http.HttpHost;
96
import org.apache.hc.core5.util.Timeout;
107
import org.junit.Test;
@@ -23,19 +20,9 @@ public void timeOutTest() {
2320
String expectMessage = expectTime + " MILLISECONDS";
2421

2522
ApacheHttpClient5Transport apacheHttpClient5Transport = ApacheHttpClient5TransportBuilder.builder(new HttpHost("10.255.255.1", 9200))
26-
.setHttpClientConfigCallback(httpClientBuilder -> {
27-
28-
ConnectionConfig connectionConfig = ConnectionConfig.custom()
29-
.setConnectTimeout(Timeout.ofMilliseconds(expectTime))
30-
.build();
31-
32-
PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
33-
.create()
34-
.setDefaultConnectionConfig(connectionConfig)
35-
.build();
36-
37-
return httpClientBuilder.setConnectionManager(connectionManager);
38-
}).build();
23+
.setConnectionConfigCallback(connectionConfigBuilder -> connectionConfigBuilder
24+
.setConnectTimeout(Timeout.ofMilliseconds(expectTime)))
25+
.build();
3926

4027
OpenSearchClient osClient = new OpenSearchClient(apacheHttpClient5Transport);
4128

0 commit comments

Comments
 (0)