// Copyright 2014 The Cayley Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "bufio" "bytes" "compress/bzip2" "compress/gzip" "io" ) const ( gzipMagic = "\x1f\x8b" b2zipMagic = "BZh" ) // Decompressor detects the file type of an io.Reader between // bzip, gzip, or raw quad file. func Decompressor(r io.Reader) (io.Reader, error) { br := bufio.NewReader(r) buf, err := br.Peek(3) if err != nil { return nil, err } switch { case bytes.Compare(buf[:2], []byte(gzipMagic)) == 0: return gzip.NewReader(br) case bytes.Compare(buf[:3], []byte(b2zipMagic)) == 0: return bzip2.NewReader(br), nil default: return br, nil } }