summaryrefslogtreecommitdiff
path: root/pkg/server/hook/b85.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-03-12 13:36:21 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-03-12 18:55:50 +0300
commit4043b758ddd8a760eb93821ec901b78f98908c3d (patch)
tree4f0dd64a7e15aa7287730b56f851d1bfe915f6b9 /pkg/server/hook/b85.go
parent60c6459635d2392d14f75cbbcfaf952cb1b45777 (diff)
add b85 (ascii85) hook
Diffstat (limited to 'pkg/server/hook/b85.go')
-rw-r--r--pkg/server/hook/b85.go57
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)
+}