...
1
15
16 package content
17
18 import (
19 "compress/gzip"
20 "fmt"
21 "io"
22
23 "github.com/containerd/containerd/content"
24 )
25
26
27
28
29
30
31
32 func NewGunzipWriter(writer content.Writer, opts ...WriterOpt) content.Writer {
33
34 wOpts := DefaultWriterOpts()
35 for _, opt := range opts {
36 if err := opt(&wOpts); err != nil {
37 return nil
38 }
39 }
40 return NewPassthroughWriter(writer, func(r io.Reader, w io.Writer, done chan<- error) {
41 gr, err := gzip.NewReader(r)
42 if err != nil {
43 done <- fmt.Errorf("error creating gzip reader: %v", err)
44 return
45 }
46
47 b := make([]byte, wOpts.Blocksize, wOpts.Blocksize)
48 for {
49 var n int
50 n, err = gr.Read(b)
51 if err != nil && err != io.EOF {
52 err = fmt.Errorf("GunzipWriter data read error: %v\n", err)
53 break
54 }
55 l := n
56 if n > len(b) {
57 l = len(b)
58 }
59 if _, err2 := w.Write(b[:l]); err2 != nil {
60 err = fmt.Errorf("GunzipWriter: error writing to underlying writer: %v", err2)
61 break
62 }
63 if err == io.EOF {
64
65 err = nil
66 break
67 }
68 }
69 gr.Close()
70 done <- err
71 }, opts...)
72 }
73
View as plain text