blob: 6606d0eec1dc4e3b3ecbc043e6b628411641ea55 [file] [log] [blame]
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;
}
}