Skip to content

Commit 3572843

Browse files
fix(java): Java API client writeTimeout configuration not working (#5829)
1 parent eccb9c7 commit 3572843

File tree

1 file changed

+43
-15
lines changed
  • clients/algoliasearch-client-java/algoliasearch/src/main/java/com/algolia/internal

1 file changed

+43
-15
lines changed

clients/algoliasearch-client-java/algoliasearch/src/main/java/com/algolia/internal/HttpRequester.java

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ private <T> T execute(@Nonnull HttpRequest httpRequest, RequestOptions requestOp
8181

8282
Request request = requestBuilder.build();
8383

84-
// Get or adjust the HTTP client according to request options.
85-
OkHttpClient client = getOkHttpClient(requestOptions);
84+
// Get or adjust the HTTP client according to request.
85+
OkHttpClient client = getOkHttpClient(httpRequest, requestOptions);
8686

8787
// Execute the request.
8888
Call call = client.newCall(request);
@@ -165,22 +165,50 @@ private Headers createHeaders(@Nonnull HttpRequest request, RequestOptions reque
165165

166166
/** Returns a suitable OkHttpClient instance based on the provided request options. */
167167
@Nonnull
168-
private OkHttpClient getOkHttpClient(RequestOptions requestOptions) {
169-
// Return the default client if no request options are provided.
170-
if (requestOptions == null) return httpClient;
171-
172-
// Create a new client builder from the default client and adjust timeouts if provided.
168+
private OkHttpClient getOkHttpClient(HttpRequest httpRequest, RequestOptions requestOptions) {
173169
OkHttpClient.Builder builder = httpClient.newBuilder();
174-
if (requestOptions.getReadTimeout() != null) {
175-
builder.readTimeout(requestOptions.getReadTimeout());
176-
}
177-
if (requestOptions.getWriteTimeout() != null) {
178-
builder.writeTimeout(requestOptions.getWriteTimeout());
170+
// Determine if this is a read operation: either explicitly marked as read, or using GET method
171+
boolean isRead = httpRequest.isRead() || "GET".equalsIgnoreCase(httpRequest.getMethod());
172+
boolean changed = false;
173+
174+
// If this is a write operation, set readTimeout to the default writeTimeout value
175+
if (!isRead) {
176+
builder.readTimeout(Duration.ofMillis(httpClient.writeTimeoutMillis()));
177+
changed = true;
179178
}
180-
if (requestOptions.getConnectTimeout() != null) {
181-
builder.connectTimeout(requestOptions.getConnectTimeout());
179+
180+
if (isRead && requestOptions != null) {
181+
// For read operations, apply connectTimeout if provided
182+
if (requestOptions.getConnectTimeout() != null) {
183+
builder.connectTimeout(requestOptions.getConnectTimeout());
184+
changed = true;
185+
}
186+
// For read operations, use the explicit readTimeout if provided
187+
if(requestOptions.getReadTimeout() != null) {
188+
builder.readTimeout(requestOptions.getReadTimeout());
189+
changed = true;
190+
}
191+
// For read operations, set writeTimeout if provided
192+
if (requestOptions.getWriteTimeout() != null) {
193+
builder.writeTimeout(requestOptions.getWriteTimeout());
194+
changed = true;
195+
}
196+
} else if (!isRead && requestOptions != null) {
197+
// For write operations, apply connectTimeout if provided
198+
if (requestOptions.getConnectTimeout() != null) {
199+
builder.connectTimeout(requestOptions.getConnectTimeout());
200+
changed = true;
201+
}
202+
// For write operations, use the explicit writeTimeout for both readTimeout and writeTimeout if provided
203+
if(requestOptions.getWriteTimeout() != null) {
204+
builder.readTimeout(requestOptions.getWriteTimeout());
205+
builder.writeTimeout(requestOptions.getWriteTimeout());
206+
changed = true;
207+
}
182208
}
183-
return builder.build();
209+
210+
// Return a new OkHttpClient instance if any timeout was changed, otherwise reuse the default client
211+
return changed ? builder.build() : httpClient;
184212
}
185213

186214
@Override

0 commit comments

Comments
 (0)