Skip to content

Commit 974f6e6

Browse files
authored
LLRC RequestOptions add RequestConfig (#57972)
Different kinds of requests may need different request options from the client default. Users can optionally set RequestConfig on a single request's RequestOptions to override the default. Without this, socketTimeout can only set at RestClient initialization.
1 parent 4542dfc commit 974f6e6

File tree

5 files changed

+75
-3
lines changed

5 files changed

+75
-3
lines changed

client/rest/src/main/java/org/elasticsearch/client/RequestOptions.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.client;
2121

2222
import org.apache.http.Header;
23+
import org.apache.http.client.config.RequestConfig;
2324
import org.apache.http.message.BasicHeader;
2425
import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
2526
import org.elasticsearch.client.HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory;
@@ -38,23 +39,25 @@ public final class RequestOptions {
3839
* Default request options.
3940
*/
4041
public static final RequestOptions DEFAULT = new Builder(
41-
Collections.emptyList(), HeapBufferedResponseConsumerFactory.DEFAULT, null).build();
42+
Collections.emptyList(), HeapBufferedResponseConsumerFactory.DEFAULT, null, null).build();
4243

4344
private final List<Header> headers;
4445
private final HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory;
4546
private final WarningsHandler warningsHandler;
47+
private final RequestConfig requestConfig;
4648

4749
private RequestOptions(Builder builder) {
4850
this.headers = Collections.unmodifiableList(new ArrayList<>(builder.headers));
4951
this.httpAsyncResponseConsumerFactory = builder.httpAsyncResponseConsumerFactory;
5052
this.warningsHandler = builder.warningsHandler;
53+
this.requestConfig = builder.requestConfig;
5154
}
5255

5356
/**
5457
* Create a builder that contains these options but can be modified.
5558
*/
5659
public Builder toBuilder() {
57-
return new Builder(headers, httpAsyncResponseConsumerFactory, warningsHandler);
60+
return new Builder(headers, httpAsyncResponseConsumerFactory, warningsHandler, requestConfig);
5861
}
5962

6063
/**
@@ -95,6 +98,15 @@ public WarningsHandler getWarningsHandler() {
9598
return warningsHandler;
9699
}
97100

101+
/**
102+
* get RequestConfig, which can set socketTimeout, connectTimeout
103+
* and so on by request
104+
* @return RequestConfig
105+
*/
106+
public RequestConfig getRequestConfig() {
107+
return requestConfig;
108+
}
109+
98110
@Override
99111
public String toString() {
100112
StringBuilder b = new StringBuilder();
@@ -152,12 +164,14 @@ public static class Builder {
152164
private final List<Header> headers;
153165
private HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory;
154166
private WarningsHandler warningsHandler;
167+
private RequestConfig requestConfig;
155168

156169
private Builder(List<Header> headers, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory,
157-
WarningsHandler warningsHandler) {
170+
WarningsHandler warningsHandler, RequestConfig requestConfig) {
158171
this.headers = new ArrayList<>(headers);
159172
this.httpAsyncResponseConsumerFactory = httpAsyncResponseConsumerFactory;
160173
this.warningsHandler = warningsHandler;
174+
this.requestConfig = requestConfig;
161175
}
162176

163177
/**
@@ -210,6 +224,17 @@ public Builder setWarningsHandler(WarningsHandler warningsHandler) {
210224
this.warningsHandler = warningsHandler;
211225
return this;
212226
}
227+
228+
/**
229+
* set RequestConfig, which can set socketTimeout, connectTimeout
230+
* and so on by request
231+
* @param requestConfig http client RequestConfig
232+
* @return Builder
233+
*/
234+
public Builder setRequestConfig(RequestConfig requestConfig) {
235+
this.requestConfig = requestConfig;
236+
return this;
237+
}
213238
}
214239

215240
/**

client/rest/src/main/java/org/elasticsearch/client/RestClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.http.client.AuthCache;
3030
import org.apache.http.client.ClientProtocolException;
3131
import org.apache.http.client.entity.GzipDecompressingEntity;
32+
import org.apache.http.client.config.RequestConfig;
3233
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
3334
import org.apache.http.client.methods.HttpHead;
3435
import org.apache.http.client.methods.HttpOptions;
@@ -718,6 +719,7 @@ private class InternalRequest {
718719
this.httpRequest = createHttpRequest(request.getMethod(), uri, request.getEntity());
719720
this.cancellable = Cancellable.fromRequest(httpRequest);
720721
setHeaders(httpRequest, request.getOptions().getHeaders());
722+
setRequestConfig(httpRequest, request.getOptions().getRequestConfig());
721723
this.warningsHandler = request.getOptions().getWarningsHandler() == null ?
722724
RestClient.this.warningsHandler : request.getOptions().getWarningsHandler();
723725
}
@@ -736,6 +738,12 @@ private void setHeaders(HttpRequest httpRequest, Collection<Header> requestHeade
736738
}
737739
}
738740

741+
private void setRequestConfig(HttpRequestBase httpRequest, RequestConfig requestConfig) {
742+
if (requestConfig != null) {
743+
httpRequest.setConfig(requestConfig);
744+
}
745+
}
746+
739747
RequestContext createContextForNextAttempt(Node node, AuthCache authCache) {
740748
this.httpRequest.reset();
741749
return new RequestContext(this, node, authCache);

client/rest/src/test/java/org/elasticsearch/client/RequestOptionsTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.client;
2121

2222
import org.apache.http.Header;
23+
import org.apache.http.client.config.RequestConfig;
2324
import org.elasticsearch.client.HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory;
2425

2526
import java.util.ArrayList;
@@ -90,6 +91,22 @@ public void testSetHttpAsyncResponseConsumerFactory() {
9091
assertSame(factory, options.getHttpAsyncResponseConsumerFactory());
9192
}
9293

94+
public void testSetRequestBuilder() {
95+
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
96+
97+
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
98+
int socketTimeout = 10000;
99+
int connectTimeout = 100;
100+
requestConfigBuilder.setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout);
101+
RequestConfig requestConfig = requestConfigBuilder.build();
102+
103+
builder.setRequestConfig(requestConfig);
104+
RequestOptions options = builder.build();
105+
assertSame(options.getRequestConfig(), requestConfig);
106+
assertEquals(options.getRequestConfig().getSocketTimeout(), socketTimeout);
107+
assertEquals(options.getRequestConfig().getConnectTimeout(), connectTimeout);
108+
}
109+
93110
public void testEqualsAndHashCode() {
94111
RequestOptions request = randomBuilder().build();
95112
assertEquals(request, request);
@@ -122,6 +139,10 @@ static RequestOptions.Builder randomBuilder() {
122139
builder.setWarningsHandler(randomBoolean() ? WarningsHandler.STRICT : WarningsHandler.PERMISSIVE);
123140
}
124141

142+
if (randomBoolean()) {
143+
builder.setRequestConfig(RequestConfig.custom().build());
144+
}
145+
125146
return builder;
126147
}
127148

client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,17 @@ public RequestConfig.Builder customizeRequestConfig(
327327
});
328328
//end::rest-client-config-timeouts
329329
}
330+
{
331+
//tag::rest-client-config-request-options-timeouts
332+
RequestConfig requestConfig = RequestConfig.custom()
333+
.setConnectTimeout(5000)
334+
.setSocketTimeout(60000)
335+
.build();
336+
RequestOptions options = RequestOptions.DEFAULT.toBuilder()
337+
.setRequestConfig(requestConfig)
338+
.build();
339+
//end::rest-client-config-request-options-timeouts
340+
}
330341
{
331342
//tag::rest-client-config-threads
332343
RestClientBuilder builder = RestClient.builder(

docs/java-rest/low-level/configuration.asciidoc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ seconds).
2525
include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-timeouts]
2626
--------------------------------------------------
2727

28+
timeouts also can set by RequestOptions per request.this will override RestClient customizeRequestConfig.
29+
30+
["source","java",subs="attributes,callouts,macros"]
31+
--------------------------------------------------
32+
include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-request-options-timeouts]
33+
--------------------------------------------------
34+
2835
=== Number of threads
2936

3037
The Apache Http Async Client starts by default one dispatcher thread, and a

0 commit comments

Comments
 (0)