|
|
@@ -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
|
|
|
+}
|