Skip to content

Commit 2ed81be

Browse files
L00kiansbrannen
authored andcommitted
Fix MockHttpServletRequest.setCookies to produce single cookie header
Prior to this commit, MockHttpServletRequest.setCookies() produced one Cookie header per supplied cookie, resulting in multiple Cookie headers which violates the specification. This commit fixes this by ensuring that all cookie name-value pairs are stored under a single Cookie header, separated by a semicolon. Closes gh-23074
1 parent 49e5c4d commit 2ed81be

File tree

3 files changed

+30
-11
lines changed

3 files changed

+30
-11
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.Map;
4242
import java.util.Set;
4343
import java.util.TimeZone;
44+
import java.util.stream.Collectors;
4445
import javax.servlet.AsyncContext;
4546
import javax.servlet.DispatcherType;
4647
import javax.servlet.RequestDispatcher;
@@ -58,6 +59,7 @@
5859

5960
import org.springframework.http.HttpHeaders;
6061
import org.springframework.http.MediaType;
62+
import org.springframework.lang.NonNull;
6163
import org.springframework.lang.Nullable;
6264
import org.springframework.util.Assert;
6365
import org.springframework.util.LinkedCaseInsensitiveMap;
@@ -973,12 +975,18 @@ public String getAuthType() {
973975

974976
public void setCookies(@Nullable Cookie... cookies) {
975977
this.cookies = (ObjectUtils.isEmpty(cookies) ? null : cookies);
976-
this.headers.remove(HttpHeaders.COOKIE);
977-
if (this.cookies != null) {
978-
Arrays.stream(this.cookies)
979-
.map(c -> c.getName() + '=' + (c.getValue() == null ? "" : c.getValue()))
980-
.forEach(value -> doAddHeaderValue(HttpHeaders.COOKIE, value, false));
978+
if (this.cookies == null) {
979+
removeHeader(HttpHeaders.COOKIE);
981980
}
981+
else {
982+
doAddHeaderValue(HttpHeaders.COOKIE, encodeCookies(this.cookies), true);
983+
}
984+
}
985+
986+
private static String encodeCookies(@NonNull Cookie... cookies) {
987+
return Arrays.stream(cookies)
988+
.map(c -> c.getName() + '=' + (c.getValue() == null ? "" : c.getValue()))
989+
.collect(Collectors.joining("; "));
982990
}
983991

984992
@Override

spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,9 @@ public void cookies() {
292292
assertEquals("bar", cookies[0].getValue());
293293
assertEquals("baz", cookies[1].getName());
294294
assertEquals("qux", cookies[1].getValue());
295-
assertEquals(Arrays.asList("foo=bar", "baz=qux"), cookieHeaders);
295+
296+
assertEquals(1, cookieHeaders.size());
297+
assertEquals("foo=bar; baz=qux", cookieHeaders.get(0));
296298
}
297299

298300
@Test

spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.Map;
4242
import java.util.Set;
4343
import java.util.TimeZone;
44+
import java.util.stream.Collectors;
4445
import javax.servlet.AsyncContext;
4546
import javax.servlet.DispatcherType;
4647
import javax.servlet.RequestDispatcher;
@@ -58,6 +59,7 @@
5859

5960
import org.springframework.http.HttpHeaders;
6061
import org.springframework.http.MediaType;
62+
import org.springframework.lang.NonNull;
6163
import org.springframework.lang.Nullable;
6264
import org.springframework.util.Assert;
6365
import org.springframework.util.LinkedCaseInsensitiveMap;
@@ -973,14 +975,20 @@ public String getAuthType() {
973975

974976
public void setCookies(@Nullable Cookie... cookies) {
975977
this.cookies = (ObjectUtils.isEmpty(cookies) ? null : cookies);
976-
this.headers.remove(HttpHeaders.COOKIE);
977-
if (this.cookies != null) {
978-
Arrays.stream(this.cookies)
979-
.map(c -> c.getName() + '=' + (c.getValue() == null ? "" : c.getValue()))
980-
.forEach(value -> doAddHeaderValue(HttpHeaders.COOKIE, value, false));
978+
if (this.cookies == null) {
979+
removeHeader(HttpHeaders.COOKIE);
980+
}
981+
else {
982+
doAddHeaderValue(HttpHeaders.COOKIE, encodeCookies(this.cookies), true);
981983
}
982984
}
983985

986+
private static String encodeCookies(@NonNull Cookie... cookies) {
987+
return Arrays.stream(cookies)
988+
.map(c -> c.getName() + '=' + (c.getValue() == null ? "" : c.getValue()))
989+
.collect(Collectors.joining("; "));
990+
}
991+
984992
@Override
985993
@Nullable
986994
public Cookie[] getCookies() {
@@ -1297,6 +1305,7 @@ public HttpSession getSession() {
12971305
* Otherwise it simply returns the current session id.
12981306
* @since 4.0.3
12991307
*/
1308+
@Override
13001309
public String changeSessionId() {
13011310
Assert.isTrue(this.session != null, "The request does not have a session");
13021311
if (this.session instanceof MockHttpSession) {

0 commit comments

Comments
 (0)