From ff46d4b3264e83307f7c2fa314e60c96aee46310 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 9 Oct 2026 16:40:08 +0200 Subject: [PATCH] Unwrap HttpHeaders in MultiValueMap constructor Prior to this commit, `HttpHeaders(MultiValueMap)` stored its argument as-is. Code compiled against Framework 6.x still links to this constructor when passing an `HttpHeaders`, which is no longer a `MultiValueMap`. The resulting instance failed later with an `IncompatibleClassChangeError`. This commit unwraps `HttpHeaders` arguments in the constructor and in `formatHeaders(MultiValueMap)`, as is already done for `HttpHeaders(HttpHeaders)`. Closes gh-37358 --- .../main/java/org/springframework/http/HttpHeaders.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index 12216b83d5a..f3466ef18ee 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -454,7 +454,7 @@ public class HttpHeaders implements Serializable { */ public HttpHeaders(MultiValueMap headers) { Assert.notNull(headers, "MultiValueMap must not be null"); - this.headers = headers; + this.headers = (headers instanceof HttpHeaders httpHeaders ? unwrap(httpHeaders) : headers); } /** @@ -2115,6 +2115,11 @@ public class HttpHeaders implements Serializable { * @since 5.1.4 */ public static String formatHeaders(MultiValueMap headers) { + return doFormatHeaders(headers instanceof HttpHeaders httpHeaders ? + unwrap(httpHeaders) : headers); + } + + private static String doFormatHeaders(MultiValueMap headers) { Set headerNames = new CaseInsensitiveHeaderNameSet(headers); String suffix = "]"; if (headerNames.size() != headers.size()) {