package aQute.libg.gzip; import java.io.BufferedInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.zip.GZIPInputStream; public class GZipUtils { /** * Determines whether the specified stream contains gzipped data, by * checking for the GZIP magic number, and returns a stream capable of * reading those data. * * @throws IOException */ public static InputStream detectCompression(InputStream stream) throws IOException { InputStream buffered; if (stream.markSupported()) buffered = stream; else buffered = new BufferedInputStream(stream); buffered.mark(2); int magic = readUShort(buffered); buffered.reset(); InputStream result; if (magic == GZIPInputStream.GZIP_MAGIC) result = new GZIPInputStream(buffered); else result = buffered; return result; } /* * Reads unsigned short in Intel byte order. */ private static int readUShort(InputStream in) throws IOException { int b = readUByte(in); return (readUByte(in) << 8) | b; } /* * Reads unsigned byte. */ private static int readUByte(InputStream in) throws IOException { int b = in.read(); if (b == -1) { throw new EOFException(); } if (b < -1 || b > 255) { // Report on this.in, not argument in; see read{Header, Trailer}. throw new IOException(in.getClass().getName() + ".read() returned value out of range -1..255: " + b); } return b; } }