summaryrefslogtreecommitdiff
path: root/pkg/server
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-02-25 01:11:48 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-02-25 01:11:48 +0300
commite93460de418a6973421bac5988b11364ee80e4ea (patch)
treeaebaa4b65842e0a83d0e539d116ce1bda0318d15 /pkg/server
parent1e94e06ef2c5d0b62c604b6ee491acc24dd8302c (diff)
add split module
Diffstat (limited to 'pkg/server')
-rw-r--r--pkg/server/module/split.go57
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)
+}