diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-25 01:11:48 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-25 01:11:48 +0300 |
| commit | e93460de418a6973421bac5988b11364ee80e4ea (patch) | |
| tree | aebaa4b65842e0a83d0e539d116ce1bda0318d15 /pkg | |
| parent | 1e94e06ef2c5d0b62c604b6ee491acc24dd8302c (diff) | |
add split module
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/server/module/split.go | 57 |
1 files changed, 57 insertions, 0 deletions
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) +} |
