private boolean init()

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;
    }