From 8eef97da336c6b4f7bacb3c573e23d02b0d204cb Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 12 Dec 2018 11:10:10 -0500 Subject: [PATCH] HTTP header adapters print header values Issue: SPR-17546 --- .../org/springframework/http/HttpHeaders.java | 21 ++++++++++++++++++- .../server/reactive/JettyHeadersAdapter.java | 7 +++++++ .../server/reactive/NettyHeadersAdapter.java | 6 ++++++ .../server/reactive/TomcatHeadersAdapter.java | 7 +++++++ .../reactive/UndertowHeadersAdapter.java | 6 ++++++ .../src/test/resources/log4j2-test.xml | 2 +- 6 files changed, 47 insertions(+), 2 deletions(-) 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 91e1a48908..9e1ed8d91d 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 ca9f7b3f58..a41e6ff5b4 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 bcc0ff5095..386233cd2b 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 fb9987269f..aea8eacce7 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 5dc80a9bbe..a7d9035122 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 a327721075..57767a7420 100644 --- a/spring-webflux/src/test/resources/log4j2-test.xml +++ b/spring-webflux/src/test/resources/log4j2-test.xml @@ -2,7 +2,7 @@ - +