From 2c44953b9b5fcd4da83ec8816f002ce68a12ef2d Mon Sep 17 00:00:00 2001 From: Gennadii Kovalev Date: Wed, 10 May 2017 18:27:25 +0200 Subject: [PATCH] close channel on server side --- client.go | 2 +- loop.go | 12 ++++++------ server.go | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/client.go b/client.go index 3d76233..deded6c 100644 --- a/client.go +++ b/client.go @@ -62,5 +62,5 @@ func Dial(url string, tr transport.Transport) (*Client, error) { Close client connection */ func (c *Client) Close() { - CloseChannel(&c.Channel, &c.methods) + closeChannel(&c.Channel, &c.methods) } diff --git a/loop.go b/loop.go index c2b63c1..5e73c5b 100644 --- a/loop.go +++ b/loop.go @@ -83,7 +83,7 @@ func (c *Channel) IsAlive() bool { /** Close channel */ -func CloseChannel(c *Channel, m *methods, args ...interface{}) error { +func closeChannel(c *Channel, m *methods, args ...interface{}) error { c.aliveLock.Lock() defer c.aliveLock.Unlock() @@ -115,18 +115,18 @@ func inLoop(c *Channel, m *methods) error { for { pkg, err := c.conn.GetMessage() if err != nil { - return CloseChannel(c, m, err) + return closeChannel(c, m, err) } msg, err := protocol.Decode(pkg) if err != nil { - CloseChannel(c, m, protocol.ErrorWrongPacket) + closeChannel(c, m, protocol.ErrorWrongPacket) return err } switch msg.Type { case protocol.MessageTypeOpen: if err := json.Unmarshal([]byte(msg.Source[1:]), &c.header); err != nil { - CloseChannel(c, m, ErrorWrongHeader) + closeChannel(c, m, ErrorWrongHeader) } m.callLoopEvent(c, OnConnection) case protocol.MessageTypePing: @@ -156,7 +156,7 @@ func outLoop(c *Channel, m *methods) error { for { outBufferLen := len(c.out) if outBufferLen >= queueBufferSize-1 { - return CloseChannel(c, m, ErrorSocketOverflood) + return closeChannel(c, m, ErrorSocketOverflood) } else if outBufferLen > int(queueBufferSize/2) { overfloodedLock.Lock() overflooded[c] = struct{}{} @@ -174,7 +174,7 @@ func outLoop(c *Channel, m *methods) error { err := c.conn.WriteMessage(msg) if err != nil { - return CloseChannel(c, m, err) + return closeChannel(c, m, err) } } return nil diff --git a/server.go b/server.go index 066095b..7583633 100644 --- a/server.go +++ b/server.go @@ -41,6 +41,15 @@ type Server struct { tr transport.Transport } +/** +Close current channel + */ +func (c *Channel) Close() { + if c.server != nil { + closeChannel(c, &c.server.methods) + } +} + /** Get ip of socket client */