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

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

@ -164,6 +164,14 @@ public class MockHttpServletRequestBuilderTests { @@ -164,6 +164,14 @@ public class MockHttpServletRequestBuilderTests {
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
public void contextPathServletPathInvalid() {
testContextPathServletPathInvalid("/Foo", "", "Request URI [/foo/bar] does not start with context path [/Foo]");

Loading…
Cancel
Save