Преглед изворни кода

add another case for close sent on websocket

Alexander Belanger пре 4 година
родитељ
комит
99fd8317b9
1 измењених фајлова са 14 додато и 13 уклоњено
  1. 14 13
      api/server/shared/websocket/response_writer.go

+ 14 - 13
api/server/shared/websocket/response_writer.go

@@ -26,23 +26,13 @@ func (w *WebsocketSafeReadWriter) WriteJSONWithChannel(v interface{}, errorChan
 	}
 }
 
-func errOr(err error, candidates ...error) bool {
-	res := false
-
-	for _, cErr := range candidates {
-		res = res || errors.Is(err, cErr)
-	}
-
-	return res
-}
-
 func (w *WebsocketSafeReadWriter) Write(data []byte) (int, error) {
 	err := w.conn.WriteMessage(websocket.TextMessage, data)
 
 	if err != nil {
-		// we ignore broken pipe errors and connection reset errors, but we want to
-		// send a message to the error channel to ensure closure
-		if !errors.Is(err, syscall.EPIPE) && !errors.Is(err, syscall.ECONNRESET) {
+		if errOr(err, websocket.ErrCloseSent, syscall.EPIPE, syscall.ECONNRESET) {
+			// if close has been sent, or error is broken pipe error or connection reset, we want to
+			// send a message to the error channel to ensure closure but we ignore the error
 			return 0, nil
 		} else if err != nil {
 			return 0, err
@@ -75,3 +65,14 @@ func (w *WebsocketResponseWriter) Write(data []byte) (int, error) {
 func (w *WebsocketResponseWriter) WriteHeader(statusCode int) {
 	return
 }
+
+// helper that returns true when `err` matches any of the candidates
+func errOr(err error, candidates ...error) bool {
+	res := false
+
+	for _, cErr := range candidates {
+		res = res || errors.Is(err, cErr)
+	}
+
+	return res
+}