diff options
Diffstat (limited to 'pkg')
| -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 { |
