diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNettyWebSocketClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNettyWebSocketClient.java index d3e9f6f85e..e530381632 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNettyWebSocketClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNettyWebSocketClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,10 +44,13 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { private static final Log logger = LogFactory.getLog(ReactorNettyWebSocketClient.class); - private int maxFramePayloadLength = NettyWebSocketSessionSupport.DEFAULT_FRAME_MAX_SIZE; private final HttpClient httpClient; + private int maxFramePayloadLength = NettyWebSocketSessionSupport.DEFAULT_FRAME_MAX_SIZE; + + private boolean handlePing; + /** * Default constructor. @@ -65,6 +68,7 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { this.httpClient = httpClient; } + /** * Return the configured {@link HttpClient}. */ @@ -95,6 +99,28 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { return this.maxFramePayloadLength; } + /** + * Configure whether to let ping frames through to be handled by the + * {@link WebSocketHandler} given to the execute method. By default, Reactor + * Netty automatically replies with pong frames in response to pings. This is + * useful in a proxy for allowing ping and pong frames through. + *

By default this is set to {@code false} in which case ping frames are + * handled automatically by Reactor Netty. If set to {@code true}, ping + * frames will be passed through to the {@link WebSocketHandler}. + * @param handlePing whether to let Ping frames through for handling + * @since 5.2.4 + */ + public void setHandlePing(boolean handlePing) { + this.handlePing = handlePing; + } + + /** + * Return the configured {@link #setHandlePing(boolean)}. + * @since 5.2.4 + */ + public boolean getHandlePing() { + return this.handlePing; + } @Override public Mono execute(URI url, WebSocketHandler handler) { @@ -106,7 +132,7 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { String protocols = StringUtils.collectionToCommaDelimitedString(handler.getSubProtocols()); return getHttpClient() .headers(nettyHeaders -> setNettyHeaders(requestHeaders, nettyHeaders)) - .websocket(protocols, getMaxFramePayloadLength()) + .websocket(protocols, getMaxFramePayloadLength(), this.handlePing) .uri(url.toString()) .handle((inbound, outbound) -> { HttpHeaders responseHeaders = toHttpHeaders(inbound); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java index 85edc74852..afd8315f6c 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,6 +44,8 @@ public class ReactorNettyRequestUpgradeStrategy implements RequestUpgradeStrateg private int maxFramePayloadLength = NettyWebSocketSessionSupport.DEFAULT_FRAME_MAX_SIZE; + private boolean handlePing = false; + /** * Configure the maximum allowable frame payload length. Setting this value @@ -68,6 +70,29 @@ public class ReactorNettyRequestUpgradeStrategy implements RequestUpgradeStrateg return this.maxFramePayloadLength; } + /** + * Configure whether to let ping frames through to be handled by the + * {@link WebSocketHandler} given to the upgrade method. By default, Reactor + * Netty automatically replies with pong frames in response to pings. This is + * useful in a proxy for allowing ping and pong frames through. + *

By default this is set to {@code false} in which case ping frames are + * handled automatically by Reactor Netty. If set to {@code true}, ping + * frames will be passed through to the {@link WebSocketHandler}. + * @param handlePing whether to let Ping frames through for handling + * @since 5.2.4 + */ + public void setHandlePing(boolean handlePing) { + this.handlePing = handlePing; + } + + /** + * Return the configured {@link #setHandlePing(boolean)}. + * @since 5.2.4 + */ + public boolean getHandlePing() { + return this.handlePing; + } + @Override public Mono upgrade(ServerWebExchange exchange, WebSocketHandler handler, @@ -78,7 +103,7 @@ public class ReactorNettyRequestUpgradeStrategy implements RequestUpgradeStrateg HandshakeInfo handshakeInfo = handshakeInfoFactory.get(); NettyDataBufferFactory bufferFactory = (NettyDataBufferFactory) response.bufferFactory(); - return reactorResponse.sendWebsocket(subProtocol, this.maxFramePayloadLength, + return reactorResponse.sendWebsocket(subProtocol, this.maxFramePayloadLength, this.handlePing, (in, out) -> { ReactorNettyWebSocketSession session = new ReactorNettyWebSocketSession(