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 d709a0208eb..85b37db1337 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-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -31,6 +31,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.reactive.socket.HandshakeInfo; import org.springframework.web.reactive.socket.WebSocketHandler; import org.springframework.web.reactive.socket.WebSocketSession; +import org.springframework.web.reactive.socket.adapter.NettyWebSocketSessionSupport; import org.springframework.web.reactive.socket.adapter.ReactorNettyWebSocketSession; /** @@ -43,6 +44,7 @@ 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; @@ -63,7 +65,6 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { this.httpClient = httpClient; } - /** * Return the configured {@link HttpClient}. */ @@ -71,6 +72,29 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { return this.httpClient; } + /** + * Configure the maximum allowable frame payload length. Setting this value + * to your application's requirement may reduce denial of service attacks + * using long data frames. + *

Corresponds to the argument with the same name in the constructor of + * {@link io.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory + * WebSocketServerHandshakerFactory} in Netty. + *

By default set to 65536 (64K). + * @param maxFramePayloadLength the max length for frames. + * @since 5.2 + */ + public void setMaxFramePayloadLength(int maxFramePayloadLength) { + this.maxFramePayloadLength = maxFramePayloadLength; + } + + /** + * Return the configured {@link #setMaxFramePayloadLength(int) maxFramePayloadLength}. + * @since 5.2 + */ + public int getMaxFramePayloadLength() { + return maxFramePayloadLength; + } + @Override public Mono execute(URI url, WebSocketHandler handler) { @@ -79,9 +103,10 @@ public class ReactorNettyWebSocketClient implements WebSocketClient { @Override public Mono execute(URI url, HttpHeaders requestHeaders, WebSocketHandler handler) { + String protocols = StringUtils.collectionToCommaDelimitedString(handler.getSubProtocols()); return getHttpClient() .headers(nettyHeaders -> setNettyHeaders(requestHeaders, nettyHeaders)) - .websocket(StringUtils.collectionToCommaDelimitedString(handler.getSubProtocols())) + .websocket(protocols, getMaxFramePayloadLength()) .uri(url.toString()) .handle((inbound, outbound) -> { HttpHeaders responseHeaders = toHttpHeaders(inbound);