Skip to content

Commit 7e6fa57

Browse files
committed
Add timeout to await for close message.
1 parent 8964d89 commit 7e6fa57

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

server/session_ws.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -519,19 +519,23 @@ func (s *sessionWS) Close(msg string, reason runtime.PresenceReason, envelopes .
519519
}
520520
if msg != "" {
521521
// Server initiated close, await for client close response.
522-
if err := s.conn.SetReadDeadline(time.Now().Add(s.pongWaitDuration)); err != nil {
523-
s.logger.Warn("Failed to set read deadline", zap.Error(err))
524-
} else {
525-
for {
526-
msgType, _, readErr := s.conn.ReadMessage()
527-
if readErr != nil {
528-
// If any error occurs, close message likely won't be delivered, just close the socket.
529-
break
530-
}
531-
if msgType == websocket.CloseMessage {
532-
// We only care about the close message at this point, if the server initiated a close then something went wrong.
533-
break
534-
}
522+
t := time.NewTimer(10 * time.Second)
523+
defer t.Stop()
524+
closeMessageWait:
525+
for {
526+
msgType, _, readErr := s.conn.ReadMessage()
527+
if readErr != nil || msgType == websocket.CloseMessage {
528+
// The server initiated close, so something went wrong. Thus, we only care about the close message at this point.
529+
// If any error occurs, close message likely won't be delivered, just close the socket.
530+
break
531+
}
532+
533+
select {
534+
case <-t.C:
535+
// If the client doesn't respond within 10 seconds, close the connection anyway.
536+
break closeMessageWait
537+
default:
538+
// Otherwise, continue reading messages until we get a close message or timeout.
535539
}
536540
}
537541
}

0 commit comments

Comments
 (0)