diff --git a/app/api_topology.go b/app/api_topology.go index 855e671fe..305567a5d 100644 --- a/app/api_topology.go +++ b/app/api_topology.go @@ -90,7 +90,9 @@ func handleWebsocket( go func(c *websocket.Conn) { for { // just discard everything the browser sends if _, _, err := c.NextReader(); err != nil { - log.Println("err:", err) + if !xfer.IsExpectedWSCloseError(err) { + log.Println("err:", err) + } close(quit) break } @@ -111,7 +113,9 @@ func handleWebsocket( previousTopo = newTopo if err := conn.SetWriteDeadline(time.Now().Add(websocketTimeout)); err != nil { - log.Println("err:", err) + if !xfer.IsExpectedWSCloseError(err) { + log.Println("err:", err) + } return } diff --git a/common/xfer/websocket.go b/common/xfer/websocket.go index 54d83883c..1d3dd07be 100644 --- a/common/xfer/websocket.go +++ b/common/xfer/websocket.go @@ -7,6 +7,17 @@ import ( "github.com/ugorji/go/codec" ) +// IsExpectedWSCloseError returns boolean indicating whether the error is a +// clean disconnection. +func IsExpectedWSCloseError(err error) bool { + return websocket.IsCloseError( + err, + websocket.CloseNormalClosure, + websocket.CloseGoingAway, + websocket.CloseNoStatusReceived, + ) +} + // WriteJSONtoWS writes the JSON encoding of v to the connection. func WriteJSONtoWS(c *websocket.Conn, v interface{}) error { w, err := c.NextWriter(websocket.TextMessage)