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}