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 771e8c542af..17fe1eeea20 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 @@ -360,14 +360,10 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable { private void params(MockHttpServletRequest request, UriComponents uriComponents) { for (Entry> entry : uriComponents.getQueryParams().entrySet()) { String name = entry.getKey(); + String urlDecodedName = urlDecode(name); for (String value : entry.getValue()) { - try { - value = (value != null ? URLDecoder.decode(value, "UTF-8") : ""); - request.addParameter(name, value); - } - catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + value = (value != null ? urlDecode(value) : ""); + request.addParameter(urlDecodedName, value); } } for (NameValuePair param : this.webRequest.getRequestParameters()) { @@ -375,6 +371,15 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable { } } + private String urlDecode(String value) { + try { + return URLDecoder.decode(value, "UTF-8"); + } + catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + private Locale parseLocale(String locale) { Matcher matcher = LOCALE_PATTERN.matcher(locale); if (!matcher.matches()) { 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 b579ea813de..4c7f9cb51a8 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 @@ -411,6 +411,27 @@ public class HtmlUnitRequestBuilderTests { assertThat(actualRequest.getParameter("name"), equalTo("value")); } + // SPR-14177 + @Test + public void buildRequestParameterMapDecodesParameterName() throws Exception { + webRequest.setUrl(new URL("http://example.com/example/?row%5B0%5D=value")); + + MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext); + + assertThat(actualRequest.getParameterMap().size(), equalTo(1)); + assertThat(actualRequest.getParameter("row[0]"), equalTo("value")); + } + + @Test + public void buildRequestParameterMapDecodesParameterValue() throws Exception { + webRequest.setUrl(new URL("http://example.com/example/?name=row%5B0%5D")); + + MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext); + + assertThat(actualRequest.getParameterMap().size(), equalTo(1)); + assertThat(actualRequest.getParameter("name"), equalTo("row[0]")); + } + @Test public void buildRequestParameterMapFromSingleQueryParamWithoutValueAndWithoutEqualsSign() throws Exception { webRequest.setUrl(new URL("http://example.com/example/?name"));