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}