001package co.codewizards.cloudstore.rest.shared;
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)
020                    throws IOException, WebApplicationException {
021        InputStream originalInputStream = context.getInputStream();
022
023        if (!originalInputStream.markSupported())
024                originalInputStream = new BufferedInputStream(originalInputStream);
025
026        // Test, if it contains data. We only try to unzip, if it is not empty.
027        originalInputStream.mark(5);
028        int read = originalInputStream.read();
029        originalInputStream.reset();
030
031        if (read > -1)
032                context.setInputStream(new GZIPInputStream(originalInputStream));
033        else {
034                context.setInputStream(originalInputStream); // We might have wrapped it with our BufferedInputStream!
035                logger.debug("aroundReadFrom: originalInputStream is empty! Skipping GZIP.");
036        }
037
038        return context.proceed();
039    }
040
041}