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:
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user