package org.geoserver.filters; import static org.junit.Assert.*; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.junit.Test; import org.springframework.mock.web.DelegatingServletOutputStream; import org.springframework.mock.web.MockFilterChain; import org.springframework.mock.web.MockFilterConfig; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletContext; public class GZipFilterTest { @Test public void testRetrieveSameOutputStream() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest("GET", "http://www.geoserver.org"); request.addHeader("accept-encoding", "gzip"); MockHttpServletResponse response = new MockHttpServletResponse(); response.setContentType("text/plain"); // run the filter GZIPFilter filter = new GZIPFilter(); MockServletContext context = new MockServletContext(); MockFilterConfig config = new MockFilterConfig(context); config.addInitParameter("compressed-types", "text/plain"); filter.init(config); MockFilterChain chain = new MockFilterChain() { @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { AlternativesResponseStream alternatives = (AlternativesResponseStream) response .getOutputStream(); GZIPResponseStream gzipStream = (GZIPResponseStream) alternatives.getStream(); GZIPOutputStream os = gzipStream.gzipstream; try { Field f = FilterOutputStream.class.getDeclaredField("out"); f.setAccessible(true); OutputStream wrapped = (OutputStream) f.get(os); // System.out.println(wrapped); // we are not memory bound assertTrue(wrapped instanceof DelegatingServletOutputStream); } catch (Exception e) { // it can happen System.out .println("Failed to retrieve original stream wrapped by the GZIPOutputStream"); e.printStackTrace(); } } }; filter.doFilter(request, response, chain); } @Test public void testGZipRemovesContentLength() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest("GET", "http://www.geoserver.org"); request.addHeader("accept-encoding", "gzip"); MockHttpServletResponse response = new MockHttpServletResponse(); response.setContentType("text/plain"); // run the filter GZIPFilter filter = new GZIPFilter(); MockServletContext context = new MockServletContext(); MockFilterConfig config = new MockFilterConfig(context); config.addInitParameter("compressed-types", "text/plain"); filter.init(config); MockFilterChain chain = new MockFilterChain() { @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { response.setContentLength(1000); AlternativesResponseStream alternatives = (AlternativesResponseStream) response .getOutputStream(); ServletOutputStream gzipStream = alternatives.getStream(); gzipStream.write(1); } }; filter.doFilter(request, response, chain); assertFalse(response.containsHeader("Content-Length")); } @Test public void testNotGZippedMantainsContentLength() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest("GET", "http://www.geoserver.org"); request.addHeader("accept-encoding", "gzip"); MockHttpServletResponse response = new MockHttpServletResponse(); response.setContentType("text/css"); // run the filter GZIPFilter filter = new GZIPFilter(); MockServletContext context = new MockServletContext(); context.setInitParameter("compressed-types", "text/plain"); MockFilterConfig config = new MockFilterConfig(context); filter.init(config); MockFilterChain chain = new MockFilterChain() { @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { response.setContentLength(1000); AlternativesResponseStream alternatives = (AlternativesResponseStream) response .getOutputStream(); ServletOutputStream gzipStream = alternatives.getStream(); gzipStream.write(1); } }; filter.doFilter(request, response, chain); assertTrue(response.containsHeader("Content-Length")); assertEquals("1000", response.getHeader("Content-Length")); } }