From 48accb783f44533b6e9097fbfee21b1ea8a8cc7c Mon Sep 17 00:00:00 2001 From: spencergibb Date: Mon, 1 Nov 2021 15:39:34 -0400 Subject: [PATCH] Updates return value for Websocket return. From @rstoyanchev: I think serverClose and proxyClose don't need to be included in, and probably should be separated from the zip because they are sort of competing with the Mono from each WebSocketHandler, and zip will cancel the other publishers after one of them completes. --- .../cloud/gateway/filter/WebsocketRoutingFilter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java index d512d43d..8286e7d3 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java @@ -214,8 +214,10 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered { Mono serverSessionSend = session .send(proxySession.receive().doOnNext(WebSocketMessage::retain)); // .log("sessionSend", Level.FINE); - return Mono.zip(proxySessionSend, serverSessionSend, serverClose, proxyClose).then(); - } + // Ensure closeStatus from one propagates to the other + Mono.when(serverClose, proxyClose).subscribe(); + // Complete when both sessions are done + return Mono.zip(proxySessionSend, serverSessionSend).then(); } /** * Copy subProtocols so they are available downstream.