From c8bd6bdc4811a27e73b6c0a7f6053236a08ef2c0 Mon Sep 17 00:00:00 2001 From: Oleg Matskiv Date: Tue, 21 Jun 2022 23:05:07 +0200 Subject: [PATCH] feat: replicate Ping msgs to backend connection --- websocketproxy.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/websocketproxy.go b/websocketproxy.go index 63d39ba..68b96ba 100644 --- a/websocketproxy.go +++ b/websocketproxy.go @@ -9,6 +9,7 @@ import ( "net/http" "net/url" "strings" + "time" "github.com/gorilla/websocket" ) @@ -199,6 +200,22 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { } } + connPub.SetPingHandler(func(appData string) error { + err := connBackend.WriteControl(websocket.PingMessage, []byte(appData), time.Now().Add(time.Second)) + if err != nil { + return err + } + + // default behavior from https://github.com/gorilla/websocket/blob/v1.5.0/conn.go#L1161-L1167 + err = connPub.WriteControl(websocket.PongMessage, []byte(appData), time.Now().Add(time.Second)) + if err == websocket.ErrCloseSent { + return nil + } else if e, ok := err.(net.Error); ok && e.Temporary() { + return nil + } + return err + }) + go replicateWebsocketConn(connPub, connBackend, errClient) go replicateWebsocketConn(connBackend, connPub, errBackend)