in src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java [343:412]
private boolean init(final boolean isFirstMember) throws IOException {
if (!isFirstMember && !decompressConcatenated) { // at least one must be true
throw new IllegalStateException("Unexpected: isFirstMember and decompressConcatenated are both false.");
}
// Check the magic bytes without a possibility of EOFException.
final int magic0 = in.read();
// If end of input was reached after decompressing at least
// one .gz member, we have reached the end of the file successfully.
if (magic0 == -1 && !isFirstMember) {
return false;
}
if (magic0 != GzipUtils.ID1 || in.read() != GzipUtils.ID2) {
throw new IOException(isFirstMember ? "Input is not in the .gz format." : "Unexpected data after a valid .gz stream.");
}
parameters = new GzipParameters();
parameters.setFileNameCharset(fileNameCharset);
// Parsing the rest of the header may throw EOFException.
final DataInput inData = new DataInputStream(in);
final int method = inData.readUnsignedByte();
if (method != Deflater.DEFLATED) {
throw new IOException("Unsupported compression method " + method + " in the .gz header");
}
final int flg = inData.readUnsignedByte();
if ((flg & GzipUtils.FRESERVED) != 0) {
throw new IOException("Reserved flags are set in the .gz header.");
}
parameters.setModificationTime(ByteUtils.fromLittleEndian(inData, 4));
switch (inData.readUnsignedByte()) { // extra flags
case GzipUtils.XFL_MAX_COMPRESSION:
parameters.setCompressionLevel(Deflater.BEST_COMPRESSION);
break;
case GzipUtils.XFL_MAX_SPEED:
parameters.setCompressionLevel(Deflater.BEST_SPEED);
break;
default:
parameters.setCompressionLevel(Deflater.DEFAULT_COMPRESSION);
break;
}
parameters.setOperatingSystem(inData.readUnsignedByte());
// Extra field
if ((flg & GzipUtils.FEXTRA) != 0) {
int xlen = inData.readUnsignedByte();
xlen |= inData.readUnsignedByte() << 8;
final byte[] extra = new byte[xlen];
inData.readFully(extra);
parameters.setExtraField(ExtraField.fromBytes(extra));
}
// Original file name
if ((flg & GzipUtils.FNAME) != 0) {
parameters.setFileName(new String(readToNull(inData), parameters.getFileNameCharset()));
}
// Comment
if ((flg & GzipUtils.FCOMMENT) != 0) {
parameters.setComment(new String(readToNull(inData), parameters.getFileNameCharset()));
}
// Header "CRC16" which is actually a truncated CRC32 (which isn't
// as good as real CRC16). I don't know if any encoder implementation
// sets this, so it's not worth trying to verify it. GNU gzip 1.4
// doesn't support this field, but zlib seems to be able to at least
// skip over it.
if ((flg & GzipUtils.FHCRC) != 0) {
parameters.setHeaderCRC(true);
inData.readShort();
}
// Reset
inflater.reset();
crc.reset();
onMemberStart.accept(this);
return true;
}