Spring Boot 2 - Webflux - Websocket - Netty - Compressão
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-deflate
em 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-deflate
propostas 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
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 ReactorNettyRequestUpgradeStrategy
cria 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.compress
precisa 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:
