diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java index a08dda68a67..d3f8ece25d5 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java @@ -25,12 +25,16 @@ import java.net.URI; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.Principal; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.TimeZone; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRequest; @@ -83,6 +87,14 @@ import org.springframework.web.util.UrlPathHelper; public abstract class AbstractMockHttpServletRequestBuilder> implements ConfigurableSmartRequestBuilder, Mergeable { + private static final SimpleDateFormat simpleDateFormat; + + static { + simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + } + + private final HttpMethod method; private @Nullable String uriTemplate; @@ -109,7 +121,7 @@ public abstract class AbstractMockHttpServletRequestBuilder headers = new LinkedMultiValueMap<>(); + private final HttpHeaders headers = new HttpHeaders(); private final MultiValueMap parameters = new LinkedMultiValueMap<>(); @@ -320,7 +332,7 @@ public abstract class AbstractMockHttpServletRequestBuilder collection) { + values = collection.toArray(); + } + } + + for (Object value : values) { + if (value instanceof Date date) { + this.headers.add(name, simpleDateFormat.format(date)); + } + else { + this.headers.add(name, String.valueOf(value)); + } + } + return self(); } @@ -665,12 +696,13 @@ public abstract class AbstractMockHttpServletRequestBuilder> entry : parentBuilder.headers.entrySet()) { - String headerName = entry.getKey(); - if (!this.headers.containsKey(headerName)) { - this.headers.put(headerName, entry.getValue()); - } - } + parentBuilder.headers.forEach((headerName, values) -> { + values.forEach(value -> { + if (!this.headers.containsHeader(headerName)) { + this.headers.put(headerName, values); + } + }); + }); for (Map.Entry> entry : parentBuilder.parameters.entrySet()) { String paramName = entry.getKey(); if (!this.parameters.containsKey(paramName)) { @@ -796,9 +828,7 @@ public abstract class AbstractMockHttpServletRequestBuilder values.forEach(value -> this.headers.add(name, value))); + this.versionInserter.insertVersion(this.version, this.headers); } this.headers.forEach((name, values) -> { @@ -808,8 +838,8 @@ public abstract class AbstractMockHttpServletRequestBuilder