Skip to content

Commit

Permalink
Merge pull request #24367 from JacobASeverson/gh-24331
Browse files Browse the repository at this point in the history
Closes gh-24367
  • Loading branch information
rstoyanchev committed Jan 16, 2020
2 parents 3d33cf3 + b1d93bb commit 19180e0
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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.
Expand All @@ -65,6 +68,7 @@ public ReactorNettyWebSocketClient(HttpClient httpClient) {
this.httpClient = httpClient;
}


/**
* Return the configured {@link HttpClient}.
*/
Expand Down Expand Up @@ -95,6 +99,28 @@ public int getMaxFramePayloadLength() {
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.
* <p>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<Void> execute(URI url, WebSocketHandler handler) {
Expand All @@ -106,7 +132,7 @@ public Mono<Void> execute(URI url, HttpHeaders requestHeaders, WebSocketHandler
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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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
Expand All @@ -68,6 +70,29 @@ public int getMaxFramePayloadLength() {
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.
* <p>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<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler,
Expand All @@ -78,7 +103,7 @@ public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler,
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(
Expand Down

0 comments on commit 19180e0

Please sign in to comment.