summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-03-12 14:28:15 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-03-12 18:55:50 +0300
commit60d62593545c8e2473d1c5c823c358d5db492085 (patch)
treed90f8695bc1b33e54fd9cb401247984e4b7ccaa7
parent4043b758ddd8a760eb93821ec901b78f98908c3d (diff)
add b64 (base64) hook
-rw-r--r--pkg/server/hook/b64.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/pkg/server/hook/b64.go b/pkg/server/hook/b64.go
new file mode 100644
index 0000000..3c21474
--- /dev/null
+++ b/pkg/server/hook/b64.go
@@ -0,0 +1,52 @@
+package hook
+
+import (
+ "encoding/base64"
+ "tunnel/pkg/netstring"
+ "tunnel/pkg/server/env"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/queue"
+)
+
+var b64Enc = base64.RawStdEncoding
+
+type b64Hook struct{}
+
+func (b64Hook) Send(rq, wq queue.Q) error {
+ e := netstring.NewEncoder(wq.Writer())
+
+ for b := range rq {
+ e.Encode(b64Enc.EncodeToString(b))
+ }
+
+ return nil
+}
+
+func (b64Hook) Recv(rq, wq queue.Q) error {
+ d := netstring.NewDecoder(rq.Reader())
+
+ for {
+ s, err := d.Decode()
+ if err != nil {
+ return err
+ }
+
+ if b, err := b64Enc.DecodeString(s); err != nil {
+ return err
+ } else {
+ wq <- b
+ }
+ }
+}
+
+func (h b64Hook) Open(env.Env) (interface{}, error) {
+ return h, nil
+}
+
+func newB64Hook(opts.Opts, env.Env) (hook, error) {
+ return b64Hook{}, nil
+}
+
+func init() {
+ register("b64", newB64Hook)
+}