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.

Backport of #0cd427bdd35e668dda6332ae2885d94c222d9c49.

Fixes: SPR-16453
pull/1663/head
Rossen Stoyanchev 8 years ago
parent
commit
fe4472dbeb
  1. 21
      spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java
  2. 10
      spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java

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

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -58,16 +58,18 @@ import org.springframework.web.servlet.FlashMapManager; @@ -58,16 +58,18 @@ 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
* requests in {@link MockMvc}.
* Default builder for {@link MockHttpServletRequest} required as input to
* perform requests in {@link MockMvc}.
*
* <p>Application tests will typically access this builder through the static factory
* methods in {@link MockMvcRequestBuilders}.
* <p>Application tests will typically access this builder through the static
* factory methods in {@link MockMvcRequestBuilders}.
*
* <p>Although this class cannot be extended, additional ways to initialize the
* {@code MockHttpServletRequest} can be plugged in via {@link #with(RequestPostProcessor)}.
* <p>This class is not open for extension. To apply custom initialization to
* the created {@code MockHttpServletRequest}, please use the
* {@link #with(RequestPostProcessor)} extension point.
*
* @author Rossen Stoyanchev
* @author Juergen Hoeller
@ -81,6 +83,8 @@ public class MockHttpServletRequestBuilder @@ -81,6 +83,8 @@ public class MockHttpServletRequestBuilder
private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
private static final UrlPathHelper urlPathHelper = new UrlPathHelper();
private final String method;
@ -692,7 +696,8 @@ public class MockHttpServletRequestBuilder @@ -692,7 +696,8 @@ 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) ?
urlPathHelper.decodeRequestString(request, extraPath) : null);
}
request.setPathInfo(this.pathInfo);
}

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

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -163,6 +163,14 @@ public class MockHttpServletRequestBuilderTests { @@ -163,6 +163,14 @@ public class MockHttpServletRequestBuilderTests {
assertNull(request.getPathInfo());
}
@Test // SPR-16453
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