public BiDiGzipHandler build(@Nullable Handler handler) { final BiDiGzipHandler gzipHandler = new BiDiGzipHandler(); gzipHandler.setHandler(handler); gzipHandler.setMinGzipSize((int) minimumEntitySize.toBytes()); gzipHandler.setInputBufferSize((int) bufferSize.toBytes()); gzipHandler.setCompressionLevel(deflateCompressionLevel); gzipHandler.setSyncFlush(syncFlush); if (compressedMimeTypes != null) { gzipHandler.setIncludedMimeTypes(Iterables.toArray(compressedMimeTypes, String.class)); } if (includedMethods != null) { gzipHandler.setIncludedMethods(Iterables.toArray(includedMethods, String.class)); } gzipHandler.setExcludedAgentPatterns(Iterables.toArray(excludedUserAgentPatterns, String.class)); gzipHandler.setInflateNoWrap(gzipCompatibleInflation); return gzipHandler; } }
@Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { final String encoding = request.getHeader(HttpHeader.CONTENT_ENCODING.asString()); if (GZIP.equalsIgnoreCase(encoding)) { super.handle(target, baseRequest, wrapGzippedRequest(removeContentHeaders(request)), response); } else if (DEFLATE.equalsIgnoreCase(encoding)) { super.handle(target, baseRequest, wrapDeflatedRequest(removeContentHeaders(request)), response); } else { super.handle(target, baseRequest, request, response); } }
private WrappedServletRequest wrapDeflatedRequest(HttpServletRequest request) throws IOException { final Inflater inflater = buildInflater(); try { final InflaterInputStream input = new InflaterInputStream(request.getInputStream(), inflater, inputBufferSize) { @Override public void close() throws IOException { super.close(); localInflater.set(inflater); } }; return new WrappedServletRequest(request, new ZipExceptionHandlingInputStream(input, DEFLATE)); } catch (IOException e) { throw ZipExceptionHandlingInputStream.handleException(DEFLATE, e); } }