001package co.codewizards.cloudstore.rest.shared.interceptor;
002
003import java.io.BufferedInputStream;
004import java.io.IOException;
005import java.io.InputStream;
006import java.util.zip.GZIPInputStream;
007
008import javax.ws.rs.WebApplicationException;
009import javax.ws.rs.ext.ReaderInterceptor;
010import javax.ws.rs.ext.ReaderInterceptorContext;
011
012import org.slf4j.Logger;
013import org.slf4j.LoggerFactory;
014
015public class GZIPReaderInterceptor implements ReaderInterceptor {
016        private static final Logger logger = LoggerFactory.getLogger(GZIPReaderInterceptor.class);
017
018        @Override
019    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
020                InputStream originalInputStream = context.getInputStream();
021
022        if (!originalInputStream.markSupported())
023                originalInputStream = new BufferedInputStream(originalInputStream);
024
025        // Test, if it contains data. We only try to unzip, if it is not empty.
026        originalInputStream.mark(5);
027        int read = originalInputStream.read();
028        originalInputStream.reset();
029
030        if (read > -1)
031                context.setInputStream(new GZIPInputStream(originalInputStream));
032        else {
033                context.setInputStream(originalInputStream); // We might have wrapped it with our BufferedInputStream!
034                logger.debug("aroundReadFrom: originalInputStream is empty! Skipping GZIP.");
035        }
036        return context.proceed();
037        }
038
039}