summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/api/client/streaming/stream.go29
1 files changed, 16 insertions, 13 deletions
diff --git a/internal/api/client/streaming/stream.go b/internal/api/client/streaming/stream.go
index eba040cba..6c57cea03 100644
--- a/internal/api/client/streaming/stream.go
+++ b/internal/api/client/streaming/stream.go
@@ -399,7 +399,7 @@ func (m *Module) writeToWSConn(
// - receipt of msg
// - timeout of pingCtx
// - stream closed.
- msg, gotMsg := stream.Recv(pingCtx)
+ msg, haveMsg := stream.Recv(pingCtx)
// If ping context has timed
// out, we should send a ping.
@@ -410,35 +410,38 @@ func (m *Module) writeToWSConn(
cncl()
switch {
+ case !haveMsg && !shouldPing:
+ // We have no message and we shouldn't
+ // send a ping; this means the stream
+ // has been closed from the client's end,
+ // so there's nothing further to do here.
+ l.Trace("no message and we shouldn't ping, returning...")
+ return
- // We have a message to stream.
- case gotMsg:
+ case haveMsg:
+ // We have a message to stream.
l.Tracef("writing websocket message: %+v", msg)
+
if err := wsConn.WriteJSON(msg); err != nil {
// If there's an error writing then drop the
// connection, as client may have disappeared
// suddenly; they can reconnect if necessary.
l.Debugf("error writing websocket message: %v", err)
- break
+ return
}
- // We have no message but we
- // need to send a keep-alive ping.
case shouldPing:
+ // We have no message but we do
+ // need to send a keep-alive ping.
l.Trace("writing websocket ping")
+
if err := wsConn.WriteControl(websocket.PingMessage, pingMsg, time.Time{}); err != nil {
// If there's an error writing then drop the
// connection, as client may have disappeared
// suddenly; they can reconnect if necessary.
l.Debugf("error writing websocket ping: %v", err)
- break
+ return
}
-
- // We have no message and we shouldn't
- // send a ping; this means the stream
- // has been closed from the client's end.
- default:
- return
}
}
}