@@ -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