github.com/apcera/util@v0.0.0-20180322191801-7a50bc84ee48/tarhelper/compression.go (about) 1 // Copyright 2014 Apcera Inc. All rights reserved. 2 3 package tarhelper 4 5 import ( 6 "bufio" 7 "bytes" 8 "compress/bzip2" 9 "compress/gzip" 10 "io" 11 ) 12 13 var decompressorTypes map[string]Decompressor 14 15 func AddDecompressor(name string, comp Decompressor) { 16 decompressorTypes[name] = comp 17 } 18 19 func init() { 20 decompressorTypes = map[string]Decompressor{} 21 AddDecompressor("gzip", &GzipDecompressor{}) 22 AddDecompressor("bzip2", &Bzip2Decompressor{}) 23 } 24 25 type Decompressor interface { 26 Detect(*bufio.Reader) bool 27 NewReader(io.Reader) (io.Reader, error) 28 } 29 30 type GzipDecompressor struct{} 31 32 func (c *GzipDecompressor) Detect(br *bufio.Reader) bool { 33 data, err := br.Peek(2) 34 if err != nil { 35 return false 36 } 37 return bytes.Equal(data, []byte{0x1f, 0x8b}) 38 } 39 40 func (c *GzipDecompressor) NewReader(src io.Reader) (io.Reader, error) { 41 return gzip.NewReader(src) 42 } 43 44 type Bzip2Decompressor struct{} 45 46 func (c *Bzip2Decompressor) Detect(br *bufio.Reader) bool { 47 data, err := br.Peek(2) 48 if err != nil { 49 return false 50 } 51 return bytes.Equal(data, []byte{0x42, 0x5a}) 52 } 53 54 func (c *Bzip2Decompressor) NewReader(src io.Reader) (io.Reader, error) { 55 return bzip2.NewReader(src), nil 56 }