// FIXME: mostly copy/paste from github.com/appc/spec/actool/validate.go func DecompressingReader(rd io.Reader) (io.Reader, error) { brd := bufio.NewReaderSize(rd, 1024) header, err := brd.Peek(768) if err != nil { return nil, errors.Trace(err) } typ, err := aci.DetectFileType(bytes.NewReader(header)) if err != nil { return nil, errors.Trace(err) } var r io.Reader switch typ { case aci.TypeGzip: r, err = gzip.NewReader(brd) if err != nil { return nil, errors.Trace(err) } case aci.TypeBzip2: r = bzip2.NewReader(brd) case aci.TypeXz: r = aci.XzReader(brd) case aci.TypeTar: r = brd case aci.TypeUnknown: return nil, errors.New("unknown filetype") default: panic(fmt.Sprintf("bad type returned from DetectFileType: %v", typ)) } return r, nil }
func maybeDecompress(rs io.ReadSeeker) (io.Reader, error) { // TODO(jonboulle): this is a bit redundant with detectValType typ, err := aci.DetectFileType(rs) if err != nil { return nil, err } if _, err := rs.Seek(0, 0); err != nil { return nil, err } var r io.Reader switch typ { case aci.TypeGzip: r, err = gzip.NewReader(rs) if err != nil { return nil, fmt.Errorf("error reading gzip: %v", err) } case aci.TypeBzip2: r = bzip2.NewReader(rs) case aci.TypeXz: r = aci.XzReader(rs) case aci.TypeTar: r = rs case aci.TypeUnknown: return nil, errors.New("unknown filetype") default: // should never happen panic(fmt.Sprintf("bad type returned from DetectFileType: %v", typ)) } return r, nil }