From 0f49b3d5dde741fb0ee05872be8ab7e2d8c57574 Mon Sep 17 00:00:00 2001 From: Anna Shipil Date: Tue, 11 Nov 2025 11:29:33 +0100 Subject: [PATCH 01/11] DEVX-658: updating okhttp to v5 --- .../graphql/api/ByProjectKeyGraphqlQuery.java | 1 - .../commercetools-okhttp-client5/build.gradle | 21 ++ .../http/okhttp4/UnzipBenchmark.java | 120 ++++++++++ .../http/okhttp4/BuilderOptions.java | 9 + .../http/okhttp4/CtOkHttp5Client.java | 226 ++++++++++++++++++ .../http/okhttp4/OkHttp5ClientSupplier.java | 21 ++ .../okhttp4/OkHttpClientSolutionInfo.java | 14 ++ ...rmf.base.client.ExecutorHttpClientSupplier | 1 + ...io.vrap.rmf.base.client.HttpClientSupplier | 1 + .../io.vrap.rmf.base.client.SolutionInfo | 1 + .../http/okhttp4/SolutionInfoTest.java | 18 ++ .../http/okhttp4/SupplierTest.java | 63 +++++ 12 files changed, 495 insertions(+), 1 deletion(-) create mode 100644 commercetools/commercetools-okhttp-client5/build.gradle create mode 100644 commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java create mode 100644 commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java create mode 100644 commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java create mode 100644 commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java create mode 100644 commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java create mode 100644 commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier create mode 100644 commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier create mode 100644 commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo create mode 100644 commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java create mode 100644 commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java diff --git a/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java b/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java index 83de7822180..027bd0734a0 100644 --- a/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java +++ b/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java @@ -8,7 +8,6 @@ import java.util.concurrent.CompletableFuture; import com.commercetools.api.client.ErrorableTrait; - import io.vrap.rmf.base.client.*; import org.apache.commons.lang3.builder.EqualsBuilder; diff --git a/commercetools/commercetools-okhttp-client5/build.gradle b/commercetools/commercetools-okhttp-client5/build.gradle new file mode 100644 index 00000000000..443e6f7cbdf --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/build.gradle @@ -0,0 +1,21 @@ +apply plugin: "me.champeau.jmh" + +jmh { + iterations = 5 + benchmarkMode = ['thrpt'] + threads = 25 + fork = 3 + timeOnIteration = '1s' + profilers = ['gc'] +} + +dependencies { + api project(":rmf:rmf-java-base") + api "com.squareup.okhttp3:okhttp:5.3.0" version { + strictly '[5.0,5.99999]' + prefer "5.3.0" + } + implementation "com.squareup.okio:okio:3.14.0" + + implementation javax.validation +} diff --git a/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java b/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java new file mode 100644 index 00000000000..1ab6865683a --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java @@ -0,0 +1,120 @@ + +package com.commercetools.http.okhttp4; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPOutputStream; + +import io.vrap.rmf.base.client.ApiHttpResponse; + +import org.assertj.core.api.Assertions; +import org.openjdk.jmh.annotations.*; + +import okhttp3.*; +import okio.Okio; + +public class UnzipBenchmark { + + @State(Scope.Benchmark) + public static class InterceptorState { + private CtOkHttp4Client.UnzippingInterceptor interceptor; + + @Setup(Level.Trial) + public void init() { + interceptor = new CtOkHttp4Client.UnzippingInterceptor(); + printUsedMemory(); + + } + + @TearDown(Level.Trial) + public void tearDown() { + printUsedMemory(); + } + } + @Benchmark + public void unzip(InterceptorState state) throws IOException { + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + GZIPOutputStream gzipOs = new GZIPOutputStream(os); + byte[] buffer = "Sample Text".getBytes(); + gzipOs.write(buffer, 0, buffer.length); + gzipOs.close(); + ByteArrayInputStream inputStream = new ByteArrayInputStream(os.toByteArray()); + + Response gzipped = new Response.Builder().request(new Request.Builder().url("http://localhost").build()) + .protocol(Protocol.HTTP_1_1) + .addHeader("content-encoding", "gzip") + .addHeader("content-type", "application/json") + .code(200) + .message("Ok") + .body(ResponseBody.create(MediaType.parse("application/json"), -1L, + Okio.buffer(Okio.source(inputStream)))) + .build(); + Assertions.assertThat(gzipped.body().source().isOpen()).isTrue(); + + Response unzipped = state.interceptor.unzip(gzipped); + + Assertions.assertThat(gzipped.body().source().isOpen()).isTrue(); + Assertions.assertThat(unzipped.body().source().isOpen()).isTrue(); + Assertions.assertThat(inputStream.available()).isEqualTo(31); + + ApiHttpResponse response = CtOkHttp4Client.toResponse(unzipped); + + Assertions.assertThat(gzipped.body().source().isOpen()).isFalse(); + Assertions.assertThat(unzipped.body().source().isOpen()).isFalse(); + Assertions.assertThat(inputStream.available()).isEqualTo(0); + + String text = new String(response.getBody(), StandardCharsets.UTF_8); + Assertions.assertThat(text).isEqualTo("Sample Text"); + } + + public static void printUsedMemory() { + long _usedMem; + long _total; + long _total2; + long _count = -1; + System.out.flush(); + // loop to get a stable reading, since memory may be resized between the method calls + do { + _count++; + _total = Runtime.getRuntime().totalMemory(); + try { + Thread.sleep(12); + } + catch (Exception ignore) { + } + long _free = Runtime.getRuntime().freeMemory(); + _total2 = Runtime.getRuntime().totalMemory(); + _usedMem = _total - _free; + } while (_total != _total2); + System.out.println("before GC: used=" + _usedMem + ", loopCount=" + _count + ", total=" + _total); + try { + Runtime.getRuntime().gc(); + Thread.sleep(55); + Runtime.getRuntime().gc(); + Thread.sleep(55); + Runtime.getRuntime().gc(); + Thread.sleep(55); + Runtime.getRuntime().gc(); + Thread.sleep(55); + } + catch (Exception ignore) { + } + // loop to get a stable reading, since memory may be resized between the method calls + do { + _count++; + _total = Runtime.getRuntime().totalMemory(); + try { + Thread.sleep(12); + } + catch (Exception ignore) { + } + long _free = Runtime.getRuntime().freeMemory(); + _total2 = Runtime.getRuntime().totalMemory(); + _usedMem = _total - _free; + } while (_total != _total2); + System.out.println("after GC: used=" + _usedMem + ", loopCount=" + _count + ", total=" + _total); + } +} diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java new file mode 100644 index 00000000000..e8c78a906ed --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java @@ -0,0 +1,9 @@ + +package com.commercetools.http.okhttp4; + +import okhttp3.OkHttpClient; + +@FunctionalInterface +public interface BuilderOptions { + OkHttpClient.Builder plus(OkHttpClient.Builder builder); +} diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java new file mode 100644 index 00000000000..e8166fac7d9 --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java @@ -0,0 +1,226 @@ + +package com.commercetools.http.okhttp4; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import io.vrap.rmf.base.client.*; +import io.vrap.rmf.base.client.utils.Utils; + +import jakarta.validation.constraints.NotNull; +import okhttp3.OkHttpClient; +import okio.GzipSource; +import okio.Okio; + +public class CtOkHttp4Client extends HttpClientBase { + + public static final int MAX_REQUESTS = 64; + private final Supplier clientBuilder = () -> new OkHttpClient.Builder() + .connectTimeout(120, TimeUnit.SECONDS) + .writeTimeout(120, TimeUnit.SECONDS) + .readTimeout(120, TimeUnit.SECONDS) + .protocols(Collections.singletonList(okhttp3.Protocol.HTTP_1_1)) + .addInterceptor(new UnzippingInterceptor()); + + private final OkHttpClient okHttpClient; + + public CtOkHttp4Client() { + super(); + okHttpClient = clientBuilder.get().dispatcher(createDispatcher(MAX_REQUESTS, MAX_REQUESTS)).build(); + } + + public CtOkHttp4Client(final BuilderOptions options) { + super(); + okHttpClient = options.plus(clientBuilder.get().dispatcher(createDispatcher(MAX_REQUESTS, MAX_REQUESTS))) + .build(); + } + + public CtOkHttp4Client(final Supplier builderSupplier) { + super(); + okHttpClient = builderSupplier.get().build(); + } + + public CtOkHttp4Client(final int maxRequests, final int maxRequestsPerHost) { + super(); + okHttpClient = clientBuilder.get().dispatcher(createDispatcher(maxRequests, maxRequestsPerHost)).build(); + } + + public CtOkHttp4Client(final int maxRequests, final int maxRequestsPerHost, final BuilderOptions options) { + super(); + okHttpClient = options.plus(clientBuilder.get().dispatcher(createDispatcher(maxRequests, maxRequestsPerHost))) + .build(); + } + + public CtOkHttp4Client(final ExecutorService executor) { + super(executor); + okHttpClient = clientBuilder.get().dispatcher(createDispatcher(executor, MAX_REQUESTS, MAX_REQUESTS)).build(); + } + + public CtOkHttp4Client(final ExecutorService executor, final BuilderOptions options) { + super(executor); + okHttpClient = options.plus(clientBuilder.get().dispatcher(createDispatcher(MAX_REQUESTS, MAX_REQUESTS))) + .build(); + } + + public CtOkHttp4Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost) { + super(executor); + okHttpClient = clientBuilder.get() + .dispatcher(createDispatcher(executor, maxRequests, maxRequestsPerHost)) + .build(); + } + + public CtOkHttp4Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost, + final BuilderOptions options) { + super(executor); + okHttpClient = options + .plus(clientBuilder.get().dispatcher(createDispatcher(executor, maxRequests, maxRequestsPerHost))) + .build(); + } + + public okhttp3.Dispatcher createDispatcher(final int maxRequests, final int maxRequestsPerHost) { + final okhttp3.Dispatcher dispatcher = new okhttp3.Dispatcher(); + dispatcher.setMaxRequests(maxRequests); + dispatcher.setMaxRequestsPerHost(maxRequestsPerHost); + return dispatcher; + } + + public okhttp3.Dispatcher createDispatcher(final ExecutorService executor, final int maxRequests, + final int maxRequestsPerHost) { + final okhttp3.Dispatcher dispatcher = new okhttp3.Dispatcher(executor); + dispatcher.setMaxRequests(maxRequests); + dispatcher.setMaxRequestsPerHost(maxRequestsPerHost); + return dispatcher; + } + + private static final String CONTENT_TYPE = "Content-Type"; + private static final okhttp3.MediaType JSON = okhttp3.MediaType.get("application/json; charset=utf-8"); + private static final byte[] emptyBody = new byte[0]; + + @Override + public CompletableFuture> execute(final ApiHttpRequest request) { + return makeRequest(okHttpClient, toRequest(request)).thenApplyAsync(CtOkHttp4Client::toResponse, executor()); + + } + + static ApiHttpResponse toResponse(final okhttp3.Response response) { + final ApiHttpHeaders apiHttpHeaders = new ApiHttpHeaders(response.headers() + .toMultimap() + .entrySet() + .stream() + .flatMap(e -> e.getValue().stream().map(value -> ApiHttpHeaders.headerEntry(e.getKey(), value))) + .collect(Collectors.toList())); + + final ApiHttpResponse apiHttpResponse = new ApiHttpResponse<>(response.code(), apiHttpHeaders, + Optional.ofNullable(response.body()) + .map(Utils.wrapToCompletionException(okhttp3.ResponseBody::bytes)) + .orElse(null), + response.message()); + if (response.body() != null) { + response.close(); + } + return apiHttpResponse; + } + + private static okhttp3.Request toRequest(final ApiHttpRequest apiHttpRequest) { + + okhttp3.Request.Builder httpRequestBuilder = new okhttp3.Request.Builder().url(apiHttpRequest.getUrl()); + + //set headers + for (Map.Entry entry : apiHttpRequest.getHeaders().getHeaders()) { + httpRequestBuilder = httpRequestBuilder.header(entry.getKey(), entry.getValue()); + } + + if (apiHttpRequest.getMethod() == null) { + throw new IllegalStateException("apiHttpRequest method should be non null"); + } + + //default media type is JSON, if other media type is set as a header, use it + okhttp3.MediaType mediaType = JSON; + if (apiHttpRequest.getHeaders() + .getHeaders() + .stream() + .anyMatch(s -> s.getKey().equalsIgnoreCase(CONTENT_TYPE))) { + mediaType = okhttp3.MediaType + .get(Objects.requireNonNull(apiHttpRequest.getHeaders().getFirst(ApiHttpHeaders.CONTENT_TYPE))); + } + + try { + final okhttp3.RequestBody body = apiHttpRequest.getBody() == null ? null + : okhttp3.RequestBody.create(apiHttpRequest.getBody(), mediaType); + httpRequestBuilder.method(apiHttpRequest.getMethod().name(), body); + } + catch (NoSuchMethodError error) { + throw new IllegalStateException( + "Request class is not compatible with this HTTP client implementation. Probably a wrong http client package is used. Please try \"commercetools-okhttp-client3\" instead"); + } + return httpRequestBuilder.build(); + } + + private CompletableFuture makeRequest(final OkHttpClient client, final okhttp3.Request request) { + final okhttp3.Call call = client.newCall(request); + final OkHttpResponseFuture result = new OkHttpResponseFuture(); + call.enqueue(result); + return result.future; + } + + private static class OkHttpResponseFuture implements okhttp3.Callback { + public final CompletableFuture future = new CompletableFuture<>(); + + public OkHttpResponseFuture() { + } + + @Override + public void onFailure(final okhttp3.Call call, final IOException e) { + future.completeExceptionally(e); + } + + @Override + public void onResponse(final okhttp3.Call call, final okhttp3.Response response) throws IOException { + future.complete(response); + } + } + + @Override + public void closeDelegate() throws IOException { + okHttpClient.dispatcher().executorService().shutdown(); + okHttpClient.connectionPool().evictAll(); + if (okHttpClient.cache() != null) + Objects.requireNonNull(okHttpClient.cache()).close(); + } + + public static class UnzippingInterceptor implements okhttp3.Interceptor { + @Override + @NotNull + public okhttp3.Response intercept(Chain chain) throws IOException { + okhttp3.Response response = chain.proceed(chain.request()); + return unzip(response); + } + + okhttp3.Response unzip(final okhttp3.Response response) { + if (!"gzip".equalsIgnoreCase(response.header("Content-Encoding"))) { + return response; + } + + if (response.body() == null) { + return response; + } + + okhttp3.Headers strippedHeaders = response.headers() + .newBuilder() + .removeAll("Content-Encoding") + .removeAll("Content-Length") + .build(); + String contentType = response.header("Content-Type"); + return response.newBuilder() + .headers(strippedHeaders) + .body(okhttp3.ResponseBody.create(Okio.buffer(new GzipSource(response.body().source())), + okhttp3.MediaType.get(contentType), -1L)) + .build(); + } + } +} diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java new file mode 100644 index 00000000000..97623277b8c --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java @@ -0,0 +1,21 @@ + +package com.commercetools.http.okhttp4; + +import java.util.concurrent.ExecutorService; +import java.util.function.Supplier; + +import io.vrap.rmf.base.client.BaseHttpClientSupplier; +import io.vrap.rmf.base.client.VrapHttpClient; + +public class OkHttp4ClientSupplier extends BaseHttpClientSupplier { + + @Override + public VrapHttpClient get() { + return new CtOkHttp4Client(); + } + + @Override + public Supplier get(ExecutorService executorService) { + return () -> new CtOkHttp4Client(executorService); + } +} diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java new file mode 100644 index 00000000000..9222279fc28 --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java @@ -0,0 +1,14 @@ + +package com.commercetools.http.okhttp4; + +import io.vrap.rmf.base.client.SolutionInfo; + +import okhttp3.OkHttp; + +public class OkHttpClientSolutionInfo extends SolutionInfo { + + public OkHttpClientSolutionInfo() { + setName("OkHttpClient"); + setVersion(OkHttp.VERSION); + } +} diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier new file mode 100644 index 00000000000..fedb7820b18 --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier @@ -0,0 +1 @@ +com.commercetools.http.okhttp4.OkHttp4ClientSupplier diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier new file mode 100644 index 00000000000..fedb7820b18 --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier @@ -0,0 +1 @@ +com.commercetools.http.okhttp4.OkHttp4ClientSupplier diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo new file mode 100644 index 00000000000..63d60f0e3e1 --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo @@ -0,0 +1 @@ +com.commercetools.http.okhttp4.OkHttpClientSolutionInfo diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java new file mode 100644 index 00000000000..bb3f5d00eaa --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java @@ -0,0 +1,18 @@ + +package com.commercetools.http.okhttp4; + +import com.vdurmont.semver4j.Semver; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SolutionInfoTest { + @Test + public void version() { + String version = new OkHttpClientSolutionInfo().getVersion(); + + Assertions.assertThat(new Semver(version, Semver.SemverType.LOOSE).compareTo(new Semver("4.12.0"))) + .isGreaterThanOrEqualTo(0); + Assertions.assertThat(version).startsWith("4."); + } +} diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java new file mode 100644 index 00000000000..011f9112dd6 --- /dev/null +++ b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java @@ -0,0 +1,63 @@ + +package com.commercetools.http.okhttp4; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPOutputStream; + +import io.vrap.rmf.base.client.ApiHttpResponse; +import io.vrap.rmf.base.client.HttpClientSupplier; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import okhttp3.*; +import okio.Okio; + +public class SupplierTest { + @Test + public void testCreate() { + Assertions.assertThat(HttpClientSupplier.of().get()).isInstanceOf(CtOkHttp4Client.class); + } + + @Test + public void testUnzip() throws IOException { + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + GZIPOutputStream gzipOs = new GZIPOutputStream(os); + byte[] buffer = "Sample Text".getBytes(); + gzipOs.write(buffer, 0, buffer.length); + gzipOs.close(); + ByteArrayInputStream inputStream = new ByteArrayInputStream(os.toByteArray()); + + CtOkHttp4Client.UnzippingInterceptor interceptor = new CtOkHttp4Client.UnzippingInterceptor(); + + Response gzipped = new Response.Builder().request(new Request.Builder().url("http://localhost").build()) + .protocol(Protocol.HTTP_1_1) + .addHeader("content-encoding", "gzip") + .addHeader("content-type", "application/json") + .code(200) + .message("Ok") + .body(ResponseBody.create(MediaType.parse("application/json"), -1L, + Okio.buffer(Okio.source(inputStream)))) + .build(); + Assertions.assertThat(gzipped.body().source().isOpen()).isTrue(); + + Response unzipped = interceptor.unzip(gzipped); + + Assertions.assertThat(gzipped.body().source().isOpen()).isTrue(); + Assertions.assertThat(unzipped.body().source().isOpen()).isTrue(); + Assertions.assertThat(inputStream.available()).isEqualTo(31); + + ApiHttpResponse response = CtOkHttp4Client.toResponse(unzipped); + + Assertions.assertThat(gzipped.body().source().isOpen()).isFalse(); + Assertions.assertThat(unzipped.body().source().isOpen()).isFalse(); + Assertions.assertThat(inputStream.available()).isEqualTo(0); + + String text = new String(response.getBody(), StandardCharsets.UTF_8); + Assertions.assertThat(text).isEqualTo("Sample Text"); + } +} From 3addaca346bcdfd555fca0340e40c7e5518c5185 Mon Sep 17 00:00:00 2001 From: "ct-sdks[bot]" <153784748+ct-sdks[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 10:37:41 +0000 Subject: [PATCH 02/11] spotless: Fix code style --- .../com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java | 1 + 1 file changed, 1 insertion(+) diff --git a/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java b/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java index 027bd0734a0..83de7822180 100644 --- a/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java +++ b/commercetools/commercetools-graphql-api/src/main/java/com/commercetools/graphql/api/ByProjectKeyGraphqlQuery.java @@ -8,6 +8,7 @@ import java.util.concurrent.CompletableFuture; import com.commercetools.api.client.ErrorableTrait; + import io.vrap.rmf.base.client.*; import org.apache.commons.lang3.builder.EqualsBuilder; From e1a826da21e4efa5f9d167ce8e9412a5491827b0 Mon Sep 17 00:00:00 2001 From: "ct-sdks[bot]" <153784748+ct-sdks[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 10:37:41 +0000 Subject: [PATCH 03/11] spotless: add commit to blame ignore revs file --- .git-blame-ignore-revs | 1 + 1 file changed, 1 insertion(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index ebeda33fcb2..bad2eb639c1 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -17,3 +17,4 @@ af9205fa592e4ae32ceca951c560a48b512b7744 f58dd73747791edcd45722a4903da44da1b9b2d3 fcdaa3d6735d2382a44d066a6ce051a2c5e6469f 9bbe16b7d1600fc96100f54cb25869cbdf425521 +3addaca346bcdfd555fca0340e40c7e5518c5185 From 56ed101d89fb7ed3c6498105caf6f535eb6caeee Mon Sep 17 00:00:00 2001 From: ShipilA <44925533+ShipilA@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:36:11 +0100 Subject: [PATCH 04/11] Update commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java Co-authored-by: Jens Schulze --- .../java/com/commercetools/http/okhttp4/CtOkHttp5Client.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java index e8166fac7d9..2c806ba481c 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java @@ -17,7 +17,7 @@ import okio.GzipSource; import okio.Okio; -public class CtOkHttp4Client extends HttpClientBase { +public class CtOkHttp5Client extends HttpClientBase { public static final int MAX_REQUESTS = 64; private final Supplier clientBuilder = () -> new OkHttpClient.Builder() From 2dacf2d546f6b633811b37ebe14e7dfb2b4fefe0 Mon Sep 17 00:00:00 2001 From: ShipilA <44925533+ShipilA@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:36:22 +0100 Subject: [PATCH 05/11] Update commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java Co-authored-by: Jens Schulze --- .../jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java b/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java index 1ab6865683a..5bd02cc4cf1 100644 --- a/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java +++ b/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; From fce60bef186c78751ad41f8a016dbccc6d96122c Mon Sep 17 00:00:00 2001 From: Anna Shipil Date: Tue, 11 Nov 2025 14:39:56 +0100 Subject: [PATCH 06/11] DEVX-658: updating okhttp to v5 --- .../http/okhttp4/BuilderOptions.java | 2 +- .../http/okhttp4/CtOkHttp5Client.java | 22 +++++++++---------- .../http/okhttp4/OkHttp5ClientSupplier.java | 8 +++---- .../okhttp4/OkHttpClientSolutionInfo.java | 2 +- ...rmf.base.client.ExecutorHttpClientSupplier | 2 +- ...io.vrap.rmf.base.client.HttpClientSupplier | 2 +- .../io.vrap.rmf.base.client.SolutionInfo | 2 +- .../http/okhttp4/SolutionInfoTest.java | 2 +- .../http/okhttp4/SupplierTest.java | 8 +++---- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java index e8c78a906ed..079137c4514 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import okhttp3.OkHttpClient; diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java index 2c806ba481c..3514e55a46d 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import java.io.IOException; import java.util.*; @@ -29,52 +29,52 @@ public class CtOkHttp5Client extends HttpClientBase { private final OkHttpClient okHttpClient; - public CtOkHttp4Client() { + public CtOkHttp5Client() { super(); okHttpClient = clientBuilder.get().dispatcher(createDispatcher(MAX_REQUESTS, MAX_REQUESTS)).build(); } - public CtOkHttp4Client(final BuilderOptions options) { + public CtOkHttp5Client(final BuilderOptions options) { super(); okHttpClient = options.plus(clientBuilder.get().dispatcher(createDispatcher(MAX_REQUESTS, MAX_REQUESTS))) .build(); } - public CtOkHttp4Client(final Supplier builderSupplier) { + public CtOkHttp5Client(final Supplier builderSupplier) { super(); okHttpClient = builderSupplier.get().build(); } - public CtOkHttp4Client(final int maxRequests, final int maxRequestsPerHost) { + public CtOkHttp5Client(final int maxRequests, final int maxRequestsPerHost) { super(); okHttpClient = clientBuilder.get().dispatcher(createDispatcher(maxRequests, maxRequestsPerHost)).build(); } - public CtOkHttp4Client(final int maxRequests, final int maxRequestsPerHost, final BuilderOptions options) { + public CtOkHttp5Client(final int maxRequests, final int maxRequestsPerHost, final BuilderOptions options) { super(); okHttpClient = options.plus(clientBuilder.get().dispatcher(createDispatcher(maxRequests, maxRequestsPerHost))) .build(); } - public CtOkHttp4Client(final ExecutorService executor) { + public CtOkHttp5Client(final ExecutorService executor) { super(executor); okHttpClient = clientBuilder.get().dispatcher(createDispatcher(executor, MAX_REQUESTS, MAX_REQUESTS)).build(); } - public CtOkHttp4Client(final ExecutorService executor, final BuilderOptions options) { + public CtOkHttp5Client(final ExecutorService executor, final BuilderOptions options) { super(executor); okHttpClient = options.plus(clientBuilder.get().dispatcher(createDispatcher(MAX_REQUESTS, MAX_REQUESTS))) .build(); } - public CtOkHttp4Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost) { + public CtOkHtt54Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost) { super(executor); okHttpClient = clientBuilder.get() .dispatcher(createDispatcher(executor, maxRequests, maxRequestsPerHost)) .build(); } - public CtOkHttp4Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost, + public CtOkHttp5Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost, final BuilderOptions options) { super(executor); okHttpClient = options @@ -103,7 +103,7 @@ public okhttp3.Dispatcher createDispatcher(final ExecutorService executor, final @Override public CompletableFuture> execute(final ApiHttpRequest request) { - return makeRequest(okHttpClient, toRequest(request)).thenApplyAsync(CtOkHttp4Client::toResponse, executor()); + return makeRequest(okHttpClient, toRequest(request)).thenApplyAsync(CtOkHttp5Client::toResponse, executor()); } diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java index 97623277b8c..0ac1774bc83 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import java.util.concurrent.ExecutorService; import java.util.function.Supplier; @@ -7,15 +7,15 @@ import io.vrap.rmf.base.client.BaseHttpClientSupplier; import io.vrap.rmf.base.client.VrapHttpClient; -public class OkHttp4ClientSupplier extends BaseHttpClientSupplier { +public class OkHttp5ClientSupplier extends BaseHttpClientSupplier { @Override public VrapHttpClient get() { - return new CtOkHttp4Client(); + return new CtOkHttp5Client(); } @Override public Supplier get(ExecutorService executorService) { - return () -> new CtOkHttp4Client(executorService); + return () -> new CtOkHttp5Client(executorService); } } diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java index 9222279fc28..affbc0b8f85 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import io.vrap.rmf.base.client.SolutionInfo; diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier index fedb7820b18..636ca4af3ae 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier @@ -1 +1 @@ -com.commercetools.http.okhttp4.OkHttp4ClientSupplier +com.commercetools.http.okhttp5.OkHttp4ClientSupplier diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier index fedb7820b18..636ca4af3ae 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier @@ -1 +1 @@ -com.commercetools.http.okhttp4.OkHttp4ClientSupplier +com.commercetools.http.okhttp5.OkHttp4ClientSupplier diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo index 63d60f0e3e1..300da03a52a 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.SolutionInfo @@ -1 +1 @@ -com.commercetools.http.okhttp4.OkHttpClientSolutionInfo +com.commercetools.http.okhttp5.OkHttpClientSolutionInfo diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java index bb3f5d00eaa..377a86acec1 100644 --- a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java +++ b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import com.vdurmont.semver4j.Semver; diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java index 011f9112dd6..6f2e8af76e6 100644 --- a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java +++ b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java @@ -1,5 +1,5 @@ -package com.commercetools.http.okhttp4; +package com.commercetools.http.okhttp5; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -19,7 +19,7 @@ public class SupplierTest { @Test public void testCreate() { - Assertions.assertThat(HttpClientSupplier.of().get()).isInstanceOf(CtOkHttp4Client.class); + Assertions.assertThat(HttpClientSupplier.of().get()).isInstanceOf(CtOkHttp5Client.class); } @Test @@ -32,7 +32,7 @@ public void testUnzip() throws IOException { gzipOs.close(); ByteArrayInputStream inputStream = new ByteArrayInputStream(os.toByteArray()); - CtOkHttp4Client.UnzippingInterceptor interceptor = new CtOkHttp4Client.UnzippingInterceptor(); + CtOkHttp5Client.UnzippingInterceptor interceptor = new CtOkHttp5Client.UnzippingInterceptor(); Response gzipped = new Response.Builder().request(new Request.Builder().url("http://localhost").build()) .protocol(Protocol.HTTP_1_1) @@ -51,7 +51,7 @@ public void testUnzip() throws IOException { Assertions.assertThat(unzipped.body().source().isOpen()).isTrue(); Assertions.assertThat(inputStream.available()).isEqualTo(31); - ApiHttpResponse response = CtOkHttp4Client.toResponse(unzipped); + ApiHttpResponse response = CtOkHttp5Client.toResponse(unzipped); Assertions.assertThat(gzipped.body().source().isOpen()).isFalse(); Assertions.assertThat(unzipped.body().source().isOpen()).isFalse(); From 311e6325531dbb2bb8d818398ff5a2814ca47809 Mon Sep 17 00:00:00 2001 From: Anna Shipil Date: Tue, 11 Nov 2025 14:49:55 +0100 Subject: [PATCH 07/11] DEVX-658: updating okhttp to v5 --- .../commercetools/http/{okhttp4 => okhttp5}/BuilderOptions.java | 0 .../commercetools/http/{okhttp4 => okhttp5}/CtOkHttp5Client.java | 0 .../http/{okhttp4 => okhttp5}/OkHttp5ClientSupplier.java | 0 .../http/{okhttp4 => okhttp5}/OkHttpClientSolutionInfo.java | 0 .../commercetools/http/{okhttp4 => okhttp5}/SolutionInfoTest.java | 0 .../com/commercetools/http/{okhttp4 => okhttp5}/SupplierTest.java | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/{okhttp4 => okhttp5}/BuilderOptions.java (100%) rename commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/{okhttp4 => okhttp5}/CtOkHttp5Client.java (100%) rename commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/{okhttp4 => okhttp5}/OkHttp5ClientSupplier.java (100%) rename commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/{okhttp4 => okhttp5}/OkHttpClientSolutionInfo.java (100%) rename commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/{okhttp4 => okhttp5}/SolutionInfoTest.java (100%) rename commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/{okhttp4 => okhttp5}/SupplierTest.java (100%) diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/BuilderOptions.java similarity index 100% rename from commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/BuilderOptions.java rename to commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/BuilderOptions.java diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/CtOkHttp5Client.java similarity index 100% rename from commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/CtOkHttp5Client.java rename to commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/CtOkHttp5Client.java diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/OkHttp5ClientSupplier.java similarity index 100% rename from commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttp5ClientSupplier.java rename to commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/OkHttp5ClientSupplier.java diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/OkHttpClientSolutionInfo.java similarity index 100% rename from commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp4/OkHttpClientSolutionInfo.java rename to commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/OkHttpClientSolutionInfo.java diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SolutionInfoTest.java similarity index 100% rename from commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SolutionInfoTest.java rename to commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SolutionInfoTest.java diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SupplierTest.java similarity index 100% rename from commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp4/SupplierTest.java rename to commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SupplierTest.java From e9227527dba0ad70960acb8611f22e8961022925 Mon Sep 17 00:00:00 2001 From: Anna Shipil Date: Tue, 11 Nov 2025 15:23:58 +0100 Subject: [PATCH 08/11] DEVX-658: updating okhttp to v5 --- .../services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier | 2 +- .../services/io.vrap.rmf.base.client.HttpClientSupplier | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier index 636ca4af3ae..2f4a83f0cf5 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.ExecutorHttpClientSupplier @@ -1 +1 @@ -com.commercetools.http.okhttp5.OkHttp4ClientSupplier +com.commercetools.http.okhttp5.OkHttp5ClientSupplier diff --git a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier index 636ca4af3ae..2f4a83f0cf5 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier +++ b/commercetools/commercetools-okhttp-client5/src/main/resources/META-INF/services/io.vrap.rmf.base.client.HttpClientSupplier @@ -1 +1 @@ -com.commercetools.http.okhttp5.OkHttp4ClientSupplier +com.commercetools.http.okhttp5.OkHttp5ClientSupplier From 1276360acf7c623344a81ff710cba92d62f4f68e Mon Sep 17 00:00:00 2001 From: Anna Shipil Date: Tue, 11 Nov 2025 15:25:05 +0100 Subject: [PATCH 09/11] DEVX-658: updating okhttp to v5 --- .../java/com/commercetools/http/okhttp4/UnzipBenchmark.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java b/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java index 5bd02cc4cf1..79400a11a35 100644 --- a/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java +++ b/commercetools/commercetools-okhttp-client5/src/jmh/java/com/commercetools/http/okhttp4/UnzipBenchmark.java @@ -19,11 +19,11 @@ public class UnzipBenchmark { @State(Scope.Benchmark) public static class InterceptorState { - private CtOkHttp4Client.UnzippingInterceptor interceptor; + private CtOkHttp5Client.UnzippingInterceptor interceptor; @Setup(Level.Trial) public void init() { - interceptor = new CtOkHttp4Client.UnzippingInterceptor(); + interceptor = new CtOkHttp5Client.UnzippingInterceptor(); printUsedMemory(); } @@ -60,7 +60,7 @@ public void unzip(InterceptorState state) throws IOException { Assertions.assertThat(unzipped.body().source().isOpen()).isTrue(); Assertions.assertThat(inputStream.available()).isEqualTo(31); - ApiHttpResponse response = CtOkHttp4Client.toResponse(unzipped); + ApiHttpResponse response = CtOkHttp5Client.toResponse(unzipped); Assertions.assertThat(gzipped.body().source().isOpen()).isFalse(); Assertions.assertThat(unzipped.body().source().isOpen()).isFalse(); From c3b382e028821e86b92e8635f055f2c122a18356 Mon Sep 17 00:00:00 2001 From: Jens Schulze Date: Thu, 13 Nov 2025 10:15:43 +0100 Subject: [PATCH 10/11] small fixes --- commercetools/commercetools-okhttp-client5/build.gradle | 2 +- .../java/com/commercetools/http/okhttp5/CtOkHttp5Client.java | 2 +- .../java/com/commercetools/http/okhttp5/SolutionInfoTest.java | 4 ++-- settings.gradle | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/commercetools/commercetools-okhttp-client5/build.gradle b/commercetools/commercetools-okhttp-client5/build.gradle index 443e6f7cbdf..980b6baf764 100644 --- a/commercetools/commercetools-okhttp-client5/build.gradle +++ b/commercetools/commercetools-okhttp-client5/build.gradle @@ -15,7 +15,7 @@ dependencies { strictly '[5.0,5.99999]' prefer "5.3.0" } - implementation "com.squareup.okio:okio:3.14.0" + implementation "com.squareup.okio:okio:3.16.2" implementation javax.validation } diff --git a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/CtOkHttp5Client.java b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/CtOkHttp5Client.java index 3514e55a46d..d9565277daf 100644 --- a/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/CtOkHttp5Client.java +++ b/commercetools/commercetools-okhttp-client5/src/main/java/com/commercetools/http/okhttp5/CtOkHttp5Client.java @@ -67,7 +67,7 @@ public CtOkHttp5Client(final ExecutorService executor, final BuilderOptions opti .build(); } - public CtOkHtt54Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost) { + public CtOkHttp5Client(final ExecutorService executor, final int maxRequests, final int maxRequestsPerHost) { super(executor); okHttpClient = clientBuilder.get() .dispatcher(createDispatcher(executor, maxRequests, maxRequestsPerHost)) diff --git a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SolutionInfoTest.java b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SolutionInfoTest.java index 377a86acec1..3671abb0281 100644 --- a/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SolutionInfoTest.java +++ b/commercetools/commercetools-okhttp-client5/src/test/java/com/commercetools/http/okhttp5/SolutionInfoTest.java @@ -11,8 +11,8 @@ public class SolutionInfoTest { public void version() { String version = new OkHttpClientSolutionInfo().getVersion(); - Assertions.assertThat(new Semver(version, Semver.SemverType.LOOSE).compareTo(new Semver("4.12.0"))) + Assertions.assertThat(new Semver(version, Semver.SemverType.LOOSE).compareTo(new Semver("5.3.0"))) .isGreaterThanOrEqualTo(0); - Assertions.assertThat(version).startsWith("4."); + Assertions.assertThat(version).startsWith("5."); } } diff --git a/settings.gradle b/settings.gradle index f4643bbccb5..a018e720016 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,6 +3,7 @@ includeBuild 'common-plugins' include 'rmf:rmf-java-base' include 'commercetools:commercetools-okhttp-client3' include 'commercetools:commercetools-okhttp-client4' +include 'commercetools:commercetools-okhttp-client5' include 'commercetools:commercetools-http-client' include 'commercetools:commercetools-javanet-client' include 'commercetools:commercetools-monitoring-newrelic' From b0ddf41b413359ee9f66d1a6eef5e295a7fc6b55 Mon Sep 17 00:00:00 2001 From: Anna Shipil Date: Thu, 13 Nov 2025 11:09:18 +0100 Subject: [PATCH 11/11] DEVX-658: updating license for okhttp v5 --- .../commercetools-okhttp-client5/index.json | 272 ++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 licenses/commercetools-okhttp-client5/index.json diff --git a/licenses/commercetools-okhttp-client5/index.json b/licenses/commercetools-okhttp-client5/index.json new file mode 100644 index 00000000000..977d55f2fc3 --- /dev/null +++ b/licenses/commercetools-okhttp-client5/index.json @@ -0,0 +1,272 @@ +{ + "dependencies": [ + { + "moduleName": "com.fasterxml.jackson.core:jackson-annotations", + "moduleVersion": "2.19.1", + "moduleUrls": [ + "https://github.com/FasterXML/jackson" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.fasterxml.jackson.core:jackson-core", + "moduleVersion": "2.19.1", + "moduleUrls": [ + "https://github.com/FasterXML/jackson-core" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.fasterxml.jackson.core:jackson-databind", + "moduleVersion": "2.19.1", + "moduleUrls": [ + "https://github.com/FasterXML/jackson" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "moduleVersion": "2.19.1", + "moduleUrls": [ + "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.google.code.findbugs:jsr305", + "moduleVersion": "3.0.2", + "moduleUrls": [ + "http://findbugs.sourceforge.net/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.spotify:completable-futures", + "moduleVersion": "0.3.6", + "moduleUrls": [ + "https://spotify.github.io/completable-futures" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.squareup.okhttp3:okhttp", + "moduleVersion": "5.3.0", + "moduleUrls": [ + "https://square.github.io/okhttp/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "com.squareup.okio:okio", + "moduleVersion": "3.14.0" + }, + { + "moduleName": "com.squareup.okio:okio-jvm", + "moduleVersion": "3.14.0", + "moduleUrls": [ + "https://github.com/square/okio/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "dev.failsafe:failsafe", + "moduleVersion": "3.3.2", + "moduleLicenses": [ + { + "moduleLicense": null, + "moduleLicenseUrl": "http://apache.org/licenses/LICENSE-2.0" + }, + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "jakarta.validation:jakarta.validation-api", + "moduleVersion": "3.1.1", + "moduleUrls": [ + "https://beanvalidation.org", + "https://www.eclipse.org" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + }, + { + "moduleLicense": "Eclipse Public License - v 2.0", + "moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt" + }, + { + "moduleLicense": "GNU GENERAL PUBLIC LICENSE, Version 2 + Classpath Exception", + "moduleLicenseUrl": "https://openjdk.java.net/legal/gplv2+ce.html" + } + ] + }, + { + "moduleName": "org.apache.commons:commons-lang3", + "moduleVersion": "3.18.0", + "moduleUrls": [ + "https://commons.apache.org/proper/commons-lang/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "org.javassist:javassist", + "moduleVersion": "3.28.0-GA", + "moduleUrls": [ + "http://www.javassist.org/" + ], + "moduleLicenses": [ + { + "moduleLicense": null, + "moduleLicenseUrl": "http://www.mozilla.org/MPL/MPL-1.1.html, http://www.gnu.org/licenses/lgpl-2.1.html, http://www.apache.org/licenses/" + }, + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + }, + { + "moduleLicense": "GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1", + "moduleLicenseUrl": "https://www.gnu.org/licenses/lgpl-2.1" + }, + { + "moduleLicense": "Mozilla Public License Version 1.1", + "moduleLicenseUrl": "https://www.mozilla.org/en-US/MPL/1.1" + } + ] + }, + { + "moduleName": "org.jetbrains.kotlin:kotlin-stdlib", + "moduleVersion": "2.1.21", + "moduleUrls": [ + "https://kotlinlang.org/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "moduleVersion": "1.8.21", + "moduleUrls": [ + "https://kotlinlang.org/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "moduleVersion": "1.8.21", + "moduleUrls": [ + "https://kotlinlang.org/" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "org.jetbrains:annotations", + "moduleVersion": "13.0", + "moduleUrls": [ + "http://www.jetbrains.org" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "moduleName": "org.reflections:reflections", + "moduleVersion": "0.10.2", + "moduleUrls": [ + "http://github.com/ronmamo/reflections" + ], + "moduleLicenses": [ + { + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + }, + { + "moduleLicense": "WTFPL", + "moduleLicenseUrl": "http://www.wtfpl.net/" + } + ] + }, + { + "moduleName": "org.slf4j:slf4j-api", + "moduleVersion": "2.0.17", + "moduleUrls": [ + "http://www.slf4j.org" + ], + "moduleLicenses": [ + { + "moduleLicense": null, + "moduleLicenseUrl": "https://opensource.org/license/mit" + }, + { + "moduleLicense": "MIT License", + "moduleLicenseUrl": "https://opensource.org/licenses/MIT" + } + ] + } + ] +}