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  }