diff --git a/commercetools/commercetools-apachehttp-client/src/main/java/com/commercetools/http/apachehttp/CtApacheHttpClient.java b/commercetools/commercetools-apachehttp-client/src/main/java/com/commercetools/http/apachehttp/CtApacheHttpClient.java index 6401f0a9775..3acbc19d46a 100644 --- a/commercetools/commercetools-apachehttp-client/src/main/java/com/commercetools/http/apachehttp/CtApacheHttpClient.java +++ b/commercetools/commercetools-apachehttp-client/src/main/java/com/commercetools/http/apachehttp/CtApacheHttpClient.java @@ -51,10 +51,13 @@ public static HttpAsyncClientBuilder createClientBuilder(AsyncClientConnectionMa public static PoolingAsyncClientConnectionManagerBuilder createConnectionManager(final int maxConnTotal, final int maxConnPerRoute) { + return createConnectionManager(HttpVersionPolicy.NEGOTIATE, maxConnTotal, maxConnPerRoute); + } + + public static PoolingAsyncClientConnectionManagerBuilder createConnectionManager( + final HttpVersionPolicy httpVersionPolicy, final int maxConnTotal, final int maxConnPerRoute) { final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create().useSystemProperties().build(); - final TlsConfig tlsConfig = TlsConfig.copy(TlsConfig.DEFAULT) - .setVersionPolicy(HttpVersionPolicy.NEGOTIATE) - .build(); + final TlsConfig tlsConfig = TlsConfig.copy(TlsConfig.DEFAULT).setVersionPolicy(httpVersionPolicy).build(); return PoolingAsyncClientConnectionManagerBuilder.create() .setMaxConnPerRoute(maxConnPerRoute) .setMaxConnTotal(maxConnTotal) @@ -74,12 +77,27 @@ public CtApacheHttpClient() { init(); } + public CtApacheHttpClient(final HttpVersionPolicy versionPolicy) { + super(); + apacheHttpClient = createClientBuilder( + createConnectionManager(versionPolicy, MAX_REQUESTS, MAX_REQUESTS).build()).build(); + init(); + } + public CtApacheHttpClient(final int maxConnTotal, final int maxConnPerRoute) { super(); apacheHttpClient = createClientBuilder(createConnectionManager(maxConnTotal, maxConnPerRoute).build()).build(); init(); } + public CtApacheHttpClient(final HttpVersionPolicy versionPolicy, final int maxConnTotal, + final int maxConnPerRoute) { + super(); + apacheHttpClient = createClientBuilder( + createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build()).build(); + init(); + } + public CtApacheHttpClient(final BuilderOptions options) { super(); apacheHttpClient = options.plus(clientBuilder.get()).build(); @@ -94,6 +112,16 @@ public CtApacheHttpClient(final int maxConnTotal, final int maxConnPerRoute, fin init(); } + public CtApacheHttpClient(final HttpVersionPolicy versionPolicy, final int maxConnTotal, final int maxConnPerRoute, + final BuilderOptions options) { + super(); + apacheHttpClient = options + .plus( + createClientBuilder(createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build())) + .build(); + init(); + } + public CtApacheHttpClient(final Supplier builderSupplier) { super(); apacheHttpClient = builderSupplier.get().build(); @@ -112,6 +140,14 @@ public CtApacheHttpClient(final ExecutorService executor, final int maxConnTotal init(); } + public CtApacheHttpClient(final ExecutorService executor, final HttpVersionPolicy versionPolicy, + final int maxConnTotal, final int maxConnPerRoute) { + super(executor); + apacheHttpClient = createClientBuilder( + createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build()).build(); + init(); + } + public CtApacheHttpClient(final ExecutorService executor, final BuilderOptions options) { super(executor); apacheHttpClient = options.plus(clientBuilder.get()).build(); @@ -127,6 +163,16 @@ public CtApacheHttpClient(final ExecutorService executor, final int maxConnTotal init(); } + public CtApacheHttpClient(final ExecutorService executor, final HttpVersionPolicy versionPolicy, + final int maxConnTotal, final int maxConnPerRoute, final BuilderOptions options) { + super(executor); + apacheHttpClient = options + .plus( + createClientBuilder(createConnectionManager(versionPolicy, maxConnTotal, maxConnPerRoute).build())) + .build(); + init(); + } + public CtApacheHttpClient(final ExecutorService executor, final Supplier builderSupplier) { super(executor); apacheHttpClient = builderSupplier.get().build(); diff --git a/commercetools/commercetools-async-http-client/src/main/java/com/commercetools/http/asynchttp/AsyncHttpClientSolutionInfo.java b/commercetools/commercetools-async-http-client/src/main/java/com/commercetools/http/asynchttp/AsyncHttpClientSolutionInfo.java index ceaa22852e3..35e1d83047d 100644 --- a/commercetools/commercetools-async-http-client/src/main/java/com/commercetools/http/asynchttp/AsyncHttpClientSolutionInfo.java +++ b/commercetools/commercetools-async-http-client/src/main/java/com/commercetools/http/asynchttp/AsyncHttpClientSolutionInfo.java @@ -2,13 +2,13 @@ package com.commercetools.http.asynchttp; import io.vrap.rmf.base.client.SolutionInfo; -import io.vrap.rmf.base.client.VersionLoader; + +import org.asynchttpclient.config.AsyncHttpClientConfigDefaults; public class AsyncHttpClientSolutionInfo extends SolutionInfo { public AsyncHttpClientSolutionInfo() { setName("AsyncHttpAsyncClient"); - setVersion(VersionLoader.loadVersionInfo("org.asynchttpclient", "async-http-client", "pom.properties", - "version", this.getClass().getClassLoader())); + setVersion(AsyncHttpClientConfigDefaults.AHC_VERSION); } } diff --git a/commercetools/commercetools-javanet-client/src/main/java/com/commercetools/http/javanet/CtJavaNetHttpClient.java b/commercetools/commercetools-javanet-client/src/main/java/com/commercetools/http/javanet/CtJavaNetHttpClient.java index 3894054dab7..21cacfc3a58 100644 --- a/commercetools/commercetools-javanet-client/src/main/java/com/commercetools/http/javanet/CtJavaNetHttpClient.java +++ b/commercetools/commercetools-javanet-client/src/main/java/com/commercetools/http/javanet/CtJavaNetHttpClient.java @@ -30,6 +30,11 @@ public CtJavaNetHttpClient() { javaHttpClient = clientBuilder.get().build(); } + public CtJavaNetHttpClient(HttpClient.Version version) { + super(); + javaHttpClient = clientBuilder.get().version(version).build(); + } + public CtJavaNetHttpClient(final BuilderOptions options) { super(); javaHttpClient = options.plus(clientBuilder.get()).build(); diff --git a/commercetools/commercetools-reactornetty-client/src/main/java/com/commercetools/http/netty/CtNettyHttpClient.java b/commercetools/commercetools-reactornetty-client/src/main/java/com/commercetools/http/netty/CtNettyHttpClient.java index 15a07320efa..e8d8b2ad789 100644 --- a/commercetools/commercetools-reactornetty-client/src/main/java/com/commercetools/http/netty/CtNettyHttpClient.java +++ b/commercetools/commercetools-reactornetty-client/src/main/java/com/commercetools/http/netty/CtNettyHttpClient.java @@ -25,6 +25,7 @@ import reactor.core.publisher.Mono; import reactor.netty.ByteBufMono; import reactor.netty.NettyOutbound; +import reactor.netty.http.HttpProtocol; import reactor.netty.http.client.HttpClient; import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; @@ -41,12 +42,22 @@ public CtNettyHttpClient() { this(MAX_REQUESTS); } - public CtNettyHttpClient(int maxConnections) { + public CtNettyHttpClient(HttpProtocol protocol) { + this(protocol, MAX_REQUESTS); + } + + public CtNettyHttpClient(final int maxConnections) { super(); this.nettyClient = createDefaultClient(maxConnections); this.nettyClient.warmup(); } + public CtNettyHttpClient(final HttpProtocol protocol, final int maxConnections) { + super(); + this.nettyClient = createDefaultClient(protocol, maxConnections); + this.nettyClient.warmup(); + } + public CtNettyHttpClient(final BuilderOptions options) { this(MAX_REQUESTS, options); } @@ -73,6 +84,12 @@ public CtNettyHttpClient(final ExecutorService executor, final int maxConnection this.nettyClient.warmup(); } + public CtNettyHttpClient(final ExecutorService executor, final HttpProtocol protocol, final int maxConnections) { + super(executor); + this.nettyClient = createDefaultClient(protocol, maxConnections); + this.nettyClient.warmup(); + } + public CtNettyHttpClient(final ExecutorService executor, final BuilderOptions options) { this(executor, MAX_REQUESTS, options); } @@ -83,6 +100,13 @@ public CtNettyHttpClient(final ExecutorService executor, final int maxConnection this.nettyClient.warmup(); } + public CtNettyHttpClient(final ExecutorService executor, final HttpProtocol protocol, final int maxConnections, + final BuilderOptions options) { + super(executor); + this.nettyClient = options.plus(createDefaultClient(protocol, maxConnections)); + this.nettyClient.warmup(); + } + public CtNettyHttpClient(final ExecutorService executor, final Supplier httpClientSupplier) { super(executor); this.nettyClient = httpClientSupplier.get(); @@ -97,6 +121,10 @@ public static HttpClient createDefaultClient(final int maxConnections) { .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000); } + public static HttpClient createDefaultClient(final HttpProtocol httpProtocol, final int maxConnections) { + return createDefaultClient(maxConnections).protocol(httpProtocol); + } + @Override public CompletableFuture> execute(ApiHttpRequest request) { final HttpMethod method = HttpMethod.valueOf(request.getMethod().name()); diff --git a/commercetools/internal-docs/build.gradle b/commercetools/internal-docs/build.gradle index 885fffba9c7..dbbfbd15a35 100644 --- a/commercetools/internal-docs/build.gradle +++ b/commercetools/internal-docs/build.gradle @@ -5,6 +5,7 @@ dependencies { implementation project(":commercetools:commercetools-http-client") implementation project(":commercetools:commercetools-okhttp-client4") implementation project(":commercetools:commercetools-apachehttp-client") + implementation project(":commercetools:commercetools-reactornetty-client") implementation project(":commercetools:commercetools-sdk-compat-v1") implementation project(":commercetools:commercetools-graphql-api") implementation project(":commercetools:commercetools-monitoring-newrelic") @@ -12,6 +13,7 @@ dependencies { testImplementation ctsdkv1.client version ctsdkv1.version implementation ctsdkv1.models version ctsdkv1.version + testImplementation project(":commercetools:commercetools-javanet-client") testImplementation commons.io version commons.io_version diff --git a/commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/ClientTuning.java b/commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/ClientTuning.java index 9006cac907f..29d010a1531 100644 --- a/commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/ClientTuning.java +++ b/commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/ClientTuning.java @@ -65,6 +65,14 @@ *

The third option is to use the timeout functionality of the futures

* * {@include.example example.ExamplesTest#timeoutFuture()} + * + *

HTTP protocol version

+ * + *

In case it's needed so specify a specific HTTP protocol version this can be done through the HTTP client package itself.

+ * + * {@include.example example.ExamplesTest#httpVersion()} + * + *

The AsyncHttpClient and OkHttp packages use HTTP1.1 by default.

*/ public class ClientTuning { } diff --git a/commercetools/internal-docs/src/test/java/example/ExamplesTest.java b/commercetools/internal-docs/src/test/java/example/ExamplesTest.java index 2037ebc4dda..e46709efe5c 100644 --- a/commercetools/internal-docs/src/test/java/example/ExamplesTest.java +++ b/commercetools/internal-docs/src/test/java/example/ExamplesTest.java @@ -8,6 +8,7 @@ import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.http.HttpClient; import java.time.Duration; import java.util.Arrays; import java.util.Collections; @@ -35,6 +36,8 @@ import com.commercetools.api.models.project.Project; import com.commercetools.api.models.tax_category.TaxCategoryPagedQueryResponse; import com.commercetools.http.apachehttp.CtApacheHttpClient; +import com.commercetools.http.javanet.CtJavaNetHttpClient; +import com.commercetools.http.netty.CtNettyHttpClient; import com.commercetools.http.okhttp4.CtOkHttp4Client; import io.vrap.rmf.base.client.*; @@ -43,6 +46,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.core5.http2.HttpVersionPolicy; import org.apache.hc.core5.util.Timeout; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -50,6 +54,7 @@ import dev.failsafe.Failsafe; import dev.failsafe.FailsafeExecutor; +import reactor.netty.http.HttpProtocol; public class ExamplesTest { @@ -623,4 +628,10 @@ public void mdcProjectApiRoot() { ProjectApiRoot globalRoot = ProjectApiRoot.of("test"); ProjectApiRoot apiRoot = ProjectApiRoot.withContext(globalRoot, new MDCContext()); } + + public void httpVersion() { + CtApacheHttpClient apacheHttpClient = new CtApacheHttpClient(HttpVersionPolicy.FORCE_HTTP_1); + CtNettyHttpClient nettyHttpClient = new CtNettyHttpClient(HttpProtocol.HTTP11); + CtJavaNetHttpClient javaNetHttpClient = new CtJavaNetHttpClient(HttpClient.Version.HTTP_1_1); + } }