]> 127.0.0.1 Git - part/.git/commitdiff
1 v0.28.20240717164111
authorqydysky <qydysky@foxmail.com>
Wed, 17 Jul 2024 16:36:25 +0000 (00:36 +0800)
committerqydysky <qydysky@foxmail.com>
Wed, 17 Jul 2024 16:36:25 +0000 (00:36 +0800)
websocket/Client.go
websocket/Client_test.go

index c2e9788bee26406819007d8b2711b653c5a04341..360d858007201964066f02003821adf6af0fd638 100644 (file)
@@ -140,7 +140,6 @@ func (o *Client) Handle() (*msgq.MsgType[*WsMsg], error) {
        go func() {
                defer func() {
                        o.msg.PushLock_tag(`exit`, nil)
-                       o.msg.ClearAll()
                        o.l.Lock()
                        o.close = true
                        o.l.Unlock()
@@ -149,7 +148,6 @@ func (o *Client) Handle() (*msgq.MsgType[*WsMsg], error) {
                for {
                        if err := c.SetReadDeadline(time.Now().Add(time.Duration(o.RTOMs * int(time.Millisecond)))); err != nil {
                                o.error(err)
-                               o.msg.ClearAll()
                                return
                        }
                        msg_type, message, err := c.ReadMessage()
@@ -160,8 +158,11 @@ func (o *Client) Handle() (*msgq.MsgType[*WsMsg], error) {
                                                o.Func_normal_close()
                                        case websocket.CloseAbnormalClosure:
                                                o.Func_abort_close()
+                                               o.error(err)
                                        default:
+                                               o.error(err)
                                        }
+                               } else {
                                        o.error(err)
                                }
                                return
@@ -198,12 +199,10 @@ func (o *Client) Handle() (*msgq.MsgType[*WsMsg], error) {
                }
                if err := c.SetWriteDeadline(time.Now().Add(time.Duration(o.WTOMs * int(time.Millisecond)))); err != nil {
                        o.error(err)
-                       o.msg.ClearAll()
                        return true
                }
                if err := c.WriteMessage(wm.Type, wm.Msg); err != nil {
                        o.error(err)
-                       o.msg.ClearAll()
                        return true
                }
                if wm.Type == websocket.PingMessage {
@@ -219,9 +218,11 @@ func (o *Client) Handle() (*msgq.MsgType[*WsMsg], error) {
 
        // close
        o.msg.Pull_tag_only(`close`, func(_ *WsMsg) (disable bool) {
+               if err := c.SetWriteDeadline(time.Now().Add(time.Duration(o.WTOMs * int(time.Millisecond)))); err != nil {
+                       o.error(err)
+               }
                if err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, o.Msg_normal_close)); err != nil {
                        o.error(err)
-                       o.msg.ClearAll()
                }
                return true
        })
@@ -244,20 +245,18 @@ func (o *Client) Close() {
 
 func (o *Client) Isclose() (isclose bool) {
        o.l.RLock()
-       isclose = o.close
-       o.l.RUnlock()
-       return
+       defer o.l.RUnlock()
+       return o.close
 }
 
 func (o *Client) Error() (e error) {
        o.l.RLock()
-       e = o.err
-       o.l.RUnlock()
-       return
+       defer o.l.RUnlock()
+       return o.err
 }
 
 func (o *Client) error(e error) {
        o.l.Lock()
+       defer o.l.Unlock()
        o.err = errors.Join(o.err, e)
-       o.l.Unlock()
 }
index 14704c4ab82663afbe605c24c0e295ae2b4db16c..ba891192605a86d9087a04985f2229911d0d3045 100644 (file)
@@ -3,6 +3,7 @@ package part
 import (
        "context"
        "net/http"
+       "strings"
        "testing"
        "time"
 
@@ -48,44 +49,99 @@ func Test_Client(t *testing.T) {
 
        time.Sleep(time.Second)
 
-       c, e := New_client(&Client{
-               Url: "ws://127.0.0.1:10888/ws",
-               Func_normal_close: func() {
-                       t.Log("close")
-               },
-               TO: 5000,
-       })
-       if e != nil {
-               t.Fatal(e)
-       }
+       {
+               c, e := New_client(&Client{
+                       Url: "ws://127.0.0.1:10888/ws",
+                       Func_normal_close: func() {
+                               t.Log("close")
+                       },
+                       TO:    1000,
+                       WTOMs: 1000,
+               })
+               if e != nil {
+                       t.Fatal(e)
+               }
 
-       ws, e := c.Handle()
-       if e != nil {
-               t.Fatal(e)
-       }
+               ws, e := c.Handle()
+               if e != nil {
+                       t.Fatal(e)
+               }
 
-       ws.Pull_tag_only(`rec`, func(wm *WsMsg) (disable bool) {
-               if string(wm.Msg) != "test" {
+               ws.Pull_tag_only(`rec`, func(wm *WsMsg) (disable bool) {
+                       if string(wm.Msg) != "test" {
+                               t.Fatal()
+                       }
+                       return false
+               })
+               ws.PushLock_tag(`send`, &WsMsg{
+                       Msg: []byte("test"),
+               })
+
+               go func() {
+                       time.Sleep(time.Second * 2)
+                       t.Log("call close")
+                       c.Close()
+                       t.Log("call close done")
+               }()
+
+               {
+                       cancel, c := ws.Pull_tag_chan(`exit`, 1, context.Background())
+                       <-c
+                       cancel()
+                       t.Log("exit")
+               }
+
+               if !strings.Contains(c.Error().Error(), `i/o`) {
                        t.Fatal()
                }
-               return false
-       })
-       ws.PushLock_tag(`send`, &WsMsg{
-               Msg: []byte("test"),
-       })
 
-       go func() {
                time.Sleep(time.Second)
-               t.Log("call close")
-               c.Close()
-               t.Log("call close done")
-       }()
-
+       }
        {
-               cancel, c := ws.Pull_tag_chan(`exit`, 1, context.Background())
-               <-c
-               cancel()
-               t.Log("exit")
+               c, e := New_client(&Client{
+                       Url: "ws://127.0.0.1:10888/ws",
+                       Func_normal_close: func() {
+                               t.Log("close")
+                       },
+                       TO: 2000,
+               })
+               if e != nil {
+                       t.Fatal(e)
+               }
+
+               ws, e := c.Handle()
+               if e != nil {
+                       t.Fatal(e)
+               }
+
+               ws.Pull_tag_only(`rec`, func(wm *WsMsg) (disable bool) {
+                       if string(wm.Msg) != "test" {
+                               t.Fatal()
+                       }
+                       return false
+               })
+               ws.PushLock_tag(`send`, &WsMsg{
+                       Msg: []byte("test"),
+               })
+
+               go func() {
+                       time.Sleep(time.Second)
+                       t.Log("call close")
+                       c.Close()
+                       t.Log("call close done")
+               }()
+
+               {
+                       cancel, c := ws.Pull_tag_chan(`exit`, 1, context.Background())
+                       <-c
+                       cancel()
+                       t.Log("exit")
+               }
+
+               if c.Error() != nil {
+                       t.Fatal(c.Error())
+               }
+
+               time.Sleep(time.Second)
        }
-       time.Sleep(time.Second)
 }