PeekCompression detects whether the input stream is compressed and which algorithm is used. If r implements Peek, we will use that directly, otherwise a small number of bytes are buffered to Peek at the gzip/zstd header, and the returned PeekReader can be used as a replacement for the consumed inpu
(r io.Reader)
| 50 | // of bytes are buffered to Peek at the gzip/zstd header, and the returned |
| 51 | // PeekReader can be used as a replacement for the consumed input io.Reader. |
| 52 | func PeekCompression(r io.Reader) (compression.Compression, PeekReader, error) { |
| 53 | pr := intoPeekReader(r) |
| 54 | |
| 55 | if isGZip, _, err := checkHeader(pr, gzip.MagicHeader); err != nil { |
| 56 | return compression.None, pr, err |
| 57 | } else if isGZip { |
| 58 | return compression.GZip, pr, nil |
| 59 | } |
| 60 | |
| 61 | if isZStd, _, err := checkHeader(pr, zstd.MagicHeader); err != nil { |
| 62 | return compression.None, pr, err |
| 63 | } else if isZStd { |
| 64 | return compression.ZStd, pr, nil |
| 65 | } |
| 66 | |
| 67 | return compression.None, pr, nil |
| 68 | } |
| 69 | |
| 70 | // PeekReader is an io.Reader that also implements Peek a la bufio.Reader. |
| 71 | type PeekReader interface { |
searching dependent graphs…