All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yammer.dropwizard.jetty.BiDiGzipHandler Maven / Gradle / Ivy

There is a newer version: 0.6.2
Show newest version
package com.yammer.dropwizard.jetty;

import org.eclipse.jetty.http.HttpHeaders;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.GzipHandler;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;

// TODO: 10/12/11  -- write tests for BiDiGzipHandler

/**
 * A Jetty {@link Handler} which both compresses response entities to requests with {@code gzip} as
 * an acceptable content-encoding and decompresses request entities with {@code gzip} as the given
 * content-encoding.
 */
@SuppressWarnings("IOResourceOpenedButNotSafelyClosed")
public class BiDiGzipHandler extends GzipHandler {
    private static final String GZIP_ENCODING = "gzip";

    private static class GzipServletInputStream extends ServletInputStream {
        private final GZIPInputStream input;

        private GzipServletInputStream(HttpServletRequest request, int bufferSize) throws IOException {
            this.input = new GZIPInputStream(request.getInputStream(), bufferSize);
        }

        @Override
        public void close() throws IOException {
            input.close();
        }

        @Override
        public int read(byte[] b, int off, int len) throws IOException {
            return input.read(b, off, len);
        }

        @Override
        public int available() throws IOException {
            return input.available();
        }

        @Override
        public void mark(int readlimit) {
            input.mark(readlimit);
        }

        @Override
        public boolean markSupported() {
            return input.markSupported();
        }

        @Override
        public int read() throws IOException {
            return input.read();
        }

        @Override
        public void reset() throws IOException {
            input.reset();
        }

        @Override
        public long skip(long n) throws IOException {
            return input.skip(n);
        }

        @Override
        public int read(byte[] b) throws IOException {
            return input.read(b);
        }
    }

    private static class GzipServletRequest extends HttpServletRequestWrapper {
        private final ServletInputStream input;
        private final BufferedReader reader;

        private GzipServletRequest(HttpServletRequest request, int bufferSize) throws IOException {
            super(request);
            this.input = new GzipServletInputStream(request, bufferSize);
            this.reader = new BufferedReader(new InputStreamReader(input));
        }

        @Override
        public ServletInputStream getInputStream() throws IOException {
            return input;
        }

        @Override
        public BufferedReader getReader() throws IOException {
            return reader;
        }
    }

    /**
     * Creates a new {@link BiDiGzipHandler} which forwards requests to the given handler.
     *
     * @param underlying    the underlying handler
     */
    public BiDiGzipHandler(Handler underlying) {
        setHandler(underlying);
    }

    @Override
    public void handle(String target,
                       Request baseRequest,
                       HttpServletRequest request,
                       HttpServletResponse response) throws IOException, ServletException {
        if (GZIP_ENCODING.equalsIgnoreCase(request.getHeader(HttpHeaders.CONTENT_ENCODING))) {
            super.handle(target,
                         baseRequest,
                         new GzipServletRequest(request, getBufferSize()),
                         response);
        } else {
            super.handle(target, baseRequest, request, response);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy