From b6feead1d0f6697f1db82341bddcdc33dd59b592 Mon Sep 17 00:00:00 2001 From: fru1tworld Date: Thu, 2 Apr 2026 21:33:17 +0900 Subject: [PATCH 1/2] Add warn logging when WebSocket message receive fails When gateway proxies WebSocket connections and a message exceeds the max frame payload length, the connection is dropped silently. Add doOnError handlers to log a warning with session details, making it easier to diagnose frame size issues. Fixes gh-1048 Signed-off-by: fru1tworld --- .../cloud/gateway/filter/WebsocketRoutingFilter.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java index 946b3acdf..d0745526e 100644 --- a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java @@ -262,6 +262,12 @@ public Mono handle(WebSocketSession proxySession) { + ", corresponding session:" + session.getId() + ", packet: " + webSocketMessage.getPayloadAsText()); } + }).doOnError(throwable -> { + if (log.isWarnEnabled()) { + log.warn("Error receiving WebSocket message from client session: " + + session.getId() + ", proxySession: " + + proxySession.getId(), throwable); + } })); // .log("proxySessionSend", Level.FINE); Mono serverSessionSend = session @@ -271,6 +277,12 @@ public Mono handle(WebSocketSession proxySession) { + ", corresponding proxySession:" + proxySession.getId() + " packet: " + webSocketMessage.getPayloadAsText()); } + }).doOnError(throwable -> { + if (log.isWarnEnabled()) { + log.warn("Error receiving WebSocket message from backend proxySession: " + + proxySession.getId() + ", session: " + + session.getId(), throwable); + } })); // .log("sessionSend", Level.FINE); // Ensure closeStatus from one propagates to the other From e39add186acbf8310cba8900b902355e5b41ef9d Mon Sep 17 00:00:00 2001 From: fru1tworld Date: Tue, 5 May 2026 15:49:42 +0900 Subject: [PATCH 2/2] Extract helper for WebSocket receive-error logging to remove duplication Signed-off-by: fru1tworld --- .../filter/WebsocketRoutingFilter.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java index d0745526e..9b960f9e8 100644 --- a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java @@ -173,6 +173,14 @@ static void changeSchemeIfIsWebSocketUpgrade(ServerWebExchange exchange) { } } + private static void logReceiveError(String fromLabel, String fromId, String toLabel, String toId, + Throwable throwable) { + if (log.isWarnEnabled()) { + log.warn("Error receiving WebSocket message from " + fromLabel + ": " + fromId + ", " + toLabel + ": " + + toId, throwable); + } + } + private static class ProxyWebSocketHandler implements WebSocketHandler { private final WebSocketClient client; @@ -262,13 +270,9 @@ public Mono handle(WebSocketSession proxySession) { + ", corresponding session:" + session.getId() + ", packet: " + webSocketMessage.getPayloadAsText()); } - }).doOnError(throwable -> { - if (log.isWarnEnabled()) { - log.warn("Error receiving WebSocket message from client session: " - + session.getId() + ", proxySession: " - + proxySession.getId(), throwable); - } - })); + }) + .doOnError(throwable -> logReceiveError("client session", session.getId(), "proxySession", + proxySession.getId(), throwable))); // .log("proxySessionSend", Level.FINE); Mono serverSessionSend = session .send(proxySession.receive().doOnNext(WebSocketMessage::retain).doOnNext(webSocketMessage -> { @@ -277,13 +281,9 @@ public Mono handle(WebSocketSession proxySession) { + ", corresponding proxySession:" + proxySession.getId() + " packet: " + webSocketMessage.getPayloadAsText()); } - }).doOnError(throwable -> { - if (log.isWarnEnabled()) { - log.warn("Error receiving WebSocket message from backend proxySession: " - + proxySession.getId() + ", session: " - + session.getId(), throwable); - } - })); + }) + .doOnError(throwable -> logReceiveError("backend proxySession", proxySession.getId(), + "session", session.getId(), throwable))); // .log("sessionSend", Level.FINE); // Ensure closeStatus from one propagates to the other Mono.when(serverClose, proxyClose).subscribe();