summaryrefslogtreecommitdiff
path: root/pkg/server/hook/split.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-02-29 00:58:01 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-02-29 00:58:01 +0300
commitc55afd2de177f128fae6e1c52d0c56af17096258 (patch)
tree2b06eeabf4db3a6c7ef357fb1569c4e8f72aab68 /pkg/server/hook/split.go
parent11501b56a751d2959480aaeaf2036eff586e5629 (diff)
rename module to hook
Diffstat (limited to 'pkg/server/hook/split.go')
-rw-r--r--pkg/server/hook/split.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/pkg/server/hook/split.go b/pkg/server/hook/split.go
new file mode 100644
index 0000000..75faf48
--- /dev/null
+++ b/pkg/server/hook/split.go
@@ -0,0 +1,57 @@
+package hook
+
+import (
+ "errors"
+ "strconv"
+ "tunnel/pkg/server/env"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/queue"
+)
+
+const splitDefaultSize = 1024
+
+var errBadSize = errors.New("bad size value")
+
+type splitHook struct {
+ size int
+}
+
+func (h *splitHook) Send(rq, wq queue.Q) error {
+ for b := range rq {
+ var upto int
+
+ for n := 0; n < len(b); n = upto {
+ upto += h.size
+
+ if upto > len(b) {
+ upto = len(b)
+ }
+
+ wq <- b[n:upto]
+ }
+ }
+
+ return nil
+}
+
+func (h *splitHook) Open(env.Env) (interface{}, error) {
+ return h, nil
+}
+
+func newSplitHook(opts opts.Opts, env env.Env) (hook, error) {
+ size := splitDefaultSize
+
+ if s, ok := opts["size"]; ok {
+ var err error
+
+ if size, err = strconv.Atoi(s); err != nil || size <= 0 {
+ return nil, errBadSize
+ }
+ }
+
+ return &splitHook{size: size}, nil
+}
+
+func init() {
+ register("split", newSplitHook)
+}