From 43faabd4cc19fc1ffa197a24e8750c44fc615c34 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Fri, 12 Aug 2016 20:43:01 -0500 Subject: [PATCH] Fix HtmlUnitRequestBuilder merge Previously invoking HtmlUnitRequestBuilder merge caused the pathInfo of the parent to be corrupted. This could additional invocations with the same parent. This fix ensures that the parent is no longer directly used. Instead, we create a copy of the parent by merging the parent that was passed in with the copy. Fixes SPR-14584 --- .../servlet/htmlunit/HtmlUnitRequestBuilder.java | 8 +++++++- .../htmlunit/HtmlUnitRequestBuilderTests.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java index 4fdaa22a043..142fceb1423 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java @@ -45,6 +45,8 @@ import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.SmartRequestBuilder; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.RequestPostProcessor; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -440,7 +442,11 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable { if (parent == null) { return this; } - if (parent instanceof RequestBuilder) { + if (parent instanceof MockHttpServletRequestBuilder) { + MockHttpServletRequestBuilder copiedParent = MockMvcRequestBuilders.get("/"); + copiedParent.merge(parent); + this.parentBuilder = copiedParent; + } else if (parent instanceof RequestBuilder) { this.parentBuilder = (RequestBuilder) parent; } if (parent instanceof SmartRequestBuilder) { diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java index 4c7f9cb51a8..016b789b604 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java @@ -894,6 +894,20 @@ public class HtmlUnitRequestBuilderTests { assertThat(mockMvc.perform(requestBuilder).andReturn().getRequest().getAttribute(attrName), equalTo(attrValue)); } + @Test // SPR-14584 + public void mergeDoesNotCorruptPathInfoOnParent() throws Exception { + String pathInfo = "/foo/bar"; + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()) + .defaultRequest(get("/")) + .build(); + + assertThat(mockMvc.perform(get(pathInfo)).andReturn().getRequest().getPathInfo(), equalTo(pathInfo)); + + mockMvc.perform(requestBuilder); + + assertThat(mockMvc.perform(get(pathInfo)).andReturn().getRequest().getPathInfo(), equalTo(pathInfo)); + } + private void assertSingleSessionCookie(String expected) { com.gargoylesoftware.htmlunit.util.Cookie jsessionidCookie = webClient.getCookieManager().getCookie("JSESSIONID");