From dc6794984b96213103fdb7a32ad5985e867c866b Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 9 Dec 2025 16:43:50 -0600 Subject: [PATCH] Fix incorrect HttpHeader handling in RequestHeaderParameterProcessor Signed-off-by: Alex --- .../RequestHeaderParameterProcessor.java | 3 ++- .../openfeign/support/SpringMvcContractTests.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/annotation/RequestHeaderParameterProcessor.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/annotation/RequestHeaderParameterProcessor.java index 5986528e7..da11b9fc6 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/annotation/RequestHeaderParameterProcessor.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/annotation/RequestHeaderParameterProcessor.java @@ -24,6 +24,7 @@ import feign.MethodMetadata; import org.springframework.cloud.openfeign.AnnotatedParameterProcessor; +import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.RequestHeader; import static feign.Util.checkState; @@ -51,7 +52,7 @@ public boolean processArgument(AnnotatedParameterContext context, Annotation ann Class parameterType = method.getParameterTypes()[parameterIndex]; MethodMetadata data = context.getMethodMetadata(); - if (Map.class.isAssignableFrom(parameterType)) { + if (Map.class.isAssignableFrom(parameterType) || HttpHeaders.class.isAssignableFrom(parameterType)) { checkState(data.headerMapIndex() == null, "Header map can only be present once."); data.headerMapIndex(parameterIndex); diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/SpringMvcContractTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/SpringMvcContractTests.java index f339ed59e..792d1860d 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/SpringMvcContractTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/SpringMvcContractTests.java @@ -45,6 +45,7 @@ import org.springframework.format.annotation.NumberFormat; import org.springframework.format.number.NumberStyleFormatter; import org.springframework.format.support.FormattingConversionServiceFactoryBean; +import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.MultiValueMap; @@ -642,6 +643,17 @@ void testProcessHeaderMap() throws Exception { assertThat(headers.get("aHeader").iterator().next()).isEqualTo("{aHeader}"); } + @Test + void testProcessHttpHeaders() throws Exception { + Method method = TestTemplate_HeaderMap.class.getDeclaredMethod("httpHeaders", HttpHeaders.class); + MethodMetadata data = contract.parseAndValidateMetadata(method.getDeclaringClass(), method); + + assertThat(data.template().url()).isEqualTo("/httpHeaders"); + assertThat(data.template().method()).isEqualTo("GET"); + assertThat(data.headerMapIndex()).isNotNull(); + assertThat(data.headerMapIndex().intValue()).isEqualTo(0); + } + @Test void testProcessHeaderMapMoreThanOnce() throws Exception { Method method = TestTemplate_HeaderMap.class.getDeclaredMethod("headerMapMoreThanOnce", MultiValueMap.class, @@ -913,6 +925,9 @@ public interface TestTemplate_HeaderMap { String headerMap(@RequestHeader MultiValueMap headerMap, @RequestHeader(name = "aHeader") String aHeader); + @GetMapping("/httpHeaders") + String httpHeaders(@RequestHeader HttpHeaders headers); + @GetMapping("/headerMapMoreThanOnce") String headerMapMoreThanOnce(@RequestHeader MultiValueMap headerMap1, @RequestHeader MultiValueMap headerMap2);