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 91e1a489082..9e1ed8d91d4 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -1640,7 +1640,26 @@ public class HttpHeaders implements MultiValueMap, Serializable @Override public String toString() { - return this.headers.toString(); + return formatHeaders(this.headers); + } + + /** + * Helps to format HTTP header values, as HTTP header values themselves can + * contain comma-separated values, can become confusing with regular + * {@link Map} formatting that also uses commas between entries. + * @param headers the headers to format + * @return the headers to a String + * @since 5.1.4 + */ + public static String formatHeaders(MultiValueMap headers) { + return headers.entrySet().stream() + .map(entry -> { + List values = entry.getValue(); + return entry.getKey() + ":" + (values.size() == 1 ? + "\"" + values.get(0) + "\"" : + values.stream().map(s -> "\"" + s + "\"").collect(Collectors.joining(", "))); + }) + .collect(Collectors.joining(", ", "[", "]")); } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java index ca9f7b3f58e..a41e6ff5b4e 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import org.eclipse.jetty.http.HttpField; import org.eclipse.jetty.http.HttpFields; +import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; @@ -176,6 +177,12 @@ class JettyHeadersAdapter implements MultiValueMap { } + @Override + public String toString() { + return HttpHeaders.formatHeaders(this); + } + + private class EntryIterator implements Iterator>> { private Enumeration names = headers.getFieldNames(); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java index bcc0ff50958..386233cd2b9 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java @@ -176,6 +176,12 @@ class NettyHeadersAdapter implements MultiValueMap { } + @Override + public String toString() { + return org.springframework.http.HttpHeaders.formatHeaders(this); + } + + private class EntryIterator implements Iterator>> { private Iterator names = headers.names().iterator(); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHeadersAdapter.java index fb9987269f9..aea8eacce78 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHeadersAdapter.java @@ -31,6 +31,7 @@ import java.util.stream.Collectors; import org.apache.tomcat.util.buf.MessageBytes; import org.apache.tomcat.util.http.MimeHeaders; +import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; @@ -195,6 +196,12 @@ class TomcatHeadersAdapter implements MultiValueMap { } + @Override + public String toString() { + return HttpHeaders.formatHeaders(this); + } + + private class EntryIterator implements Iterator>> { private Enumeration names = headers.names(); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHeadersAdapter.java index 5dc80a9bbe4..a7d9035122a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHeadersAdapter.java @@ -177,6 +177,12 @@ class UndertowHeadersAdapter implements MultiValueMap { } + @Override + public String toString() { + return org.springframework.http.HttpHeaders.formatHeaders(this); + } + + private class EntryIterator implements Iterator>> { private Iterator names = headers.getHeaderNames().iterator(); diff --git a/spring-webflux/src/test/resources/log4j2-test.xml b/spring-webflux/src/test/resources/log4j2-test.xml index a327721075a..57767a74208 100644 --- a/spring-webflux/src/test/resources/log4j2-test.xml +++ b/spring-webflux/src/test/resources/log4j2-test.xml @@ -2,7 +2,7 @@ - +