Отключите расширение клиента, если сервер не принимает расширения - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть клиент WebSocket, который использует netty WebSocketClientCompressionHandler для поддержки расширения сжатия.Чтобы это расширение работало правильно, мне нужно установить значение allowExtensions в true при создании newHandshaker с использованием WebSocketClientHandshakerFactory.

В тех случаях, когда сервер не поддерживает эти расширения, он отвечает без Sec-WebSocket-Extensions.Если это так, если используются зарезервированные (RSV) биты, клиент должен немедленно прервать соединение.

Поскольку я создаю WebSocketClientHandshaker до того, как смогу получить какой-либо ответ от сервера, я не могу впоследствии установить значение allowExtensions в false, когда узнаю, что сервер не поддерживает расширения.

Можно ли в любом случае установить значение allowExtensions в false после получения ответа от сервера (или сообщить netty), чтобы netty закрывала соединение, если бит RSV установлен из-за нарушения протокола?

(Для реализации сервера я проверяю заголовки клиентских запросов на Sec-WebSocket-Extensions перед созданием подтверждения связи, что нормально.)

1 Ответ

0 голосов
/ 19 декабря 2018

Единственное решение, которое у меня было, состояло в том, чтобы заменить 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));
            }
...