Skip to content

Commit 01bd9a8

Browse files
Merge pull request #804 from commercetools/configure-http-version
[DEVX-513] configurable protocol version for HTTP clients
2 parents 1775bc8 + 40b2fa0 commit 01bd9a8

File tree

7 files changed

+107
-7
lines changed

7 files changed

+107
-7
lines changed

commercetools/commercetools-apachehttp-client/src/main/java/com/commercetools/http/apachehttp/CtApacheHttpClient.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ public static HttpAsyncClientBuilder createClientBuilder(AsyncClientConnectionMa
5151

5252
public static PoolingAsyncClientConnectionManagerBuilder createConnectionManager(final int maxConnTotal,
5353
final int maxConnPerRoute) {
54+
return createConnectionManager(HttpVersionPolicy.NEGOTIATE, maxConnTotal, maxConnPerRoute);
55+
}
56+
57+
public static PoolingAsyncClientConnectionManagerBuilder createConnectionManager(
58+
final HttpVersionPolicy httpVersionPolicy, final int maxConnTotal, final int maxConnPerRoute) {
5459
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create().useSystemProperties().build();
55-
final TlsConfig tlsConfig = TlsConfig.copy(TlsConfig.DEFAULT)
56-
.setVersionPolicy(HttpVersionPolicy.NEGOTIATE)
57-
.build();
60+
final TlsConfig tlsConfig = TlsConfig.copy(TlsConfig.DEFAULT).setVersionPolicy(httpVersionPolicy).build();
5861
return PoolingAsyncClientConnectionManagerBuilder.create()
5962
.setMaxConnPerRoute(maxConnPerRoute)
6063
.setMaxConnTotal(maxConnTotal)
@@ -74,12 +77,27 @@ public CtApacheHttpClient() {
7477
init();
7578
}
7679

80+
public CtApacheHttpClient(final HttpVersionPolicy versionPolicy) {
81+
super();
82+
apacheHttpClient = createClientBuilder(
83+
createConnectionManager(versionPolicy, MAX_REQUESTS, MAX_REQUESTS).build()).build();
84+
init();
85+
}
86+
7787
public CtApacheHttpClient(final int maxConnTotal, final int maxConnPerRoute) {
7888
super();
7989
apacheHttpClient = createClientBuilder(createConnectionManager(maxConnTotal, maxConnPerRoute).build()).build();
8090
init();
8191
}
8292

93+
public CtApacheHttpClient(final HttpVersionPolicy versionPolicy, final int maxConnTotal,
94+
final int maxConnPerRoute) {
95+
super();
96+
apacheHttpClient = createClientBuilder(
97+
createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build()).build();
98+
init();
99+
}
100+
83101
public CtApacheHttpClient(final BuilderOptions options) {
84102
super();
85103
apacheHttpClient = options.plus(clientBuilder.get()).build();
@@ -94,6 +112,16 @@ public CtApacheHttpClient(final int maxConnTotal, final int maxConnPerRoute, fin
94112
init();
95113
}
96114

115+
public CtApacheHttpClient(final HttpVersionPolicy versionPolicy, final int maxConnTotal, final int maxConnPerRoute,
116+
final BuilderOptions options) {
117+
super();
118+
apacheHttpClient = options
119+
.plus(
120+
createClientBuilder(createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build()))
121+
.build();
122+
init();
123+
}
124+
97125
public CtApacheHttpClient(final Supplier<HttpAsyncClientBuilder> builderSupplier) {
98126
super();
99127
apacheHttpClient = builderSupplier.get().build();
@@ -112,6 +140,14 @@ public CtApacheHttpClient(final ExecutorService executor, final int maxConnTotal
112140
init();
113141
}
114142

143+
public CtApacheHttpClient(final ExecutorService executor, final HttpVersionPolicy versionPolicy,
144+
final int maxConnTotal, final int maxConnPerRoute) {
145+
super(executor);
146+
apacheHttpClient = createClientBuilder(
147+
createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build()).build();
148+
init();
149+
}
150+
115151
public CtApacheHttpClient(final ExecutorService executor, final BuilderOptions options) {
116152
super(executor);
117153
apacheHttpClient = options.plus(clientBuilder.get()).build();
@@ -127,6 +163,16 @@ public CtApacheHttpClient(final ExecutorService executor, final int maxConnTotal
127163
init();
128164
}
129165

166+
public CtApacheHttpClient(final ExecutorService executor, final HttpVersionPolicy versionPolicy,
167+
final int maxConnTotal, final int maxConnPerRoute, final BuilderOptions options) {
168+
super(executor);
169+
apacheHttpClient = options
170+
.plus(
171+
createClientBuilder(createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build()))
172+
.build();
173+
init();
174+
}
175+
130176
public CtApacheHttpClient(final ExecutorService executor, final Supplier<HttpAsyncClientBuilder> builderSupplier) {
131177
super(executor);
132178
apacheHttpClient = builderSupplier.get().build();

commercetools/commercetools-async-http-client/src/main/java/com/commercetools/http/asynchttp/AsyncHttpClientSolutionInfo.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
package com.commercetools.http.asynchttp;
33

44
import io.vrap.rmf.base.client.SolutionInfo;
5-
import io.vrap.rmf.base.client.VersionLoader;
5+
6+
import org.asynchttpclient.config.AsyncHttpClientConfigDefaults;
67

78
public class AsyncHttpClientSolutionInfo extends SolutionInfo {
89

910
public AsyncHttpClientSolutionInfo() {
1011
setName("AsyncHttpAsyncClient");
11-
setVersion(VersionLoader.loadVersionInfo("org.asynchttpclient", "async-http-client", "pom.properties",
12-
"version", this.getClass().getClassLoader()));
12+
setVersion(AsyncHttpClientConfigDefaults.AHC_VERSION);
1313
}
1414
}

commercetools/commercetools-javanet-client/src/main/java/com/commercetools/http/javanet/CtJavaNetHttpClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ public CtJavaNetHttpClient() {
3030
javaHttpClient = clientBuilder.get().build();
3131
}
3232

33+
public CtJavaNetHttpClient(HttpClient.Version version) {
34+
super();
35+
javaHttpClient = clientBuilder.get().version(version).build();
36+
}
37+
3338
public CtJavaNetHttpClient(final BuilderOptions options) {
3439
super();
3540
javaHttpClient = options.plus(clientBuilder.get()).build();

commercetools/commercetools-reactornetty-client/src/main/java/com/commercetools/http/netty/CtNettyHttpClient.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import reactor.core.publisher.Mono;
2626
import reactor.netty.ByteBufMono;
2727
import reactor.netty.NettyOutbound;
28+
import reactor.netty.http.HttpProtocol;
2829
import reactor.netty.http.client.HttpClient;
2930
import reactor.netty.http.client.HttpClientRequest;
3031
import reactor.netty.http.client.HttpClientResponse;
@@ -41,12 +42,22 @@ public CtNettyHttpClient() {
4142
this(MAX_REQUESTS);
4243
}
4344

44-
public CtNettyHttpClient(int maxConnections) {
45+
public CtNettyHttpClient(HttpProtocol protocol) {
46+
this(protocol, MAX_REQUESTS);
47+
}
48+
49+
public CtNettyHttpClient(final int maxConnections) {
4550
super();
4651
this.nettyClient = createDefaultClient(maxConnections);
4752
this.nettyClient.warmup();
4853
}
4954

55+
public CtNettyHttpClient(final HttpProtocol protocol, final int maxConnections) {
56+
super();
57+
this.nettyClient = createDefaultClient(protocol, maxConnections);
58+
this.nettyClient.warmup();
59+
}
60+
5061
public CtNettyHttpClient(final BuilderOptions options) {
5162
this(MAX_REQUESTS, options);
5263
}
@@ -73,6 +84,12 @@ public CtNettyHttpClient(final ExecutorService executor, final int maxConnection
7384
this.nettyClient.warmup();
7485
}
7586

87+
public CtNettyHttpClient(final ExecutorService executor, final HttpProtocol protocol, final int maxConnections) {
88+
super(executor);
89+
this.nettyClient = createDefaultClient(protocol, maxConnections);
90+
this.nettyClient.warmup();
91+
}
92+
7693
public CtNettyHttpClient(final ExecutorService executor, final BuilderOptions options) {
7794
this(executor, MAX_REQUESTS, options);
7895
}
@@ -83,6 +100,13 @@ public CtNettyHttpClient(final ExecutorService executor, final int maxConnection
83100
this.nettyClient.warmup();
84101
}
85102

103+
public CtNettyHttpClient(final ExecutorService executor, final HttpProtocol protocol, final int maxConnections,
104+
final BuilderOptions options) {
105+
super(executor);
106+
this.nettyClient = options.plus(createDefaultClient(protocol, maxConnections));
107+
this.nettyClient.warmup();
108+
}
109+
86110
public CtNettyHttpClient(final ExecutorService executor, final Supplier<HttpClient> httpClientSupplier) {
87111
super(executor);
88112
this.nettyClient = httpClientSupplier.get();
@@ -97,6 +121,10 @@ public static HttpClient createDefaultClient(final int maxConnections) {
97121
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000);
98122
}
99123

124+
public static HttpClient createDefaultClient(final HttpProtocol httpProtocol, final int maxConnections) {
125+
return createDefaultClient(maxConnections).protocol(httpProtocol);
126+
}
127+
100128
@Override
101129
public CompletableFuture<ApiHttpResponse<byte[]>> execute(ApiHttpRequest request) {
102130
final HttpMethod method = HttpMethod.valueOf(request.getMethod().name());

commercetools/internal-docs/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ dependencies {
55
implementation project(":commercetools:commercetools-http-client")
66
implementation project(":commercetools:commercetools-okhttp-client4")
77
implementation project(":commercetools:commercetools-apachehttp-client")
8+
implementation project(":commercetools:commercetools-reactornetty-client")
89
implementation project(":commercetools:commercetools-sdk-compat-v1")
910
implementation project(":commercetools:commercetools-graphql-api")
1011
implementation project(":commercetools:commercetools-monitoring-newrelic")
1112
implementation project(":commercetools:commercetools-monitoring-datadog")
1213

1314
testImplementation ctsdkv1.client version ctsdkv1.version
1415
implementation ctsdkv1.models version ctsdkv1.version
16+
testImplementation project(":commercetools:commercetools-javanet-client")
1517

1618
testImplementation commons.io version commons.io_version
1719

commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/ClientTuning.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@
6565
* <p>The third option is to use the timeout functionality of the futures</p>
6666
*
6767
* {@include.example example.ExamplesTest#timeoutFuture()}
68+
*
69+
* <h3 id=http-version>HTTP protocol version</h3>
70+
*
71+
* <p>In case it's needed so specify a specific HTTP protocol version this can be done through the HTTP client package itself.</p>
72+
*
73+
* {@include.example example.ExamplesTest#httpVersion()}
74+
*
75+
* <p>The AsyncHttpClient and OkHttp packages use HTTP1.1 by default.</p>
6876
*/
6977
public class ClientTuning {
7078
}

commercetools/internal-docs/src/test/java/example/ExamplesTest.java

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

99
import java.net.InetSocketAddress;
1010
import java.net.Proxy;
11+
import java.net.http.HttpClient;
1112
import java.time.Duration;
1213
import java.util.Arrays;
1314
import java.util.Collections;
@@ -35,6 +36,8 @@
3536
import com.commercetools.api.models.project.Project;
3637
import com.commercetools.api.models.tax_category.TaxCategoryPagedQueryResponse;
3738
import com.commercetools.http.apachehttp.CtApacheHttpClient;
39+
import com.commercetools.http.javanet.CtJavaNetHttpClient;
40+
import com.commercetools.http.netty.CtNettyHttpClient;
3841
import com.commercetools.http.okhttp4.CtOkHttp4Client;
3942

4043
import io.vrap.rmf.base.client.*;
@@ -43,13 +46,15 @@
4346

4447
import org.apache.commons.lang3.tuple.Pair;
4548
import org.apache.hc.client5.http.config.RequestConfig;
49+
import org.apache.hc.core5.http2.HttpVersionPolicy;
4650
import org.apache.hc.core5.util.Timeout;
4751
import org.assertj.core.api.Assertions;
4852
import org.junit.jupiter.api.Test;
4953
import org.slf4j.event.Level;
5054

5155
import dev.failsafe.Failsafe;
5256
import dev.failsafe.FailsafeExecutor;
57+
import reactor.netty.http.HttpProtocol;
5358

5459
public class ExamplesTest {
5560

@@ -623,4 +628,10 @@ public void mdcProjectApiRoot() {
623628
ProjectApiRoot globalRoot = ProjectApiRoot.of("test");
624629
ProjectApiRoot apiRoot = ProjectApiRoot.withContext(globalRoot, new MDCContext());
625630
}
631+
632+
public void httpVersion() {
633+
CtApacheHttpClient apacheHttpClient = new CtApacheHttpClient(HttpVersionPolicy.FORCE_HTTP_1);
634+
CtNettyHttpClient nettyHttpClient = new CtNettyHttpClient(HttpProtocol.HTTP11);
635+
CtJavaNetHttpClient javaNetHttpClient = new CtJavaNetHttpClient(HttpClient.Version.HTTP_1_1);
636+
}
626637
}

0 commit comments

Comments
 (0)