diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-12 13:36:21 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-12 18:55:50 +0300 |
| commit | 4043b758ddd8a760eb93821ec901b78f98908c3d (patch) | |
| tree | 4f0dd64a7e15aa7287730b56f851d1bfe915f6b9 /pkg/server | |
| parent | 60c6459635d2392d14f75cbbcfaf952cb1b45777 (diff) | |
add b85 (ascii85) hook
Diffstat (limited to 'pkg/server')
| -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) +} |
