diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-03 13:46:02 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-03 13:46:02 +0300 |
| commit | 884514216a85979cdf5af79ea5da24d61e574fe9 (patch) | |
| tree | f3c7338b4c34480e19c7b55b1f4304aa34bfa478 /pkg/server/socket | |
| parent | 61287a0faab06105c382b5d24c4942a8b4cc960a (diff) | |
close read writeclose
Diffstat (limited to 'pkg/server/socket')
| -rw-r--r-- | pkg/server/socket/socket.go | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/pkg/server/socket/socket.go b/pkg/server/socket/socket.go index cebfe47..f78e997 100644 --- a/pkg/server/socket/socket.go +++ b/pkg/server/socket/socket.go @@ -50,6 +50,10 @@ func newConnChannel(conn net.Conn) Channel { } func (c *connChannel) final(f func() error, err error) error { + if err != nil { + return c.Close() + } + if e := f(); e != nil { if e == errAlreadyClosed { return nil @@ -61,14 +65,40 @@ func (c *connChannel) final(f func() error, err error) error { return err } +func (c *connChannel) closeRead() error { + var err error + + if cr, ok := c.conn.(interface { CloseRead() error }); ok { + log.Println(c, "close read") + cr.CloseRead() + } else { + err = c.Close() + } + + return err +} + +func (c *connChannel) closeWrite() error { + var err error + + if cr, ok := c.conn.(interface { CloseWrite() error }); ok { + log.Println(c, "close write") + cr.CloseWrite() + } else { + err = c.Close() + } + + return err +} + func (c *connChannel) Send(wq queue.Q) error { err := queue.IoCopy(c.conn, wq.Writer()) - return c.final(c.Close, err) + return c.final(c.closeRead, err) } func (c *connChannel) Recv(rq queue.Q) error { err := queue.IoCopy(rq.Reader(), c.conn) - return c.final(c.Close, err) + return c.final(c.closeWrite, err) } func (c *connChannel) String() string { |
