Added checkStartsWith option for WebSocketServerProtocolHandler

Motivation:

Enables optional .startsWith() matching of req.uri() with websocketPath.

Modifications:

New checkStartsWith boolean option with default false value added to both WebSocketServerProtocolHandler and WebSocketServerProtocolHandshakeHandler. req.uri() matching is based on this option.

Result:

By default old behavior matching via .equal() is preserved. To use checkStartsWith use constructor shortcut: new WebSocketServerProtocolHandler(websocketPath, true) or fill this flag on full form of constructor among other options.
This commit is contained in:
Malik Baktiyarov 2016-12-16 02:59:11 +03:00 committed by Norman Maurer
parent 6a0f30d0d1
commit b91426ff33
2 changed files with 22 additions and 4 deletions

View File

@ -68,11 +68,16 @@ public class WebSocketServerProtocolHandler extends WebSocketProtocolHandler {
private final String subprotocols;
private final boolean allowExtensions;
private final int maxFramePayloadLength;
private final boolean checkStartsWith;
public WebSocketServerProtocolHandler(String websocketPath) {
this(websocketPath, null, false);
}
public WebSocketServerProtocolHandler(String websocketPath, boolean checkStartsWith) {
this(websocketPath, null, false, 65536, checkStartsWith);
}
public WebSocketServerProtocolHandler(String websocketPath, String subprotocols) {
this(websocketPath, subprotocols, false);
}
@ -83,10 +88,16 @@ public class WebSocketServerProtocolHandler extends WebSocketProtocolHandler {
public WebSocketServerProtocolHandler(String websocketPath, String subprotocols,
boolean allowExtensions, int maxFrameSize) {
this(websocketPath, subprotocols, allowExtensions, maxFrameSize, false);
}
public WebSocketServerProtocolHandler(String websocketPath, String subprotocols,
boolean allowExtensions, int maxFrameSize, boolean checkStartsWith) {
this.websocketPath = websocketPath;
this.subprotocols = subprotocols;
this.allowExtensions = allowExtensions;
maxFramePayloadLength = maxFrameSize;
this.checkStartsWith = checkStartsWith;
}
@Override
@ -96,7 +107,7 @@ public class WebSocketServerProtocolHandler extends WebSocketProtocolHandler {
// Add the WebSocketHandshakeHandler before this one.
ctx.pipeline().addBefore(ctx.name(), WebSocketServerProtocolHandshakeHandler.class.getName(),
new WebSocketServerProtocolHandshakeHandler(websocketPath, subprotocols,
allowExtensions, maxFramePayloadLength));
allowExtensions, maxFramePayloadLength, checkStartsWith));
}
}

View File

@ -41,19 +41,26 @@ class WebSocketServerProtocolHandshakeHandler
private final String subprotocols;
private final boolean allowExtensions;
private final int maxFramePayloadSize;
private final boolean checkStartsWith;
WebSocketServerProtocolHandshakeHandler(String websocketPath, String subprotocols,
boolean allowExtensions, int maxFrameSize) {
boolean allowExtensions, int maxFrameSize, boolean checkStartsWith) {
this.websocketPath = websocketPath;
this.subprotocols = subprotocols;
this.allowExtensions = allowExtensions;
maxFramePayloadSize = maxFrameSize;
this.checkStartsWith = checkStartsWith;
}
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
FullHttpRequest req = (FullHttpRequest) msg;
if (!websocketPath.equals(req.getUri())) {
final FullHttpRequest req = (FullHttpRequest) msg;
if (checkStartsWith) {
if (!req.getUri().startsWith(websocketPath)) {
ctx.fireChannelRead(msg);
return;
}
} else if (!req.getUri().equals(websocketPath)) {
ctx.fireChannelRead(msg);
return;
}