diff --git a/server/internal/http/legacy/handler.go b/server/internal/http/legacy/handler.go index 27917895..ca3dde56 100644 --- a/server/internal/http/legacy/handler.go +++ b/server/internal/http/legacy/handler.go @@ -142,7 +142,7 @@ func (h *LegacyHandler) Route(r types.Router) { m = websocket.FormatCloseMessage(e.Code, e.Text) } } - errc <- err + errc <- fmt.Errorf("src read message error: %w", err) dst.WriteMessage(websocket.CloseMessage, m) break } @@ -163,12 +163,20 @@ func (h *LegacyHandler) Route(r types.Router) { }) continue } else if errors.Is(err, ErrWebsocketSend) { - errc <- err + errc <- fmt.Errorf("dst write message error: %w", err) break } else { h.logger.Error().Err(err).Msg("couldn't rewrite text message") } } + // forward ping messages + if msgType == websocket.PingMessage { + err = dst.WriteMessage(websocket.PingMessage, nil) + if err != nil { + errc <- err + break + } + } } } diff --git a/webpage/docs/reverse-proxy-setup.md b/webpage/docs/reverse-proxy-setup.md index e2a5bf95..95bb13fb 100644 --- a/webpage/docs/reverse-proxy-setup.md +++ b/webpage/docs/reverse-proxy-setup.md @@ -6,6 +6,8 @@ If you want to run Neko behind a reverse proxy, you can use the following exampl Do not forget to enable [`server.proxy=true`](/docs/v3/configuration#server.proxy) in your `config.yml` file to allow the server to trust the proxy headers. ::: +Neko pings websocket client every 10 seconds, and client is scheduled to send [heartbeat](/docs/v3/configuration#session.heartbeat_interval) to the server every 120 seconds. Make sure, that your timeout settings in the reverse proxy are set accordingly. + ## Traefik v2 {#traefik-v2} See the example below for a `docker-compose.yml` file.