diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index 5ba878ee..d1ef0917 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -151,8 +151,10 @@ import org.springframework.validation.Validator; import org.springframework.web.reactive.DispatcherHandler; import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient; import org.springframework.web.reactive.socket.client.WebSocketClient; +import org.springframework.web.reactive.socket.server.RequestUpgradeStrategy; import org.springframework.web.reactive.socket.server.WebSocketService; import org.springframework.web.reactive.socket.server.support.HandshakeWebSocketService; +import org.springframework.web.reactive.socket.server.upgrade.ReactorNettyRequestUpgradeStrategy; import static org.springframework.cloud.gateway.config.HttpClientProperties.Pool.PoolType.DISABLED; import static org.springframework.cloud.gateway.config.HttpClientProperties.Pool.PoolType.FIXED; @@ -315,8 +317,9 @@ public class GatewayAutoConfiguration { } @Bean - public WebSocketService webSocketService() { - return new HandshakeWebSocketService(); + public WebSocketService webSocketService( + RequestUpgradeStrategy requestUpgradeStrategy) { + return new HandshakeWebSocketService(requestUpgradeStrategy); } @Bean @@ -739,6 +742,20 @@ public class GatewayAutoConfiguration { return webSocketClient; } + @Bean + public ReactorNettyRequestUpgradeStrategy reactorNettyRequestUpgradeStrategy( + HttpClientProperties httpClientProperties) { + ReactorNettyRequestUpgradeStrategy requestUpgradeStrategy = new ReactorNettyRequestUpgradeStrategy(); + + HttpClientProperties.Websocket websocket = httpClientProperties + .getWebsocket(); + PropertyMapper map = PropertyMapper.get(); + map.from(websocket::getMaxFramePayloadLength).whenNonNull() + .to(requestUpgradeStrategy::setMaxFramePayloadLength); + map.from(websocket::isProxyPing).to(requestUpgradeStrategy::setHandlePing); + return requestUpgradeStrategy; + } + } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java index 75f5b0c0..975d00ba 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java @@ -36,6 +36,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.reactive.HiddenHttpMethodFilter; import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient; +import org.springframework.web.reactive.socket.server.upgrade.ReactorNettyRequestUpgradeStrategy; import static org.assertj.core.api.Assertions.assertThat; @@ -118,6 +119,13 @@ public class GatewayAutoConfigurationTests { * assertThat(sslContext).isNotNull(); */ // TODO: howto test SslContext + assertThat(context) + .hasSingleBean(ReactorNettyRequestUpgradeStrategy.class); + ReactorNettyRequestUpgradeStrategy upgradeStrategy = context + .getBean(ReactorNettyRequestUpgradeStrategy.class); + assertThat(upgradeStrategy.getMaxFramePayloadLength()) + .isEqualTo(1024); + assertThat(upgradeStrategy.getHandlePing()).isTrue(); assertThat(context).hasSingleBean(ReactorNettyWebSocketClient.class); ReactorNettyWebSocketClient webSocketClient = context .getBean(ReactorNettyWebSocketClient.class);