diff options
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/server/hook/b85.go | 57 |
1 files changed, 57 insertions, 0 deletions
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) +} |
