summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-03-03 13:46:02 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-03-03 13:46:02 +0300
commit884514216a85979cdf5af79ea5da24d61e574fe9 (patch)
treef3c7338b4c34480e19c7b55b1f4304aa34bfa478
parent61287a0faab06105c382b5d24c4942a8b4cc960a (diff)
close read writeclose
-rw-r--r--pkg/server/socket/socket.go34
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 {