From 9ec087360490b3074d976e1c2a4442fe67cf805e Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Mon, 25 Apr 2016 16:35:56 -0500 Subject: [PATCH] MockWebResponseBuilder defaults cookie domain Previously MockWebResponseBuilder would use the cookie domain of the cookie received from MockMvc response. This caused problems because the cookie domain can be null, but HtmlUnit forbids a null domain. This commit defaults the domain of the cookie to the domain of the WebRequest. Issues SPR-14169 --- .../servlet/htmlunit/MockWebResponseBuilder.java | 14 +++++++++++--- .../htmlunit/MockWebResponseBuilderTests.java | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilder.java index 4606712d2fa..17074b963ca 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilder.java @@ -29,6 +29,7 @@ import com.gargoylesoftware.htmlunit.WebResponse; import com.gargoylesoftware.htmlunit.WebResponseData; import com.gargoylesoftware.htmlunit.util.NameValuePair; +import org.apache.http.impl.cookie.BasicClientCookie; import org.springframework.http.HttpStatus; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.util.Assert; @@ -115,9 +116,16 @@ final class MockWebResponseBuilder { if (cookie.getMaxAge() > -1) { expires = new Date(System.currentTimeMillis() + cookie.getMaxAge() * 1000); } - return new com.gargoylesoftware.htmlunit.util.Cookie( - cookie.getDomain(), cookie.getName(), cookie.getValue(), - cookie.getPath(), expires, cookie.getSecure(), cookie.isHttpOnly()).toString(); + BasicClientCookie result = new BasicClientCookie(cookie.getName(), cookie.getValue()); + result.setDomain(cookie.getDomain()); + result.setComment(cookie.getComment()); + result.setExpiryDate(expires); + result.setPath(cookie.getPath()); + result.setSecure(cookie.getSecure()); + if(cookie.isHttpOnly()) { + result.setAttribute("httponly", "true"); + } + return new com.gargoylesoftware.htmlunit.util.Cookie(result).toString(); } } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilderTests.java index c54839625cc..29c83115c43 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockWebResponseBuilderTests.java @@ -119,6 +119,20 @@ public class MockWebResponseBuilderTests { assertThat(header.getValue(), endsWith(";secure;httpOnly")); } + // SPR-14169 + @Test + public void buildResponseHeadersNullDomainDefaulted() throws Exception { + Cookie cookie = new Cookie("cookieA", "valueA"); + this.response.addCookie(cookie); + WebResponse webResponse = this.responseBuilder.build(); + + List responseHeaders = webResponse.getResponseHeaders(); + assertThat(responseHeaders.size(), equalTo(1)); + NameValuePair header = responseHeaders.get(0); + assertThat(header.getName(), equalTo("Set-Cookie")); + assertThat(header.getValue(), equalTo("cookieA=valueA")); + } + @Test public void buildStatus() throws Exception { WebResponse webResponse = this.responseBuilder.build();