From b1962430a09d6001edf7d9b11c31947ac1a91a4b Mon Sep 17 00:00:00 2001 From: Nero <0xnero@users.noreply.github.com> Date: Mon, 10 May 2021 15:24:40 -0400 Subject: [PATCH 1/4] add go mod --- go.mod | 9 +++++++++ go.sum | 6 ++++++ 2 files changed, 15 insertions(+) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0951fd6 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/synapsecns/gowebsocket + +go 1.16 + +require ( + github.com/gorilla/websocket v1.4.2 + github.com/sacOO7/go-logger v0.0.0-20180719173527-9ac9add5a50d + github.com/sacOO7/gowebsocket v0.0.0-20210105141656-425813c1c643 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..228b10e --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/sacOO7/go-logger v0.0.0-20180719173527-9ac9add5a50d h1:5T+fbRuQbpi+WZtB2yfuu59r00F6T2HV/zGYrwX8nvE= +github.com/sacOO7/go-logger v0.0.0-20180719173527-9ac9add5a50d/go.mod h1:L5EJe2k8GwpBoGXDRLAEs58R239jpZuE7NNEtW+T7oo= +github.com/sacOO7/gowebsocket v0.0.0-20210105141656-425813c1c643 h1:G7zQWSD1qD+2hMVCnnGvwYaidUNx0cAfVxScu3J2BGA= +github.com/sacOO7/gowebsocket v0.0.0-20210105141656-425813c1c643/go.mod h1:4a2a9BlxB807BaME8FJzQRLrZwYKj0cWjon25PlIssM= From 843775b2fbd64a6d2b801dcfacf33a56f73411e4 Mon Sep 17 00:00:00 2001 From: Nero <0xnero@users.noreply.github.com> Date: Mon, 10 May 2021 15:42:45 -0400 Subject: [PATCH 2/4] gofmt --- examples/gowebsocket/main.go | 20 ++++++++++---------- gowebsocket.go | 24 ++++++++++++------------ utils.go | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/gowebsocket/main.go b/examples/gowebsocket/main.go index 444e491..06d434a 100644 --- a/examples/gowebsocket/main.go +++ b/examples/gowebsocket/main.go @@ -1,8 +1,8 @@ package main import ( - "log" "github.com/sacOO7/gowebsocket" + "log" "os" "os/signal" ) @@ -11,12 +11,12 @@ func main() { interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) - socket := gowebsocket.New("ws://echo.websocket.org/"); + socket := gowebsocket.New("ws://echo.websocket.org/") socket.ConnectionOptions = gowebsocket.ConnectionOptions{ //Proxy: gowebsocket.BuildProxy("http://example.com"), UseSSL: false, UseCompression: false, - Subprotocols: [] string{"chat", "superchat"}, + Subprotocols: []string{"chat", "superchat"}, } socket.RequestHeader.Set("Accept-Encoding", "gzip, deflate, sdch") @@ -26,24 +26,24 @@ func main() { socket.OnConnectError = func(err error, socket gowebsocket.Socket) { log.Fatal("Recieved connect error ", err) - }; + } socket.OnConnected = func(socket gowebsocket.Socket) { - log.Println("Connected to server"); - }; + log.Println("Connected to server") + } socket.OnTextMessage = func(message string, socket gowebsocket.Socket) { log.Println("Recieved message " + message) - }; + } socket.OnPingReceived = func(data string, socket gowebsocket.Socket) { log.Println("Recieved ping " + data) - }; + } socket.OnDisconnected = func(err error, socket gowebsocket.Socket) { log.Println("Disconnected from server ") return - }; + } socket.Connect() i := 0 - for (i < 10) { + for i < 10 { socket.SendText("This is my sample test message") i++ } diff --git a/gowebsocket.go b/gowebsocket.go index 57c622b..218e1a3 100644 --- a/gowebsocket.go +++ b/gowebsocket.go @@ -1,14 +1,14 @@ package gowebsocket import ( + "crypto/tls" + "errors" "github.com/gorilla/websocket" + "github.com/sacOO7/go-logger" "net/http" - "errors" - "crypto/tls" "net/url" - "sync" - "github.com/sacOO7/go-logger" "reflect" + "sync" "time" ) @@ -22,7 +22,7 @@ func (socket Socket) EnableLogging() { } func (socket Socket) GetLogger() logging.Logger { - return logger; + return logger } type Socket struct { @@ -33,7 +33,7 @@ type Socket struct { RequestHeader http.Header OnConnected func(socket Socket) OnTextMessage func(message string, socket Socket) - OnBinaryMessage func(data [] byte, socket Socket) + OnBinaryMessage func(data []byte, socket Socket) OnConnectError func(err error, socket Socket) OnDisconnected func(err error, socket Socket) OnPingReceived func(data string, socket Socket) @@ -48,7 +48,7 @@ type ConnectionOptions struct { UseCompression bool UseSSL bool Proxy func(*http.Request) (*url.URL, error) - Subprotocols [] string + Subprotocols []string } // todo Yet to be done @@ -57,7 +57,7 @@ type ReconnectionOptions struct { func New(url string) Socket { return Socket{ - Url: url, + Url: url, RequestHeader: http.Header{}, ConnectionOptions: ConnectionOptions{ UseCompression: false, @@ -78,7 +78,7 @@ func (socket *Socket) setConnectionOptions() { } func (socket *Socket) Connect() { - var err error; + var err error var resp *http.Response socket.setConnectionOptions() @@ -163,14 +163,14 @@ func (socket *Socket) Connect() { } func (socket *Socket) SendText(message string) { - err := socket.send(websocket.TextMessage, [] byte (message)) + err := socket.send(websocket.TextMessage, []byte(message)) if err != nil { logger.Error.Println("write:", err) return } } -func (socket *Socket) SendBinary(data [] byte) { +func (socket *Socket) SendBinary(data []byte) { err := socket.send(websocket.BinaryMessage, data) if err != nil { logger.Error.Println("write:", err) @@ -178,7 +178,7 @@ func (socket *Socket) SendBinary(data [] byte) { } } -func (socket *Socket) send(messageType int, data [] byte) error { +func (socket *Socket) send(messageType int, data []byte) error { socket.sendMu.Lock() err := socket.Conn.WriteMessage(messageType, data) socket.sendMu.Unlock() diff --git a/utils.go b/utils.go index d8702eb..5fd4cf9 100644 --- a/utils.go +++ b/utils.go @@ -1,9 +1,9 @@ package gowebsocket import ( + "log" "net/http" "net/url" - "log" ) func BuildProxy(Url string) func(*http.Request) (*url.URL, error) { From b41b93fda6a865058f1afe7ff0e9a76220503e8f Mon Sep 17 00:00:00 2001 From: Nero <0xnero@users.noreply.github.com> Date: Mon, 10 May 2021 15:54:01 -0400 Subject: [PATCH 3/4] add lint action --- .github/workflows/lint.yaml | 15 +++++++++++++ .golangci.yml | 26 +++++++++++++++++++++++ examples/gowebsocket/main.go | 11 +++++----- gowebsocket.go | 41 ++++++++++++++++++++++++------------ utils.go | 5 +++-- 5 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/lint.yaml create mode 100644 .golangci.yml diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..64f4029 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,15 @@ +name: golangci-lint +on: + push: + pull_request: +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: golangci-lint + uses: golangci/golangci-lint-action@v2 + with: + # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version + version: v1.29 \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..dd9582d --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,26 @@ +run: + concurrency: 10 + tests: true + skip-dirs-use-default: false + timeout: 5m + +linters-settings: + golint: + min-confidence: 0.8 + gofmt: + simplify: true + +linters: + enable: + - gofmt + - gosimple + - govet + - unconvert + - misspell + - goimports + - golint + disable-all: false + fast: false + +issues: + exclude-use-default: false \ No newline at end of file diff --git a/examples/gowebsocket/main.go b/examples/gowebsocket/main.go index 06d434a..a208e02 100644 --- a/examples/gowebsocket/main.go +++ b/examples/gowebsocket/main.go @@ -1,10 +1,11 @@ package main import ( - "github.com/sacOO7/gowebsocket" "log" "os" "os/signal" + + "github.com/sacOO7/gowebsocket" ) func main() { @@ -25,20 +26,19 @@ func main() { socket.RequestHeader.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36") socket.OnConnectError = func(err error, socket gowebsocket.Socket) { - log.Fatal("Recieved connect error ", err) + log.Fatal("Received connect error ", err) } socket.OnConnected = func(socket gowebsocket.Socket) { log.Println("Connected to server") } socket.OnTextMessage = func(message string, socket gowebsocket.Socket) { - log.Println("Recieved message " + message) + log.Println("Received message " + message) } socket.OnPingReceived = func(data string, socket gowebsocket.Socket) { - log.Println("Recieved ping " + data) + log.Println("Received ping " + data) } socket.OnDisconnected = func(err error, socket gowebsocket.Socket) { log.Println("Disconnected from server ") - return } socket.Connect() @@ -48,6 +48,7 @@ func main() { i++ } + // nolint: gosimple for { select { case <-interrupt: diff --git a/gowebsocket.go b/gowebsocket.go index 218e1a3..6cbaf6f 100644 --- a/gowebsocket.go +++ b/gowebsocket.go @@ -3,32 +3,37 @@ package gowebsocket import ( "crypto/tls" "errors" - "github.com/gorilla/websocket" - "github.com/sacOO7/go-logger" + "fmt" "net/http" "net/url" "reflect" "sync" "time" + + "github.com/gorilla/websocket" + logging "github.com/sacOO7/go-logger" ) -type Empty struct { +type empty struct { } -var logger = logging.GetLogger(reflect.TypeOf(Empty{}).PkgPath()).SetLevel(logging.OFF) +var logger = logging.GetLogger(reflect.TypeOf(empty{}).PkgPath()).SetLevel(logging.OFF) +// EnableLogging enables the logger func (socket Socket) EnableLogging() { logger.SetLevel(logging.TRACE) } +// GetLogger gets the logger object func (socket Socket) GetLogger() logging.Logger { return logger } +// Socket provides a websocket request type Socket struct { Conn *websocket.Conn WebsocketDialer *websocket.Dialer - Url string + URL string ConnectionOptions ConnectionOptions RequestHeader http.Header OnConnected func(socket Socket) @@ -44,6 +49,7 @@ type Socket struct { receiveMu *sync.Mutex } +// ConnectionOptions contains connection options type ConnectionOptions struct { UseCompression bool UseSSL bool @@ -51,13 +57,15 @@ type ConnectionOptions struct { Subprotocols []string } -// todo Yet to be done +// ReconnectionOptions provides options for reconnecting to the websocket +// TODO Yet to be done type ReconnectionOptions struct { } +// New creates a new websocket for the given url func New(url string) Socket { return Socket{ - Url: url, + URL: url, RequestHeader: http.Header{}, ConnectionOptions: ConnectionOptions{ UseCompression: false, @@ -77,16 +85,17 @@ func (socket *Socket) setConnectionOptions() { socket.WebsocketDialer.Subprotocols = socket.ConnectionOptions.Subprotocols } +// Connect connects to the websocket server func (socket *Socket) Connect() { var err error var resp *http.Response socket.setConnectionOptions() - socket.Conn, resp, err = socket.WebsocketDialer.Dial(socket.Url, socket.RequestHeader) + socket.Conn, resp, err = socket.WebsocketDialer.Dial(socket.URL, socket.RequestHeader) if err != nil { logger.Error.Println("Error while connecting to server ", err) - logger.Error.Println("HTTP Response %d status: %s", resp.StatusCode, resp.Status) + logger.Error.Println(fmt.Sprintf("HTTP Response %d status: %s", resp.StatusCode, resp.Status)) socket.IsConnected = false if socket.OnConnectError != nil { socket.OnConnectError(err, *socket) @@ -134,19 +143,22 @@ func (socket *Socket) Connect() { for { socket.receiveMu.Lock() if socket.Timeout != 0 { - socket.Conn.SetReadDeadline(time.Now().Add(socket.Timeout)) + err := socket.Conn.SetReadDeadline(time.Now().Add(socket.Timeout)) + if err != nil { + logger.Error.Println(err) + } } messageType, message, err := socket.Conn.ReadMessage() socket.receiveMu.Unlock() if err != nil { - logger.Error.Println("read:", err) + logger.Error.Println(fmt.Sprintf("read: %s", err)) if socket.OnDisconnected != nil { socket.IsConnected = false socket.OnDisconnected(err, *socket) } return } - logger.Info.Println("recv: %s", message) + logger.Info.Println(fmt.Sprintf("recv: %s", message)) switch messageType { case websocket.TextMessage: @@ -162,6 +174,7 @@ func (socket *Socket) Connect() { }() } +// SendText sends a test message to the server func (socket *Socket) SendText(message string) { err := socket.send(websocket.TextMessage, []byte(message)) if err != nil { @@ -170,6 +183,7 @@ func (socket *Socket) SendText(message string) { } } +// SendBinary sends a binary message to the websocket func (socket *Socket) SendBinary(data []byte) { err := socket.send(websocket.BinaryMessage, data) if err != nil { @@ -185,12 +199,13 @@ func (socket *Socket) send(messageType int, data []byte) error { return err } +// Close closese the websocket func (socket *Socket) Close() { err := socket.send(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) if err != nil { logger.Error.Println("write close:", err) } - socket.Conn.Close() + _ = socket.Conn.Close() if socket.OnDisconnected != nil { socket.IsConnected = false socket.OnDisconnected(err, *socket) diff --git a/utils.go b/utils.go index 5fd4cf9..907ab21 100644 --- a/utils.go +++ b/utils.go @@ -6,8 +6,9 @@ import ( "net/url" ) -func BuildProxy(Url string) func(*http.Request) (*url.URL, error) { - uProxy, err := url.Parse(Url) +// BuildProxy creates an http proxy +func BuildProxy(rawURL string) func(*http.Request) (*url.URL, error) { + uProxy, err := url.Parse(rawURL) if err != nil { log.Fatal("Error while parsing url ", err) } From b3711ab27011211b5bb58a562f9ca6e5433a6c78 Mon Sep 17 00:00:00 2001 From: Nero <0xnero@users.noreply.github.com> Date: Mon, 10 May 2021 16:39:00 -0400 Subject: [PATCH 4/4] fix module path --- go.mod | 3 +-- go.sum | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 0951fd6..9ceeb25 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,8 @@ -module github.com/synapsecns/gowebsocket +module github.com/sacOO7/gowebsocket go 1.16 require ( github.com/gorilla/websocket v1.4.2 github.com/sacOO7/go-logger v0.0.0-20180719173527-9ac9add5a50d - github.com/sacOO7/gowebsocket v0.0.0-20210105141656-425813c1c643 ) diff --git a/go.sum b/go.sum index 228b10e..56fb422 100644 --- a/go.sum +++ b/go.sum @@ -2,5 +2,3 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/sacOO7/go-logger v0.0.0-20180719173527-9ac9add5a50d h1:5T+fbRuQbpi+WZtB2yfuu59r00F6T2HV/zGYrwX8nvE= github.com/sacOO7/go-logger v0.0.0-20180719173527-9ac9add5a50d/go.mod h1:L5EJe2k8GwpBoGXDRLAEs58R239jpZuE7NNEtW+T7oo= -github.com/sacOO7/gowebsocket v0.0.0-20210105141656-425813c1c643 h1:G7zQWSD1qD+2hMVCnnGvwYaidUNx0cAfVxScu3J2BGA= -github.com/sacOO7/gowebsocket v0.0.0-20210105141656-425813c1c643/go.mod h1:4a2a9BlxB807BaME8FJzQRLrZwYKj0cWjon25PlIssM=