From 4043b758ddd8a760eb93821ec901b78f98908c3d Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Thu, 12 Mar 2020 13:36:21 +0300 Subject: add b85 (ascii85) hook --- pkg/server/hook/b85.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pkg/server/hook/b85.go diff --git a/pkg/server/hook/b85.go b/pkg/server/hook/b85.go new file mode 100644 index 0000000..9851ffc --- /dev/null +++ b/pkg/server/hook/b85.go @@ -0,0 +1,57 @@ +package hook + +import ( + "encoding/ascii85" + "errors" + "tunnel/pkg/netstring" + "tunnel/pkg/server/env" + "tunnel/pkg/server/opts" + "tunnel/pkg/server/queue" +) + +type b85Hook struct{} + +func (b85Hook) Send(rq, wq queue.Q) error { + e := netstring.NewEncoder(wq.Writer()) + + for b := range rq { + out := make([]byte, ascii85.MaxEncodedLen(len(b))) + n := ascii85.Encode(out, b) + e.Encode(string(out[:n])) + } + + return nil +} + +func (b85Hook) Recv(rq, wq queue.Q) error { + d := netstring.NewDecoder(rq.Reader()) + + for { + s, err := d.Decode() + if err != nil { + return err + } + + out := make([]byte, 4*len(s)) + + if n, m, err := ascii85.Decode(out, []byte(s), true); err != nil { + return err + } else if m != len(s) { + return errors.New("decode fail: partial consumption") + } else { + wq <- out[:n] + } + } +} + +func (h b85Hook) Open(env.Env) (interface{}, error) { + return h, nil +} + +func newB85Hook(opts.Opts, env.Env) (hook, error) { + return b85Hook{}, nil +} + +func init() { + register("b85", newB85Hook) +} -- cgit v1.2.3-70-g09d2