Skip to content

Commit 606752a

Browse files
committed
fix: enhance retry mechanism for network-level timeouts in AuthInterceptor and OAuthInterceptor; update version to 1.11.2
1 parent c02bb73 commit 606752a

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Jun 01, 2026
66

77
- Fix: `SocketTimeoutException` now correctly triggers the retry mechanism in `AuthInterceptor` and `OAuthInterceptor`. Previously, network-level timeouts bypassed retry logic entirely, causing `.setRetry(true)` to have no effect on timeout errors.
8+
- Enhancement: Added `setProtocols(List<Protocol>)` to the Builder, allowing callers to restrict the HTTP protocol (e.g. force HTTP/1.1 via `Collections.singletonList(Protocol.HTTP_1_1)`) for environments where proxies or intermediaries have issues with HTTP/2.
89

910
## v1.11.1
1011

src/main/java/com/contentstack/cms/Contentstack.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import java.io.IOException;
44
import java.net.Proxy;
55
import java.time.Duration;
6+
import java.util.Collections;
67
import java.util.HashMap;
8+
import java.util.List;
79
import java.util.Map;
810
import java.util.concurrent.CompletableFuture;
911
import java.util.concurrent.TimeUnit;
@@ -30,6 +32,7 @@
3032
import com.contentstack.cms.core.RetryConfig;
3133
import okhttp3.ConnectionPool;
3234
import okhttp3.OkHttpClient;
35+
import okhttp3.Protocol;
3336
import okhttp3.ResponseBody;
3437
import okhttp3.logging.HttpLoggingInterceptor;
3538
import retrofit2.Response;
@@ -609,6 +612,7 @@ public static class Builder {
609612
* evicted after 5 minutes of inactivity.
610613
*/
611614
private ConnectionPool connectionPool = new ConnectionPool(); // Connection
615+
private List<Protocol> protocols = null;
612616

613617
/**
614618
* Instantiates a new Builder.
@@ -713,6 +717,11 @@ public Builder setConnectTimeout(int connectTimeoutSeconds) {
713717
return this;
714718
}
715719

720+
public Builder setProtocols(@NotNull List<Protocol> protocols) {
721+
this.protocols = protocols;
722+
return this;
723+
}
724+
716725
private static void validateTimeoutSeconds(int seconds, String name) {
717726
if (seconds <= 0) {
718727
throw new IllegalArgumentException(name + " must be positive.");
@@ -881,6 +890,9 @@ private OkHttpClient httpClient(Contentstack contentstack, Boolean retryOnFailur
881890
.readTimeout(Duration.ofSeconds(readSec))
882891
.writeTimeout(Duration.ofSeconds(writeSec))
883892
.retryOnConnectionFailure(retryOnFailure);
893+
if (this.protocols != null && !this.protocols.isEmpty()) {
894+
builder.protocols(this.protocols);
895+
}
884896

885897
// Add either OAuth or traditional auth interceptor
886898
if (this.oauthConfig != null) {

src/test/java/com/contentstack/cms/ContentstackUnitTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.contentstack.cms.stack.Stack;
66
import okhttp3.Headers;
77
import okhttp3.OkHttpClient;
8+
import okhttp3.Protocol;
89
import okhttp3.Request;
910
import okhttp3.ResponseBody;
1011
import okhttp3.mockwebserver.MockResponse;
@@ -17,7 +18,9 @@
1718
import java.io.IOException;
1819
import java.net.InetSocketAddress;
1920
import java.net.Proxy;
21+
import java.util.Collections;
2022
import java.util.HashMap;
23+
import java.util.List;
2124
import java.util.Map;
2225
import java.util.concurrent.TimeUnit;
2326

@@ -160,6 +163,24 @@ void setVersion() {
160163
Assertions.assertEquals("v8", contentstack.version);
161164
}
162165

166+
@Test
167+
void setProtocols_http1Only_buildsSuccessfully() {
168+
List<Protocol> protocols = Collections.singletonList(Protocol.HTTP_1_1);
169+
Contentstack contentstack = new Contentstack.Builder()
170+
.setProtocols(protocols)
171+
.build();
172+
Assertions.assertNotNull(contentstack);
173+
}
174+
175+
@Test
176+
void setProtocols_http2AndHttp1_buildsSuccessfully() {
177+
List<Protocol> protocols = List.of(Protocol.HTTP_2, Protocol.HTTP_1_1);
178+
Contentstack contentstack = new Contentstack.Builder()
179+
.setProtocols(protocols)
180+
.build();
181+
Assertions.assertNotNull(contentstack);
182+
}
183+
163184
@Test
164185
void setTimeout() {
165186
Contentstack contentstack = new Contentstack.Builder()

0 commit comments

Comments
 (0)