From c55afd2de177f128fae6e1c52d0c56af17096258 Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Sat, 29 Feb 2020 00:58:01 +0300 Subject: rename module to hook --- pkg/server/hook/split.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pkg/server/hook/split.go (limited to 'pkg/server/hook/split.go') 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) +} -- cgit v1.2.3-70-g09d2