Skip to content

Commit f2e4da3

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 6a9329c commit f2e4da3

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
@@ -267,13 +267,12 @@ private boolean safeExtension(HttpServletRequest request, String extension) {
267267
if (this.safeExtensions.contains(extension)) {
268268
return true;
269269
}
270+
String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
271+
if (pattern != null && pattern.endsWith("." + extension)) {
272+
return true;
273+
}
270274
if (extension.equals("html")) {
271-
String name = HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE;
272-
String pattern = (String) request.getAttribute(name);
273-
if (pattern != null && pattern.endsWith(".html")) {
274-
return true;
275-
}
276-
name = HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE;
275+
String name = HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE;
277276
Set<MediaType> mediaTypes = (Set<MediaType>) request.getAttribute(name);
278277
if (!CollectionUtils.isEmpty(mediaTypes) && mediaTypes.contains(MediaType.TEXT_HTML)) {
279278
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
@@ -1661,6 +1661,31 @@ public void initialize(GenericWebApplicationContext wac) {
16611661
assertArrayEquals(content, response.getContentAsByteArray());
16621662
}
16631663

1664+
@Test
1665+
public void responseBodyAsTextWithCssExtension() throws Exception {
1666+
initServlet(new ApplicationContextInitializer<GenericWebApplicationContext>() {
1667+
@Override
1668+
public void initialize(GenericWebApplicationContext wac) {
1669+
ContentNegotiationManagerFactoryBean factoryBean = new ContentNegotiationManagerFactoryBean();
1670+
factoryBean.afterPropertiesSet();
1671+
RootBeanDefinition adapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
1672+
adapterDef.getPropertyValues().add("contentNegotiationManager", factoryBean.getObject());
1673+
wac.registerBeanDefinition("handlerAdapter", adapterDef);
1674+
}
1675+
}, TextRestController.class);
1676+
1677+
byte[] content = "body".getBytes(Charset.forName("ISO-8859-1"));
1678+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/a4.css");
1679+
request.setContent(content);
1680+
MockHttpServletResponse response = new MockHttpServletResponse();
1681+
1682+
getServlet().service(request, response);
1683+
1684+
assertEquals(200, response.getStatus());
1685+
assertNull(response.getHeader("Content-Disposition"));
1686+
assertArrayEquals(content, response.getContentAsByteArray());
1687+
}
1688+
16641689

16651690
/*
16661691
* Controllers
@@ -3092,6 +3117,12 @@ public String a2(@RequestBody String body) {
30923117
public String a3(@RequestBody String body) throws IOException {
30933118
return body;
30943119
}
3120+
3121+
@RequestMapping(value = "/a4.css", method = RequestMethod.GET)
3122+
@ResponseBody
3123+
public String a4(@RequestBody String body) {
3124+
return body;
3125+
}
30953126
}
30963127

30973128

0 commit comments

Comments
 (0)