Browse Source

Extend Content-Disposition "inline" to error responses

We don't expect a browser to save error responses to a file but we
extend this protection anyway since "inline" is only a suggestion
that shouldn't have any side effects.
pull/25798/head
Rossen Stoyanchev 4 years ago
parent
commit
16d125ce76
  1. 2
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java
  2. 27
      spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java

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

@ -411,7 +411,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe @@ -411,7 +411,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
try {
int status = response.getServletResponse().getStatus();
if (status < 200 || status > 299) {
if (status < 200 || (status > 299 && status < 400)) {
return;
}
}

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

@ -400,6 +400,25 @@ public class RequestResponseBodyMethodProcessorTests { @@ -400,6 +400,25 @@ public class RequestResponseBodyMethodProcessorTests {
this.servletRequest.removeAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE);
}
@Test
public void addContentDispositionHeaderToErrorResponse() throws Exception {
ContentNegotiationManagerFactoryBean factory = new ContentNegotiationManagerFactoryBean();
factory.addMediaType("pdf", new MediaType("application", "pdf"));
factory.afterPropertiesSet();
RequestResponseBodyMethodProcessor processor = new RequestResponseBodyMethodProcessor(
Collections.singletonList(new StringHttpMessageConverter()),
factory.getObject());
this.servletRequest.setRequestURI("/hello.dataless");
this.servletResponse.setStatus(400);
processor.handleReturnValue("body", this.returnTypeString, this.container, this.request);
String header = servletResponse.getHeader("Content-Disposition");
assertThat(header).isEqualTo("inline;filename=f.txt");
}
@Test
public void supportsReturnTypeResponseBodyOnType() throws Exception {
Method method = ResponseBodyController.class.getMethod("handle");
@ -724,10 +743,14 @@ public class RequestResponseBodyMethodProcessorTests { @@ -724,10 +743,14 @@ public class RequestResponseBodyMethodProcessorTests {
String header = servletResponse.getHeader("Content-Disposition");
if (expectContentDisposition) {
assertThat(header).as("Expected 'Content-Disposition' header. Use case: '" + comment + "'").isEqualTo("inline;filename=f.txt");
assertThat(header)
.as("Expected 'Content-Disposition' header. Use case: '" + comment + "'")
.isEqualTo("inline;filename=f.txt");
}
else {
assertThat(header).as("Did not expect 'Content-Disposition' header. Use case: '" + comment + "'").isNull();
assertThat(header)
.as("Did not expect 'Content-Disposition' header. Use case: '" + comment + "'")
.isNull();
}
this.servletRequest = new MockHttpServletRequest();

Loading…
Cancel
Save