From 25355370ac5e4c1795619828acf3457a8af3a5b9 Mon Sep 17 00:00:00 2001 From: mroccyen Date: Fri, 20 May 2022 17:27:52 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9Aissue=201420?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/feign/Contract.java | 3 ++- core/src/test/java/feign/OptionsTest.java | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/feign/Contract.java b/core/src/main/java/feign/Contract.java index 112e4076f..9f6a48800 100644 --- a/core/src/main/java/feign/Contract.java +++ b/core/src/main/java/feign/Contract.java @@ -132,7 +132,8 @@ protected MethodMetadata parseAndValidateMetadata(Class targetType, Method me if (parameterTypes[i] == URI.class) { data.urlIndex(i); - } else if (!isHttpAnnotation && parameterTypes[i] != Request.Options.class) { + } else if (!isHttpAnnotation + && !Request.Options.class.isAssignableFrom(parameterTypes[i])) { if (data.isAlreadyProcessed(i)) { checkState(data.formParams().isEmpty() || data.bodyIndex() == null, "Body parameters cannot be used with form parameters.%s", data.warnings()); diff --git a/core/src/test/java/feign/OptionsTest.java b/core/src/test/java/feign/OptionsTest.java index 0d701501e..04b06e10b 100644 --- a/core/src/test/java/feign/OptionsTest.java +++ b/core/src/test/java/feign/OptionsTest.java @@ -29,10 +29,19 @@ @SuppressWarnings("deprecation") public class OptionsTest { + static class ChildOptions extends Request.Options { + public ChildOptions(int connectTimeoutMillis, int readTimeoutMillis) { + super(connectTimeoutMillis, readTimeoutMillis); + } + } + interface OptionsInterface { @RequestLine("GET /") String get(Request.Options options); + @RequestLine("POST /") + String getChildOptions(ChildOptions options); + @RequestLine("GET /") String get(); } @@ -66,4 +75,16 @@ public void normalResponseTest() { assertThat(api.get(new Request.Options(1000, 4 * 1000))).isEqualTo("foo"); } + + @Test + public void normalResponseForChildOptionsTest() { + final MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("foo").setBodyDelay(3, TimeUnit.SECONDS)); + + final OptionsInterface api = Feign.builder() + .options(new ChildOptions(1000, 1000)) + .target(OptionsInterface.class, server.url("/").toString()); + + assertThat(api.getChildOptions(new ChildOptions(1000, 4 * 1000))).isEqualTo("foo"); + } }