Properly initialize URI/Matrix vars w/ urlDecode=false

Issue: SPR-16867
This commit is contained in:
Rossen Stoyanchev
2018-05-24 15:08:39 -04:00
parent 2a993bf9ff
commit 85e8634810
3 changed files with 34 additions and 35 deletions

View File

@@ -113,28 +113,27 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
String bestPattern;
Map<String, String> uriVariables;
Map<String, String> decodedUriVariables;
Set<String> patterns = info.getPatternsCondition().getPatterns();
if (patterns.isEmpty()) {
bestPattern = lookupPath;
uriVariables = Collections.emptyMap();
decodedUriVariables = Collections.emptyMap();
}
else {
bestPattern = patterns.iterator().next();
uriVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath);
decodedUriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables);
}
request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern);
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, decodedUriVariables);
if (isMatrixVariableContentAvailable()) {
Map<String, MultiValueMap<String, String>> matrixVars = extractMatrixVariables(request, uriVariables);
request.setAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, matrixVars);
}
Map<String, String> decodedUriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables);
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, decodedUriVariables);
if (!info.getProducesCondition().getProducibleMediaTypes().isEmpty()) {
Set<MediaType> mediaTypes = info.getProducesCondition().getProducibleMediaTypes();
request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, mediaTypes);

View File

@@ -345,7 +345,7 @@ public class RequestMappingInfoHandlerMappingTests {
assertEquals("", uriVariables.get("params"));
}
@Test
@Test // SPR-10140, SPR-16867
public void handleMatchMatrixVariablesDecoding() {
MockHttpServletRequest request;
@@ -357,14 +357,14 @@ public class RequestMappingInfoHandlerMappingTests {
this.handlerMapping.setUrlPathHelper(urlPathHelper);
request = new MockHttpServletRequest();
handleMatch(request, "/path{filter}", "/path;mvar=a%2fb");
handleMatch(request, "/{cars}", "/cars;mvar=a%2Fb");
MultiValueMap<String, String> matrixVariables = getMatrixVariables(request, "filter");
MultiValueMap<String, String> matrixVariables = getMatrixVariables(request, "cars");
Map<String, String> uriVariables = getUriTemplateVariables(request);
assertNotNull(matrixVariables);
assertEquals(Collections.singletonList("a/b"), matrixVariables.get("mvar"));
assertEquals(";mvar=a/b", uriVariables.get("filter"));
assertEquals("cars", uriVariables.get("cars"));
}