package hook import ( "compress/flate" "io" "tunnel/pkg/server/env" "tunnel/pkg/server/opts" "tunnel/pkg/server/queue" ) type zipHook struct{} func (zipHook) 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 (zipHook) 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 (h zipHook) Open(env.Env) (interface{}, error) { return h, nil } func newZipHook(opts.Opts) (hook, error) { return zipHook{}, nil } func init() { register("zip", newZipHook) }