diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java index fd7cfeb3..aa480655 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringMvcContract.java @@ -275,8 +275,10 @@ public class SpringMvcContract extends Contract.BaseContract if (annotation.headers() != null && annotation.headers().length > 0) { for (String header : annotation.headers()) { int index = header.indexOf('='); - md.template().header(resolve(header.substring(0, index)), + if (!header.contains("!=") && index >= 0) { + md.template().header(resolve(header.substring(0, index)), resolve(header.substring(index + 1).trim())); + } } } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java index 8b0a51c7..b786c6f0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringMvcContractTests.java @@ -332,6 +332,18 @@ public class SpringMvcContractTests { assertEquals("bar", data.template().headers().get("X-Foo").iterator().next()); } + @Test + public void testProcessHeadersWithoutValues() throws Exception { + Method method = TestTemplate_HeadersWithoutValues.class.getDeclaredMethod("getTest", + String.class); + MethodMetadata data = this.contract + .parseAndValidateMetadata(method.getDeclaringClass(), method); + + assertEquals("/test/{id}", data.template().url()); + assertEquals("GET", data.template().method()); + assertEquals(true, data.template().headers().isEmpty()); + } + @Test public void testProcessAnnotations_Fallback() throws Exception { Method method = TestTemplate_Advanced.class.getDeclaredMethod("getTestFallback", @@ -462,6 +474,11 @@ public class SpringMvcContractTests { ResponseEntity getTest(@PathVariable("id") String id); } + public interface TestTemplate_HeadersWithoutValues { + @RequestMapping(value = "/test/{id}", method = RequestMethod.GET, headers = { "X-Foo", "!X-Bar", "X-Baz!=fooBar" }) + ResponseEntity getTest(@PathVariable("id") String id); + } + public interface TestTemplate_ListParams { @RequestMapping(value = "/test", method = RequestMethod.GET) ResponseEntity getTest(@RequestParam("id") List id);