From e93460de418a6973421bac5988b11364ee80e4ea Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Tue, 25 Feb 2020 01:11:48 +0300 Subject: add split module --- pkg/server/module/split.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pkg/server/module/split.go (limited to 'pkg/server') diff --git a/pkg/server/module/split.go b/pkg/server/module/split.go new file mode 100644 index 0000000..138814f --- /dev/null +++ b/pkg/server/module/split.go @@ -0,0 +1,57 @@ +package module + +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 splitModule struct { + size int +} + +func (m *splitModule) Send(rq, wq queue.Q) error { + for b := range rq { + var upto int + + for n := 0; n < len(b); n = upto { + upto += m.size + + if upto > len(b) { + upto = len(b) + } + + wq <- b[n:upto] + } + } + + return nil +} + +func (m *splitModule) Open(env.Env) (Pipe, Pipe) { + return m.Send, nil +} + +func newSplitModule(opts opts.Opts, env env.Env) (module, 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 &splitModule{size: size}, nil +} + +func init() { + register("split", newSplitModule) +} -- cgit v1.2.3-70-g09d2