Skip to content

Commit d500d52

Browse files
committed
Whitelist extension if present in the request mapping
We know skip the Content-Disposition header for any extension if the chosen request mapping explicitly contains the URl extension. Issue: SPR-13629
1 parent 71a9eb7 commit d500d52

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,13 +311,12 @@ private boolean safeExtension(HttpServletRequest request, String extension) {
311311
if (this.safeExtensions.contains(extension)) {
312312
return true;
313313
}
314+
String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
315+
if (pattern != null && pattern.endsWith("." + extension)) {
316+
return true;
317+
}
314318
if (extension.equals("html")) {
315-
String name = HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE;
316-
String pattern = (String) request.getAttribute(name);
317-
if (pattern != null && pattern.endsWith(".html")) {
318-
return true;
319-
}
320-
name = HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE;
319+
String name = HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE;
321320
Set<MediaType> mediaTypes = (Set<MediaType>) request.getAttribute(name);
322321
if (!CollectionUtils.isEmpty(mediaTypes) && mediaTypes.contains(MediaType.TEXT_HTML)) {
323322
return true;

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,6 +1687,32 @@ public void initialize(GenericWebApplicationContext wac) {
16871687
assertArrayEquals(content, response.getContentAsByteArray());
16881688
}
16891689

1690+
@Test
1691+
public void responseBodyAsTextWithCssExtension() throws Exception {
1692+
initServlet(new ApplicationContextInitializer<GenericWebApplicationContext>() {
1693+
@Override
1694+
public void initialize(GenericWebApplicationContext wac) {
1695+
ContentNegotiationManagerFactoryBean factoryBean = new ContentNegotiationManagerFactoryBean();
1696+
factoryBean.afterPropertiesSet();
1697+
RootBeanDefinition adapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
1698+
adapterDef.getPropertyValues().add("contentNegotiationManager", factoryBean.getObject());
1699+
wac.registerBeanDefinition("handlerAdapter", adapterDef);
1700+
}
1701+
}, TextRestController.class);
1702+
1703+
byte[] content = "body".getBytes(Charset.forName("ISO-8859-1"));
1704+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/a4.css");
1705+
request.setContent(content);
1706+
MockHttpServletResponse response = new MockHttpServletResponse();
1707+
1708+
getServlet().service(request, response);
1709+
1710+
assertEquals(200, response.getStatus());
1711+
assertEquals("text/css", response.getContentType());
1712+
assertNull(response.getHeader("Content-Disposition"));
1713+
assertArrayEquals(content, response.getContentAsByteArray());
1714+
}
1715+
16901716
/*
16911717
* Controllers
16921718
*/
@@ -3142,6 +3168,11 @@ public String a2(@RequestBody String body) {
31423168
public String a3(@RequestBody String body) throws IOException {
31433169
return body;
31443170
}
3171+
3172+
@RequestMapping(value = "/a4.css", method = RequestMethod.GET)
3173+
public String a4(@RequestBody String body) {
3174+
return body;
3175+
}
31453176
}
31463177

31473178

0 commit comments

Comments
 (0)