如果服务器不接受扩展,则禁用客户端扩展
Disable client extension if server does not accept extensions
我有一个使用 netty WebSocketClientCompressionHandler
支持压缩扩展的 WebSocket 客户端。为了使此扩展正常工作,我需要在使用 WebSocketClientHandshakerFactory
创建 newHandshaker
时将 allowExtensions
值设置为 true。
有时当服务器不支持这些扩展时,它会在没有 Sec-WebSocket-Extensions
的情况下进行响应。如果使用了保留 (RSV) 位,则客户端应立即终止连接。
由于我在从服务器获得任何响应之前创建了 WebSocketClientHandshaker
,所以当我知道服务器没有响应时,我无法将 allowExtensions
的值设置为 false支持扩展。
在我收到来自服务器的响应(或通知 netty)之后,无论如何都可以将 allowExtensions
的值设置为 false,以便如果由于协议违规而设置 RSV 位,netty 将关闭连接?
(对于服务器实现,我会在创建握手器之前检查客户端请求 headers 是否为 Sec-WebSocket-Extensions
,这很好。)
我唯一的解决办法是在完成握手后替换 WebSocketFrameDecoder
,如果握手响应没有扩展头,则将 allowExtensions
值设置为 false:
handshaker.finishHandshake(ctx.channel(), handshakeResponse);
Channel channel = ctx.channel();
String extensionsHeader = handshakeResponse.headers().getAsString(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS);
if (extensionsHeader == null) {
// This replaces the frame decoder to make sure the rsv bits are not allowed
channel.pipeline().replace(WebSocketFrameDecoder.class, "ws-decoder",
new WebSocket13FrameDecoder(false, false, handshaker.maxFramePayloadLength(),
false));
}
我有一个使用 netty WebSocketClientCompressionHandler
支持压缩扩展的 WebSocket 客户端。为了使此扩展正常工作,我需要在使用 WebSocketClientHandshakerFactory
创建 newHandshaker
时将 allowExtensions
值设置为 true。
有时当服务器不支持这些扩展时,它会在没有 Sec-WebSocket-Extensions
的情况下进行响应。如果使用了保留 (RSV) 位,则客户端应立即终止连接。
由于我在从服务器获得任何响应之前创建了 WebSocketClientHandshaker
,所以当我知道服务器没有响应时,我无法将 allowExtensions
的值设置为 false支持扩展。
在我收到来自服务器的响应(或通知 netty)之后,无论如何都可以将 allowExtensions
的值设置为 false,以便如果由于协议违规而设置 RSV 位,netty 将关闭连接?
(对于服务器实现,我会在创建握手器之前检查客户端请求 headers 是否为 Sec-WebSocket-Extensions
,这很好。)
我唯一的解决办法是在完成握手后替换 WebSocketFrameDecoder
,如果握手响应没有扩展头,则将 allowExtensions
值设置为 false:
handshaker.finishHandshake(ctx.channel(), handshakeResponse);
Channel channel = ctx.channel();
String extensionsHeader = handshakeResponse.headers().getAsString(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS);
if (extensionsHeader == null) {
// This replaces the frame decoder to make sure the rsv bits are not allowed
channel.pipeline().replace(WebSocketFrameDecoder.class, "ws-decoder",
new WebSocket13FrameDecoder(false, false, handshaker.maxFramePayloadLength(),
false));
}