如果服务器不接受扩展,则禁用客户端扩展

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));
            }