This change introduces optional compression to the `collect` commands. Users can now specify `--compression` with `gz` or `xz` to compress the output. The `serve` command has also been enhanced to transparently decompress and serve these files.
64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package compress
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"io"
|
|
|
|
"github.com/ulikunitz/xz"
|
|
)
|
|
|
|
// Compress compresses data using the specified format.
|
|
func Compress(data []byte, format string) ([]byte, error) {
|
|
var buf bytes.Buffer
|
|
var writer io.WriteCloser
|
|
var err error
|
|
|
|
switch format {
|
|
case "gz":
|
|
writer = gzip.NewWriter(&buf)
|
|
case "xz":
|
|
writer, err = xz.NewWriter(&buf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
default:
|
|
return data, nil
|
|
}
|
|
|
|
_, err = writer.Write(data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = writer.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
// Decompress decompresses data, detecting the format automatically.
|
|
func Decompress(data []byte) ([]byte, error) {
|
|
// Check for gzip header
|
|
if len(data) > 2 && data[0] == 0x1f && data[1] == 0x8b {
|
|
reader, err := gzip.NewReader(bytes.NewReader(data))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer reader.Close()
|
|
return io.ReadAll(reader)
|
|
}
|
|
|
|
// Check for xz header
|
|
if len(data) > 6 && data[0] == 0xfd && data[1] == '7' && data[2] == 'z' && data[3] == 'X' && data[4] == 'Z' && data[5] == 0x00 {
|
|
reader, err := xz.NewReader(bytes.NewReader(data))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return io.ReadAll(reader)
|
|
}
|
|
|
|
return data, nil
|
|
}
|