diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-17 11:56:43 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-19 23:51:31 +0300 |
| commit | bd5339bff8bf5f5e877e94dfef265a22570a69c7 (patch) | |
| tree | 5902df7a9f21c00d9c414f6b0c2b79aadfd84752 /pkg/server/server.go | |
| parent | df935315c7201b7d42eb361b3ac3d36fe83e53e6 (diff) | |
first working version
Diffstat (limited to 'pkg/server/server.go')
| -rw-r--r-- | pkg/server/server.go | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/pkg/server/server.go b/pkg/server/server.go index 0e1bf24..4f012d0 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -4,6 +4,7 @@ import ( "tunnel/pkg/config" "tunnel/pkg/netstring" "strings" + "errors" "bytes" "sync" "time" @@ -18,10 +19,12 @@ type Server struct { since time.Time wg sync.WaitGroup + mu sync.Mutex once sync.Once done chan struct{} + streams streams env env nextCid uint64 @@ -47,11 +50,13 @@ type request struct { argc int args []string - failed bool - out *bytes.Buffer } +type requestError string + +var errNotImplemented = errors.New("not implemented") + func (c *client) String() string { return fmt.Sprintf("client(%d)", c.id) } @@ -73,15 +78,11 @@ func (r *request) Println(v ...interface{}) { } func (r *request) Fatal(v ...interface{}) { - panic(fmt.Sprint(v...)) + panic(requestError(fmt.Sprint(v...))) } func (r *request) Fatalf(format string, v ...interface{}) { - panic(fmt.Sprintf(format, v...)) -} - -func (r *request) Fatalln(v ...interface{}) { - panic(fmt.Sprintln(v...)) + panic(requestError(fmt.Sprintf(format, v...))) } func (r *request) expect(c ...int) { @@ -134,6 +135,7 @@ func New() (*Server, error) { listen: listen, since: time.Now(), done: make(chan struct{}), + streams: make(streams), } return s, nil @@ -294,9 +296,12 @@ func (r *request) parse(query string) { func (r *request) run(query string) { defer func () { - if e := recover(); e != nil { - r.failed = true - r.Print(e) + switch err := recover().(type) { + case requestError: + r.Print(err) + default: + panic(err) + case nil: } }() @@ -304,6 +309,9 @@ func (r *request) run(query string) { log.Printf("%s %s run [%s] '%s'", r.c, r, r.cmd.name, strings.Join(r.args, " ")) + r.c.s.mu.Lock() + defer r.c.s.mu.Unlock() + r.cmd.f(r) } |
