in src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java [201:280]
public static String detect(final InputStream in) throws ArchiveException {
if (in == null) {
throw new IllegalArgumentException("Stream must not be null.");
}
if (!in.markSupported()) {
throw new IllegalArgumentException("Mark is not supported.");
}
final byte[] signature = new byte[SIGNATURE_SIZE];
in.mark(signature.length);
int signatureLength = -1;
try {
signatureLength = IOUtils.readFully(in, signature);
in.reset();
} catch (final IOException e) {
throw new ArchiveException("IOException while reading signature.", e);
}
if (ZipArchiveInputStream.matches(signature, signatureLength)) {
return ZIP;
}
if (JarArchiveInputStream.matches(signature, signatureLength)) {
return JAR;
}
if (ArArchiveInputStream.matches(signature, signatureLength)) {
return AR;
}
if (CpioArchiveInputStream.matches(signature, signatureLength)) {
return CPIO;
}
if (ArjArchiveInputStream.matches(signature, signatureLength)) {
return ARJ;
}
if (SevenZFile.matches(signature, signatureLength)) {
return SEVEN_Z;
}
// Dump needs a bigger buffer to check the signature;
final byte[] dumpsig = new byte[DUMP_SIGNATURE_SIZE];
in.mark(dumpsig.length);
try {
signatureLength = IOUtils.readFully(in, dumpsig);
in.reset();
} catch (final IOException e) {
throw new ArchiveException("IOException while reading dump signature", e);
}
if (DumpArchiveInputStream.matches(dumpsig, signatureLength)) {
return DUMP;
}
// Tar needs an even bigger buffer to check the signature; read the first block
final byte[] tarHeader = new byte[TAR_HEADER_SIZE];
in.mark(tarHeader.length);
try {
signatureLength = IOUtils.readFully(in, tarHeader);
in.reset();
} catch (final IOException e) {
throw new ArchiveException("IOException while reading tar signature", e);
}
if (TarArchiveInputStream.matches(tarHeader, signatureLength)) {
return TAR;
}
// COMPRESS-117 - improve auto-recognition
if (signatureLength >= TAR_HEADER_SIZE) {
try (TarArchiveInputStream tais = new TarArchiveInputStream(new ByteArrayInputStream(tarHeader))) {
// COMPRESS-191 - verify the header checksum
if (tais.getNextTarEntry().isCheckSumOK()) {
return TAR;
}
} catch (final Exception e) { // NOPMD NOSONAR
// can generate IllegalArgumentException as well
// as IOException
// autodetection, simply not a TAR
// ignored
}
}
throw new ArchiveException("No Archiver found for the stream signature");
}