Browse Source

MockHttpServletRequestBuilder decodes pathInfo

Previously MockHttpServletRequestBuilder calculated the pathInfo from the
provided URL without decoding the value. This meant that the pathInfo
incorrectly included URL encoded values.

Now MockHttpServletRequestBuilder properly decodes the pathInfo.

Fixes: SPR-16453
pull/1606/merge
Rob Winch 7 years ago committed by Rossen Stoyanchev
parent
commit
0cd427bdd3
  1. 5
      spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java
  2. 8
      spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java

5
spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java

@ -59,6 +59,7 @@ import org.springframework.web.servlet.FlashMapManager;
import org.springframework.web.servlet.support.SessionFlashMapManager; import org.springframework.web.servlet.support.SessionFlashMapManager;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.util.UriUtils; import org.springframework.web.util.UriUtils;
import org.springframework.web.util.UrlPathHelper;
/** /**
* Default builder for {@link MockHttpServletRequest} required as input to perform * Default builder for {@link MockHttpServletRequest} required as input to perform
@ -80,6 +81,8 @@ import org.springframework.web.util.UriUtils;
public class MockHttpServletRequestBuilder public class MockHttpServletRequestBuilder
implements ConfigurableSmartRequestBuilder<MockHttpServletRequestBuilder>, Mergeable { implements ConfigurableSmartRequestBuilder<MockHttpServletRequestBuilder>, Mergeable {
private final UrlPathHelper urlPathHelper = new UrlPathHelper();
private final String method; private final String method;
private final URI url; private final URI url;
@ -696,7 +699,7 @@ public class MockHttpServletRequestBuilder
"Invalid servlet path [" + this.servletPath + "] for request URI [" + requestUri + "]"); "Invalid servlet path [" + this.servletPath + "] for request URI [" + requestUri + "]");
} }
String extraPath = requestUri.substring(this.contextPath.length() + this.servletPath.length()); String extraPath = requestUri.substring(this.contextPath.length() + this.servletPath.length());
this.pathInfo = (StringUtils.hasText(extraPath) ? extraPath : null); this.pathInfo = (StringUtils.hasText(extraPath) ? this.urlPathHelper.decodeRequestString(request, extraPath) : null);
} }
request.setPathInfo(this.pathInfo); request.setPathInfo(this.pathInfo);
} }

8
spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java

@ -164,6 +164,14 @@ public class MockHttpServletRequestBuilderTests {
assertNull(request.getPathInfo()); assertNull(request.getPathInfo());
} }
@Test
public void pathInfoIsDecoded() {
this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels 42");
MockHttpServletRequest request = this.builder.buildRequest(this.servletContext);
assertEquals("/travel/hotels 42", request.getPathInfo());
}
@Test @Test
public void contextPathServletPathInvalid() { public void contextPathServletPathInvalid() {
testContextPathServletPathInvalid("/Foo", "", "Request URI [/foo/bar] does not start with context path [/Foo]"); testContextPathServletPathInvalid("/Foo", "", "Request URI [/foo/bar] does not start with context path [/Foo]");

Loading…
Cancel
Save