Spring Boot 2 - Webflux - Websocket - Netty - Compressão

Dec 04 2020

estou a usar

  • spring-boot-starter-web 2.3.1
  • spring-webflux 5.2.7
  • spring-boot-starter-reactor-netty 2.3.1

Estou tentando usar Sec-WebSocket-Extensions: permessage-deflateem respostas de websockets. Netty suporta descompressão de websocket desde a correção 507 ( questão relacionada)

Mas não funciona (ou seja, o servidor não usa permessage-deflatepropostas nos cabeçalhos de solicitação)

Considerando que quando eu uso o jetty com spring-boot-starter-jetty, ele funciona fora da caixa, nenhuma configuração extra necessária.

Alguém sabe como resolver isso? Obrigado!

Respostas

AndrianekenaMoise Jan 06 2021 at 23:33

Depois de examinar a estrutura spring-webflux, a compressão é desabilitada por padrão no reactor-netty. Na verdade, o construtor padrão da classe ReactorNettyRequestUpgradeStrategycria uma instância do valor do parâmetro de classe WebsocketServerSpec com o valor padrão (compressão = falso).

O Reactor-netty verifica o predicado websocketClientSpec.compress()para estabelecer um suporte de compressão.

Portanto, o parâmetro websocketClientSpec.compressprecisa ser ativado.

@Bean
public WebSocketHandlerAdapter handlerAdapter(WebSocketService webSocketService) {
return new WebSocketHandlerAdapter(webSocketService);
}
@Bean
public WebSocketService webSocketService() {
return new HandshakeWebSocketService(
new ReactorNettyRequestUpgradeStrategy(WebsocketServerSpec.builder().compress(true)));
}

O handshake de resultado: