diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java index e304511d269..2738553fea2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java @@ -117,6 +117,9 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport private static final UrlPathHelper urlPathHelper = new UrlPathHelper(); + static { + urlPathHelper.setUrlDecode(false); + } private int order = Ordered.HIGHEST_PRECEDENCE; @@ -270,7 +273,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport String name = viewResolvers.get(i).getClass().getName() + i; getApplicationContext().getAutowireCapableBeanFactory().initializeBean(viewResolvers.get(i), name); } - + } if (this.viewResolvers.isEmpty()) { logger.warn("Did not find any ViewResolvers to delegate to; please configure them using the " + diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java index 5c3240d8fa8..14b71991915 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java @@ -100,7 +100,7 @@ public class ContentNegotiatingViewResolverTests { } // SPR-8678 - + @Test public void getMediaTypeFilenameWithContextPath() { request.setContextPath("/project-1.0.0.M3"); @@ -110,6 +110,15 @@ public class ContentNegotiatingViewResolverTests { assertTrue("Context path should be excluded", viewResolver.getMediaTypes(request).isEmpty()); } + // SPR-9390 + + @Test + public void getMediaTypeFilenameWithEncodedURI() { + request.setRequestURI("/quo%20vadis%3f.html"); + List result = viewResolver.getMediaTypes(request); + assertEquals("Invalid content type", Collections.singletonList(new MediaType("text", "html")), result); + } + @Test public void getMediaTypeParameter() { viewResolver.setFavorParameter(true); @@ -426,7 +435,7 @@ public class ContentNegotiatingViewResolverTests { StaticWebApplicationContext webAppContext = new StaticWebApplicationContext(); webAppContext.setServletContext(new MockServletContext()); webAppContext.refresh(); - + UrlBasedViewResolver urlViewResolver = new InternalResourceViewResolver(); urlViewResolver.setApplicationContext(webAppContext); ViewResolver xmlViewResolver = createMock(ViewResolver.class); @@ -435,7 +444,7 @@ public class ContentNegotiatingViewResolverTests { View xmlView = createMock("application_xml", View.class); View jsonView = createMock("application_json", View.class); viewResolver.setDefaultViews(Arrays.asList(jsonView)); - + String viewName = "redirect:anotherTest"; Locale locale = Locale.ENGLISH; @@ -449,7 +458,7 @@ public class ContentNegotiatingViewResolverTests { verify(xmlViewResolver, xmlView, jsonView); } - + @Test public void resolveViewNoMatch() throws Exception { request.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9"); @@ -505,7 +514,7 @@ public class ContentNegotiatingViewResolverTests { StaticWebApplicationContext webAppContext = new StaticWebApplicationContext(); webAppContext.setServletContext(new MockServletContext()); webAppContext.refresh(); - + InternalResourceViewResolver nestedResolver = new InternalResourceViewResolver(); nestedResolver.setApplicationContext(webAppContext); nestedResolver.setViewClass(InternalResourceView.class);