diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-27 19:38:31 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-28 03:53:22 +0300 |
| commit | e9bf22ae73b50bf7e72664bd7e71daedacbac9b6 (patch) | |
| tree | f254d6de4e4b13ea6a77c19ab647fbc207dda43e | |
| parent | 27e13f14f4dba71b417ea530bfe035adbd8f0a93 (diff) | |
add zip module
| -rw-r--r-- | pkg/server/module/hex.go | 15 | ||||
| -rw-r--r-- | pkg/server/module/zip.go | 55 | ||||
| -rw-r--r-- | pkg/server/queue/queue.go | 8 | ||||
| -rw-r--r-- | pkg/server/server.go | 4 |
4 files changed, 75 insertions, 7 deletions
diff --git a/pkg/server/module/hex.go b/pkg/server/module/hex.go index c3ad0db..e71688c 100644 --- a/pkg/server/module/hex.go +++ b/pkg/server/module/hex.go @@ -9,7 +9,7 @@ import ( type hexModule struct{} -func (h hexModule) Send(rq, wq queue.Q) error { +func (m hexModule) Send(rq, wq queue.Q) error { enc := hex.NewEncoder(wq.Writer()) for b := range rq { @@ -19,18 +19,19 @@ func (h hexModule) Send(rq, wq queue.Q) error { return nil } -func (h hexModule) Recv(rq, wq queue.Q) error { +func (m hexModule) Recv(rq, wq queue.Q) error { r := hex.NewDecoder(rq.Reader()) - w := wq.Writer() - return queue.IoCopy(r, w) + return queue.IoCopy(r, wq.Writer()) } func (m hexModule) Open(env env.Env) (interface{}, error) { return m, nil } +func newHexModule(opts.Opts, env.Env) (module, error) { + return hexModule{}, nil +} + func init() { - register("hex", func(opts.Opts, env.Env) (module, error) { - return hexModule{}, nil - }) + register("hex", newHexModule) } diff --git a/pkg/server/module/zip.go b/pkg/server/module/zip.go new file mode 100644 index 0000000..b0abb38 --- /dev/null +++ b/pkg/server/module/zip.go @@ -0,0 +1,55 @@ +package module + +import ( + "compress/flate" + "io" + "tunnel/pkg/server/env" + "tunnel/pkg/server/opts" + "tunnel/pkg/server/queue" +) + +type zipModule struct{} + +func (m zipModule) Send(rq, wq queue.Q) error { + w, err := flate.NewWriter(wq.Writer(), flate.BestCompression) + if err != nil { + return err + } + + for b := range rq { + if _, err := w.Write(b); err != nil { + return err + } + if err := w.Flush(); err != nil { + return err + } + } + + return w.Close() +} + +func (m zipModule) Recv(rq, wq queue.Q) error { + r := flate.NewReader(rq.Reader()) + + // FIXME: not received ending due to ultimate conn.Close + if err := queue.IoCopy(r, wq.Writer()); err != nil { + if err == io.ErrUnexpectedEOF { + return nil + } + return err + } + + return r.Close() +} + +func (m zipModule) Open(env.Env) (interface{}, error) { + return m, nil +} + +func newZipModule(opts.Opts, env.Env) (module, error) { + return zipModule{}, nil +} + +func init() { + register("zip", newZipModule) +} diff --git a/pkg/server/queue/queue.go b/pkg/server/queue/queue.go index 4b69e3a..71f914c 100644 --- a/pkg/server/queue/queue.go +++ b/pkg/server/queue/queue.go @@ -37,6 +37,14 @@ func (r *reader) Read(p []byte) (int, error) { return n, nil } +func (r *reader) ReadByte() (byte, error) { + var b [1]byte + + _, err := r.Read(b[:]) + + return b[0], err +} + func (r *reader) WriteTo(w io.Writer) (int64, error) { if writer, ok := w.(*writer); ok { if len(r.b) > 0 { diff --git a/pkg/server/server.go b/pkg/server/server.go index badf5c0..6f3c312 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -68,6 +68,10 @@ func (r *request) String() string { return fmt.Sprintf("request:%d", r.id) } +func (r *request) Write(p []byte) (int, error) { + return r.out.Write(p) +} + func (r *request) Print(v ...interface{}) { fmt.Fprint(&r.out, v...) } |
