Skip to content

Commit ae514aa

Browse files
authored
Add support for Request Timeouts to HTTP/2 Java 11 Client. (OpenFeign#1233)
Adds `Request.Options` to the HTTP/2 Client Request Builder.
1 parent f9f294a commit ae514aa

2 files changed

Lines changed: 33 additions & 6 deletions

File tree

java11/src/main/java/feign/http2client/Http2Client.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
*/
1414
package feign.http2client;
1515

16+
import feign.Client;
17+
import feign.Request;
18+
import feign.Request.Options;
19+
import feign.Response;
20+
import feign.Util;
1621
import java.io.ByteArrayInputStream;
1722
import java.io.IOException;
1823
import java.net.URI;
@@ -26,11 +31,10 @@
2631
import java.net.http.HttpRequest.Builder;
2732
import java.net.http.HttpResponse;
2833
import java.net.http.HttpResponse.BodyHandlers;
34+
import java.time.Duration;
2935
import java.util.*;
3036
import java.util.function.Function;
3137
import java.util.stream.Collectors;
32-
import feign.*;
33-
import feign.Request.Options;
3438

3539
public class Http2Client implements Client {
3640

@@ -49,12 +53,13 @@ public Http2Client(HttpClient client) {
4953

5054
@Override
5155
public Response execute(Request request, Options options) throws IOException {
52-
final HttpRequest httpRequest = newRequestBuilder(request).build();
56+
final HttpRequest httpRequest = newRequestBuilder(request, options).build();
5357

5458
HttpResponse<byte[]> httpResponse;
5559
try {
5660
httpResponse = client.send(httpRequest, BodyHandlers.ofByteArray());
5761
} catch (final InterruptedException e) {
62+
Thread.currentThread().interrupt();
5863
throw new IOException("Invalid uri " + request.url(), e);
5964
}
6065

@@ -71,7 +76,7 @@ public Response execute(Request request, Options options) throws IOException {
7176
return response;
7277
}
7378

74-
private Builder newRequestBuilder(Request request) throws IOException {
79+
private Builder newRequestBuilder(Request request, Options options) throws IOException {
7580
URI uri;
7681
try {
7782
uri = new URI(request.url());
@@ -89,6 +94,7 @@ private Builder newRequestBuilder(Request request) throws IOException {
8994

9095
final Builder requestBuilder = HttpRequest.newBuilder()
9196
.uri(uri)
97+
.timeout(Duration.ofMillis(options.readTimeoutMillis()))
9298
.version(Version.HTTP_2);
9399

94100
final Map<String, Collection<String>> headers = filterRestrictedHeaders(request.headers());
@@ -152,8 +158,7 @@ private String[] asString(Map<String, Collection<String>> headers) {
152158
.stream()
153159
.map(value -> Arrays.asList(entry.getKey(), value))
154160
.flatMap(List::stream))
155-
.collect(Collectors.toList())
156-
.toArray(new String[0]);
161+
.toArray(String[]::new);
157162
}
158163

159164
}

java11/src/test/java/feign/http2client/test/Http2ClientTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@
1515

1616
import static org.assertj.core.api.Assertions.assertThat;
1717
import org.assertj.core.api.Assertions;
18+
import org.hamcrest.CoreMatchers;
1819
import org.junit.Ignore;
1920
import org.junit.Test;
2021
import java.io.IOException;
22+
import java.net.http.HttpTimeoutException;
23+
import java.util.concurrent.TimeUnit;
2124
import feign.*;
2225
import feign.client.AbstractClientTest;
2326
import feign.http2client.Http2Client;
@@ -37,6 +40,10 @@ public interface TestInterface {
3740
@RequestLine("PATCH /patch")
3841
@Headers({"Accept: text/plain"})
3942
String patch();
43+
44+
@RequestLine("POST /timeout")
45+
@Headers({"Accept: text/plain"})
46+
String timeout();
4047
}
4148

4249
@Override
@@ -80,6 +87,21 @@ public void testVeryLongResponseNullLength() {
8087
// client is too smart to fall for a body that is 8 bytes long
8188
}
8289

90+
@Test
91+
public void timeoutTest() {
92+
server.enqueue(new MockResponse().setBody("foo").setBodyDelay(30, TimeUnit.SECONDS));
93+
94+
final TestInterface api = newBuilder()
95+
.retryer(Retryer.NEVER_RETRY)
96+
.options(new Request.Options(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS, true))
97+
.target(TestInterface.class, server.url("/").toString());
98+
99+
thrown.expect(FeignException.class);
100+
thrown.expectCause(CoreMatchers.isA(HttpTimeoutException.class));
101+
102+
api.timeout();
103+
}
104+
83105
@Override
84106
public Feign.Builder newBuilder() {
85107
return Feign.builder().client(new Http2Client());

0 commit comments

Comments
 (0)