ShallowEtagHeaderFilter writes body early on sendError/sendRedirect and interprets setContentLength/setBufferSize as a hint for capacity increase

Issue: SPR-11705
Issue: SPR-11717
This commit is contained in:
Juergen Hoeller
2014-04-22 23:14:48 +02:00
parent 700c3b257f
commit 3f392e32f5
2 changed files with 129 additions and 30 deletions

View File

@@ -32,6 +32,11 @@ import org.springframework.util.FileCopyUtils;
import static org.junit.Assert.*;
/**
* @author Arjen Poutsma
* @author Brian Clozel
* @author Juergen Hoeller
*/
public class ShallowEtagHeaderFilterTests {
private ShallowEtagHeaderFilter filter;
@@ -64,7 +69,6 @@ public class ShallowEtagHeaderFilterTests {
final byte[] responseBody = "Hello World".getBytes("UTF-8");
FilterChain filterChain = new FilterChain() {
@Override
public void doFilter(ServletRequest filterRequest, ServletResponse filterResponse)
throws IOException, ServletException {
@@ -73,7 +77,6 @@ public class ShallowEtagHeaderFilterTests {
FileCopyUtils.copy(responseBody, filterResponse.getOutputStream());
}
};
filter.doFilter(request, response, filterChain);
assertEquals("Invalid status", 200, response.getStatus());
@@ -90,7 +93,6 @@ public class ShallowEtagHeaderFilterTests {
MockHttpServletResponse response = new MockHttpServletResponse();
FilterChain filterChain = new FilterChain() {
@Override
public void doFilter(ServletRequest filterRequest, ServletResponse filterResponse)
throws IOException, ServletException {
@@ -100,7 +102,6 @@ public class ShallowEtagHeaderFilterTests {
filterResponse.setContentLength(responseBody.length);
}
};
filter.doFilter(request, response, filterChain);
assertEquals("Invalid status", 304, response.getStatus());
@@ -117,7 +118,6 @@ public class ShallowEtagHeaderFilterTests {
MockHttpServletResponse response = new MockHttpServletResponse();
FilterChain filterChain = new FilterChain() {
@Override
public void doFilter(ServletRequest filterRequest, ServletResponse filterResponse)
throws IOException, ServletException {
@@ -127,7 +127,6 @@ public class ShallowEtagHeaderFilterTests {
FileCopyUtils.copy(responseBody, filterResponse.getWriter());
}
};
filter.doFilter(request, response, filterChain);
assertEquals("Invalid status", 304, response.getStatus());
@@ -136,4 +135,75 @@ public class ShallowEtagHeaderFilterTests {
assertArrayEquals("Invalid content", new byte[0], response.getContentAsByteArray());
}
}
@Test
public void filterSendError() throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/hotels");
MockHttpServletResponse response = new MockHttpServletResponse();
final byte[] responseBody = "Hello World".getBytes("UTF-8");
FilterChain filterChain = new FilterChain() {
@Override
public void doFilter(ServletRequest filterRequest, ServletResponse filterResponse)
throws IOException, ServletException {
assertEquals("Invalid request passed", request, filterRequest);
FileCopyUtils.copy(responseBody, filterResponse.getOutputStream());
((HttpServletResponse) filterResponse).sendError(HttpServletResponse.SC_FORBIDDEN);
}
};
filter.doFilter(request, response, filterChain);
assertEquals("Invalid status", 403, response.getStatus());
assertNull("Invalid ETag header", response.getHeader("ETag"));
assertTrue("Invalid Content-Length header", response.getContentLength() > 0);
assertArrayEquals("Invalid content", responseBody, response.getContentAsByteArray());
}
@Test
public void filterSendErrorMessage() throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/hotels");
MockHttpServletResponse response = new MockHttpServletResponse();
final byte[] responseBody = "Hello World".getBytes("UTF-8");
FilterChain filterChain = new FilterChain() {
@Override
public void doFilter(ServletRequest filterRequest, ServletResponse filterResponse)
throws IOException, ServletException {
assertEquals("Invalid request passed", request, filterRequest);
FileCopyUtils.copy(responseBody, filterResponse.getOutputStream());
((HttpServletResponse) filterResponse).sendError(HttpServletResponse.SC_FORBIDDEN, "ERROR");
}
};
filter.doFilter(request, response, filterChain);
assertEquals("Invalid status", 403, response.getStatus());
assertNull("Invalid ETag header", response.getHeader("ETag"));
assertTrue("Invalid Content-Length header", response.getContentLength() > 0);
assertArrayEquals("Invalid content", responseBody, response.getContentAsByteArray());
assertEquals("Invalid error message", "ERROR", response.getErrorMessage());
}
@Test
public void filterSendRedirect() throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/hotels");
MockHttpServletResponse response = new MockHttpServletResponse();
final byte[] responseBody = "Hello World".getBytes("UTF-8");
FilterChain filterChain = new FilterChain() {
@Override
public void doFilter(ServletRequest filterRequest, ServletResponse filterResponse)
throws IOException, ServletException {
assertEquals("Invalid request passed", request, filterRequest);
FileCopyUtils.copy(responseBody, filterResponse.getOutputStream());
((HttpServletResponse) filterResponse).sendRedirect("http://www.google.com");
}
};
filter.doFilter(request, response, filterChain);
assertEquals("Invalid status", 302, response.getStatus());
assertNull("Invalid ETag header", response.getHeader("ETag"));
assertTrue("Invalid Content-Length header", response.getContentLength() > 0);
assertArrayEquals("Invalid content", responseBody, response.getContentAsByteArray());
assertEquals("Invalid redirect URL", "http://www.google.com", response.getRedirectedUrl());
}
}