summaryrefslogtreecommitdiff
path: root/pkg/server/hook/split.go
diff options
context:
space:
mode:
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)
+}