package hook import ( "compress/flate" "io" "tunnel/pkg/server/queue" ) type zipPipe struct{} func (zipPipe) Send(rq, wq queue.Q) error { w, err := flate.NewWriter(wq.Writer(), flate.BestCompression) if err != nil { return err } for b := range rq { if _, err := w.Write(b); err != nil { return err } if err := w.Flush(); err != nil { return err } } return w.Close() } func (zipPipe) Recv(rq, wq queue.Q) error { r := flate.NewReader(rq.Reader()) // FIXME: not received ending due to ultimate conn.Close if err := queue.IoCopy(r, wq.Writer()); err != nil { if err == io.ErrUnexpectedEOF { return nil } return err } return r.Close() } func init() { registerPipe("zip", "zip compression filter out/in", zipPipe{}) }