...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package compress
18
19 import (
20 "bytes"
21 "fmt"
22 "io"
23
24 "github.com/klauspost/compress/gzip"
25 )
26
27 type gzipCodec struct{}
28
29 func (gzipCodec) NewReader(r io.Reader) io.ReadCloser {
30 ret, err := gzip.NewReader(r)
31 if err != nil {
32 panic(fmt.Errorf("codec: gzip: %w", err))
33 }
34 return ret
35 }
36
37 func (gzipCodec) Decode(dst, src []byte) []byte {
38 rdr, err := gzip.NewReader(bytes.NewReader(src))
39 if err != nil {
40 panic(err)
41 }
42
43 if dst != nil {
44 n, err := io.ReadFull(rdr, dst)
45 if err != nil {
46 panic(err)
47 }
48 return dst[:n]
49 }
50
51 dst, err = io.ReadAll(rdr)
52 if err != nil {
53 panic(err)
54 }
55
56 return dst
57 }
58
59 func (g gzipCodec) EncodeLevel(dst, src []byte, level int) []byte {
60 maxlen := int(g.CompressBound(int64(len(src))))
61 if dst == nil || cap(dst) < maxlen {
62 dst = make([]byte, 0, maxlen)
63 }
64 buf := bytes.NewBuffer(dst[:0])
65 w, err := gzip.NewWriterLevel(buf, level)
66 if err != nil {
67 panic(err)
68 }
69 _, err = w.Write(src)
70 if err != nil {
71 panic(err)
72 }
73 if err := w.Close(); err != nil {
74 panic(err)
75 }
76 return buf.Bytes()
77 }
78
79 func (g gzipCodec) Encode(dst, src []byte) []byte {
80 return g.EncodeLevel(dst, src, DefaultCompressionLevel)
81 }
82
83 func (gzipCodec) CompressBound(len int64) int64 {
84 return len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5
85 }
86
87 func (gzipCodec) NewWriter(w io.Writer) io.WriteCloser {
88 return gzip.NewWriter(w)
89 }
90
91 func (gzipCodec) NewWriterLevel(w io.Writer, level int) (io.WriteCloser, error) {
92 return gzip.NewWriterLevel(w, level)
93 }
94
95 func init() {
96 codecs[Codecs.Gzip] = gzipCodec{}
97 }
98
View as plain text