@Before public void setup() { super.setup(); filter = Mockito.spy(new GZipResponseFilter()); response = new HttpResponseMessageImpl(context, request, 99); response.getHeaders().set(HttpHeaderNames.CONTENT_TYPE, "text/html"); }
@Test public void prepareResponseBody_NeedsGZipping() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); byte[] originBody = "blah".getBytes(); response.getHeaders().set("Content-Length", Integer.toString(originBody.length)); Mockito.when(filter.isRightSizeForGzip(response)).thenReturn(true); //Force GZip for small response response.setHasBody(true); assertTrue(filter.shouldFilter(response)); final HttpResponseMessage result = filter.apply(response); final HttpContent hc1 = filter.processContentChunk(response, new DefaultHttpContent(Unpooled.wrappedBuffer(originBody)).retain()); final HttpContent hc2 = filter.processContentChunk(response, new DefaultLastHttpContent()); final byte[] body = new byte[hc1.content().readableBytes() + hc2.content().readableBytes()]; final int hc1Len = hc1.content().readableBytes(); final int hc2Len = hc2.content().readableBytes(); hc1.content().readBytes(body, 0, hc1Len); hc2.content().readBytes(body, hc1Len, hc2Len); // Check body is a gzipped version of the origin body. byte[] unzippedBytes = IOUtils.toByteArray(new GZIPInputStream(new ByteArrayInputStream(body))); String bodyStr = new String(unzippedBytes, "UTF-8"); assertEquals("blah", bodyStr); assertEquals("gzip", result.getHeaders().getFirst("Content-Encoding")); // Check Content-Length header has been removed.; assertEquals(0, result.getHeaders().get("Content-Length").size()); }
@Override public boolean shouldFilter(HttpResponseMessage response) { if (!ENABLED.get() || !response.hasBody() || response.getContext().isInBrownoutMode()) { return false; } if (response.getContext().get(CommonContextKeys.GZIPPER) != null) { return true; } // A flag on SessionContext can be set to override normal mechanism of checking if client accepts gzip.; final HttpRequestInfo request = response.getInboundRequest(); final Boolean overrideIsGzipRequested = (Boolean) response.getContext().get(CommonContextKeys.OVERRIDE_GZIP_REQUESTED); final boolean isGzipRequested = (overrideIsGzipRequested == null) ? HttpUtils.acceptsGzip(request.getHeaders()) : overrideIsGzipRequested.booleanValue(); // Check the headers to see if response is already gzipped. final Headers respHeaders = response.getHeaders(); boolean isResponseGzipped = HttpUtils.isGzipped(respHeaders); // Decide what to do.; final boolean shouldGzip = isGzippableContentType(response) && isGzipRequested && !isResponseGzipped && isRightSizeForGzip(response); if (shouldGzip) { response.getContext().set(CommonContextKeys.GZIPPER, new Gzipper()); } return shouldGzip; }
@Test public void prepareResponseBody_NeedsGZipping_butTooSmall() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); byte[] originBody = "blah".getBytes(); response.getHeaders().set("Content-Length", Integer.toString(originBody.length)); response.setHasBody(true); assertFalse(filter.shouldFilter(response)); }
@Test public void prepareChunkedEncodedResponseBody_NeedsGZipping() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); response.getHeaders().set("Transfer-Encoding", "chunked"); response.setHasBody(true); assertTrue(filter.shouldFilter(response)); } }
@Test public void prepareResponseBody_NeedsGZipping() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); byte[] originBody = "blah".getBytes(); response.getHeaders().set("Content-Length", Integer.toString(originBody.length)); Mockito.when(filter.isRightSizeForGzip(response)).thenReturn(true); //Force GZip for small response response.setHasBody(true); assertTrue(filter.shouldFilter(response)); final HttpResponseMessage result = filter.apply(response); final HttpContent hc1 = filter.processContentChunk(response, new DefaultHttpContent(Unpooled.wrappedBuffer(originBody)).retain()); final HttpContent hc2 = filter.processContentChunk(response, new DefaultLastHttpContent()); final byte[] body = new byte[hc1.content().readableBytes() + hc2.content().readableBytes()]; final int hc1Len = hc1.content().readableBytes(); final int hc2Len = hc2.content().readableBytes(); hc1.content().readBytes(body, 0, hc1Len); hc2.content().readBytes(body, hc1Len, hc2Len); // Check body is a gzipped version of the origin body. byte[] unzippedBytes = IOUtils.toByteArray(new GZIPInputStream(new ByteArrayInputStream(body))); String bodyStr = new String(unzippedBytes, "UTF-8"); assertEquals("blah", bodyStr); assertEquals("gzip", result.getHeaders().getFirst("Content-Encoding")); // Check Content-Length header has been removed.; assertEquals(0, result.getHeaders().get("Content-Length").size()); }
@Override public boolean shouldFilter(HttpResponseMessage response) { if (!ENABLED.get() || !response.hasBody() || response.getContext().isInBrownoutMode()) { return false; } if (response.getContext().get(CommonContextKeys.GZIPPER) != null) { return true; } // A flag on SessionContext can be set to override normal mechanism of checking if client accepts gzip.; final HttpRequestInfo request = response.getInboundRequest(); final Boolean overrideIsGzipRequested = (Boolean) response.getContext().get(CommonContextKeys.OVERRIDE_GZIP_REQUESTED); final boolean isGzipRequested = (overrideIsGzipRequested == null) ? HttpUtils.acceptsGzip(request.getHeaders()) : overrideIsGzipRequested.booleanValue(); // Check the headers to see if response is already gzipped. final Headers respHeaders = response.getHeaders(); boolean isResponseGzipped = HttpUtils.isGzipped(respHeaders); // Decide what to do.; final boolean shouldGzip = isGzippableContentType(response) && isGzipRequested && !isResponseGzipped && isRightSizeForGzip(response); if (shouldGzip) { response.getContext().set(CommonContextKeys.GZIPPER, new Gzipper()); } return shouldGzip; }
@Test public void prepareResponseBody_NeedsGZipping_butTooSmall() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); byte[] originBody = "blah".getBytes(); response.getHeaders().set("Content-Length", Integer.toString(originBody.length)); response.setHasBody(true); assertFalse(filter.shouldFilter(response)); }
@Before public void setup() { super.setup(); filter = Mockito.spy(new GZipResponseFilter()); response = new HttpResponseMessageImpl(context, request, 99); response.getHeaders().set(HttpHeaderNames.CONTENT_TYPE, "text/html"); }
@Test public void prepareResponseBody_NeedsGZipping() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); byte[] originBody = "blah".getBytes(); response.getHeaders().set("Content-Length", Integer.toString(originBody.length)); Mockito.when(filter.isRightSizeForGzip(response)).thenReturn(true); //Force GZip for small response response.setHasBody(true); assertTrue(filter.shouldFilter(response)); final HttpResponseMessage result = filter.apply(response); final HttpContent hc1 = filter.processContentChunk(response, new DefaultHttpContent(Unpooled.wrappedBuffer(originBody)).retain()); final HttpContent hc2 = filter.processContentChunk(response, new DefaultLastHttpContent()); final byte[] body = new byte[hc1.content().readableBytes() + hc2.content().readableBytes()]; final int hc1Len = hc1.content().readableBytes(); final int hc2Len = hc2.content().readableBytes(); hc1.content().readBytes(body, 0, hc1Len); hc2.content().readBytes(body, hc1Len, hc2Len); // Check body is a gzipped version of the origin body. byte[] unzippedBytes = IOUtils.toByteArray(new GZIPInputStream(new ByteArrayInputStream(body))); String bodyStr = new String(unzippedBytes, "UTF-8"); assertEquals("blah", bodyStr); assertEquals("gzip", result.getHeaders().getFirst("Content-Encoding")); // Check Content-Length header has been removed.; assertEquals(0, result.getHeaders().get("Content-Length").size()); }
@Override public boolean shouldFilter(HttpResponseMessage response) { if (!response.hasBody() || response.getContext().isInBrownoutMode()) { return false; } if (response.getContext().get(CommonContextKeys.GZIPPER) != null) { return true; } // A flag on SessionContext can be set to override normal mechanism of checking if client accepts gzip.; final HttpRequestInfo request = response.getInboundRequest(); final Boolean overrideIsGzipRequested = (Boolean) response.getContext().get(CommonContextKeys.OVERRIDE_GZIP_REQUESTED); final boolean isGzipRequested = (overrideIsGzipRequested == null) ? HttpUtils.acceptsGzip(request.getHeaders()) : overrideIsGzipRequested.booleanValue(); // Check the headers to see if response is already gzipped. final Headers respHeaders = response.getHeaders(); boolean isResponseGzipped = HttpUtils.isGzipped(respHeaders); // Decide what to do.; final boolean shouldGzip = isGzippableContentType(response) && isGzipRequested && !isResponseGzipped && isRightSizeForGzip(response); if (shouldGzip) { response.getContext().set(CommonContextKeys.GZIPPER, new Gzipper()); } return shouldGzip; }
@Test public void prepareChunkedEncodedResponseBody_NeedsGZipping() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); response.getHeaders().set("Transfer-Encoding", "chunked"); response.setHasBody(true); assertTrue(filter.shouldFilter(response)); } }
@Before public void setup() { super.setup(); filter = Mockito.spy(new GZipResponseFilter()); response = new HttpResponseMessageImpl(context, request, 99); response.getHeaders().set(HttpHeaderNames.CONTENT_TYPE, "text/html"); }
@Test public void prepareResponseBody_NeedsGZipping_butTooSmall() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); byte[] originBody = "blah".getBytes(); response.getHeaders().set("Content-Length", Integer.toString(originBody.length)); response.setHasBody(true); assertFalse(filter.shouldFilter(response)); }
@Test public void prepareChunkedEncodedResponseBody_NeedsGZipping() throws Exception { originalRequestHeaders.set("Accept-Encoding", "gzip"); response.getHeaders().set("Transfer-Encoding", "chunked"); response.setHasBody(true); assertTrue(filter.shouldFilter(response)); } }