From b75eaf3c161b56cd4bfc99a5e68c2ce3695e87b2 Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Thu, 7 Jul 2022 17:25:03 +0300 Subject: [PATCH 1/7] fix keepalive simple patch for keepalive on the same host --- recws.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/recws.go b/recws.go index 4faa7af..83482bb 100644 --- a/recws.go +++ b/recws.go @@ -409,7 +409,8 @@ func (rc *RecConn) keepAlive() { } <-ticker.C - if time.Since(keepAliveResponse.getLastResponse()) > rc.getKeepAliveTimeout() { + timeoutOffset := time.Millisecond * 10 + if time.Since(keepAliveResponse.getLastResponse()) > rc.getKeepAliveTimeout()+timeoutOffset { rc.CloseAndReconnect() return } From 6c6a4a0ded0ecc37010d4a40518694db2806f189 Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Thu, 7 Jul 2022 17:29:43 +0300 Subject: [PATCH 2/7] Update recws.go --- recws.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recws.go b/recws.go index 83482bb..4b6aebe 100644 --- a/recws.go +++ b/recws.go @@ -409,7 +409,7 @@ func (rc *RecConn) keepAlive() { } <-ticker.C - timeoutOffset := time.Millisecond * 10 + timeoutOffset := time.Millisecond * 50 if time.Since(keepAliveResponse.getLastResponse()) > rc.getKeepAliveTimeout()+timeoutOffset { rc.CloseAndReconnect() return From a25330e8f2fef51d267cb4b791b3bdd79ae9d9b8 Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Thu, 7 Jul 2022 18:26:50 +0300 Subject: [PATCH 3/7] Update recws.go --- recws.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recws.go b/recws.go index 4b6aebe..36ee7d7 100644 --- a/recws.go +++ b/recws.go @@ -409,7 +409,7 @@ func (rc *RecConn) keepAlive() { } <-ticker.C - timeoutOffset := time.Millisecond * 50 + timeoutOffset := time.Millisecond * 500 if time.Since(keepAliveResponse.getLastResponse()) > rc.getKeepAliveTimeout()+timeoutOffset { rc.CloseAndReconnect() return From dd31a10749f04ffe17f39d8bc4e1d739327218f1 Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Fri, 12 Aug 2022 01:57:40 +0300 Subject: [PATCH 4/7] make Close more atomic --- recws.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/recws.go b/recws.go index 36ee7d7..5bd82b1 100644 --- a/recws.go +++ b/recws.go @@ -82,13 +82,12 @@ func (rc *RecConn) getConn() *websocket.Conn { // Close closes the underlying network connection without // sending or waiting for a close frame. func (rc *RecConn) Close() { - if rc.getConn() != nil { - rc.mu.Lock() + rc.mu.Lock() + if rc.Conn != nil { rc.Conn.Close() - rc.mu.Unlock() } - - rc.setIsConnected(false) + rc.isConnected = false + rc.mu.Unlock() } // Shutdown gracefully closes the connection by sending the websocket.CloseMessage. From 956afe9d1412a06d5353a3fd8e2277e3f2da1bfb Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Sun, 4 Sep 2022 01:59:24 +0300 Subject: [PATCH 5/7] improve logging --- recws.go | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/recws.go b/recws.go index 4faa7af..d682e0c 100644 --- a/recws.go +++ b/recws.go @@ -5,6 +5,7 @@ package recws import ( "crypto/tls" "errors" + "fmt" "log" "math/rand" "net/http" @@ -44,6 +45,8 @@ type RecConn struct { // KeepAliveTimeout is an interval for sending ping/pong messages // disabled if 0 KeepAliveTimeout time.Duration + // LogHandler handles all log messages + LogHandler func(v LogValues) // NonVerbose suppress connecting/reconnecting messages. NonVerbose bool @@ -58,6 +61,18 @@ type RecConn struct { *websocket.Conn } +// LogValues type includes values for send to logger +type LogValues struct { + // Msg is main message + Msg string + // Err is error for separate and display it + Err error + // Url is connection url + Url string + // Fatal is tag of fatal error + Fatal bool +} + // CloseAndReconnect will try to reconnect. func (rc *RecConn) CloseAndReconnect() { rc.Close() @@ -98,7 +113,7 @@ func (rc *RecConn) Shutdown(writeWait time.Duration) { err := rc.WriteControl(websocket.CloseMessage, msg, time.Now().Add(writeWait)) if err != nil && err != websocket.ErrCloseSent { // If close message could not be sent, then close without the handshake. - log.Printf("Shutdown: %v", err) + rc.log(LogValues{Err: err, Msg: "Shutdown"}) rc.Close() } } @@ -315,7 +330,7 @@ func (rc *RecConn) Dial(urlStr string, reqHeader http.Header) { urlStr, err := rc.parseURL(urlStr) if err != nil { - log.Fatalf("Dial: %v", err) + rc.log(LogValues{Msg: "Dial", Err: err, Fatal: true}) } // Config @@ -343,6 +358,16 @@ func (rc *RecConn) GetURL() string { return rc.url } +func (rc *RecConn) log(v LogValues) { + if rc.LogHandler != nil { + rc.LogHandler(v) + } else if v.Err != nil { + log.Printf("ERROR: %+v: %+v (%+v)\n", v.Msg, v.Err, v.Url) + } else { + log.Printf("%+v (%+v)\n", v.Msg, v.Url) + } +} + func (rc *RecConn) getNonVerbose() bool { rc.mu.RLock() defer rc.mu.RUnlock() @@ -405,11 +430,12 @@ func (rc *RecConn) keepAlive() { } if err := rc.writeControlPingMessage(); err != nil { - log.Println(err) + rc.log(LogValues{Err: err}) } <-ticker.C if time.Since(keepAliveResponse.getLastResponse()) > rc.getKeepAliveTimeout() { + rc.log(LogValues{Err: errors.New("keepalive timeout"), Msg: "Reconnect", Url: rc.url}) rc.CloseAndReconnect() return } @@ -434,15 +460,15 @@ func (rc *RecConn) connect() { if err == nil { if !rc.getNonVerbose() { - log.Printf("Dial: connection was successfully established with %s\n", rc.url) + rc.log(LogValues{Msg: "Dial: connection was successfully established", Url: rc.url}) } if rc.hasSubscribeHandler() { if err := rc.SubscribeHandler(); err != nil { - log.Fatalf("Dial: connect handler failed with %s", err.Error()) + rc.log(LogValues{Msg: "Dial: connect handler failed", Err: err, Fatal: true}) } if !rc.getNonVerbose() { - log.Printf("Dial: connect handler was successfully established with %s\n", rc.url) + rc.log(LogValues{Msg: "Dial: connect handler was successfully established with %s", Url: rc.url}) } } @@ -454,8 +480,7 @@ func (rc *RecConn) connect() { } if !rc.getNonVerbose() { - log.Println(err) - log.Println("Dial: will try again in", nextItvl, "seconds.") + rc.log(LogValues{Err: err, Msg: fmt.Sprintf("Dial: will try again in %+v seconds", nextItvl)}) } time.Sleep(nextItvl) From aff7096e603b6c0a2306e2ebe200a9d68a9a701b Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Sun, 4 Sep 2022 02:06:46 +0300 Subject: [PATCH 6/7] change repo --- README.md | 8 +++++--- examples/basic.go | 3 ++- go.mod | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 36d7c2a..c5a5b3e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ # recws +***This is fork of [recws-org/recws](https://github.com/recws-org/recws) with some fixes*** + Reconnecting WebSocket is a websocket client based on [gorilla/websocket](https://github.com/gorilla/websocket) that will automatically reconnect if the connection is dropped - thread safe! [![Build Status](https://travis-ci.com/recws-org/recws.svg?branch=master)](https://travis-ci.com/recws-org/recws) @@ -12,7 +14,7 @@ Reconnecting WebSocket is a websocket client based on [gorilla/websocket](https: ## Installation ```bash -go get github.com/recws-org/recws +go get github.com/nikepan/recws ``` ## Sponsors @@ -21,8 +23,8 @@ go get github.com/recws-org/recws ## Logo -- Logo by [Anastasia Marx](https://www.behance.net/AnastasiaMarx) -- Gopher by [Gophers](https://github.com/egonelbre/gophers) +- Logo by [Anastasia Marx](https://www.behance.net/AnastasiaMarx) +- Gopher by [Gophers](https://github.com/egonelbre/gophers) ## License diff --git a/examples/basic.go b/examples/basic.go index a234ad0..4a8df37 100644 --- a/examples/basic.go +++ b/examples/basic.go @@ -2,9 +2,10 @@ package main import ( "context" - "github.com/recws-org/recws" "log" "time" + + "github.com/nikepan/recws" ) func main() { diff --git a/go.mod b/go.mod index 5f8b11d..047a5bd 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ -module github.com/recws-org/recws +module github.com/nikepan/recws -go 1.17 +go 1.18 require ( github.com/gorilla/websocket v1.4.2 From 0a7d38556a170b5c9567ff5a355fe630374f2d1d Mon Sep 17 00:00:00 2001 From: Nikolay Pavlovich Date: Sun, 4 Sep 2022 02:23:56 +0300 Subject: [PATCH 7/7] logging fix --- recws.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recws.go b/recws.go index 72af942..29ca31f 100644 --- a/recws.go +++ b/recws.go @@ -468,7 +468,7 @@ func (rc *RecConn) connect() { rc.log(LogValues{Msg: "Dial: connect handler failed", Err: err, Fatal: true}) } if !rc.getNonVerbose() { - rc.log(LogValues{Msg: "Dial: connect handler was successfully established with %s", Url: rc.url}) + rc.log(LogValues{Msg: "Dial: connect handler was successfully established", Url: rc.url}) } }