Spring Boot 2 - Webflux - Websocket - Netty - Compresión

Dec 04 2020

Estoy usando

  • Spring-boot-starter-web 2.3.1
  • spring-webflux 5.2.7
  • resorte-arranque-arrancador-reactor-netty 2.3.1

Estoy tratando de usar Sec-WebSocket-Extensions: permessage-deflateen respuestas de websockets. Netty admite la descompresión de websocket desde la corrección 507 ( pregunta relacionada)

Pero no funciona (es decir, el servidor no usa el permessage-deflatepropuesto en los encabezados de solicitud)

Mientras que cuando uso embarcadero con spring-boot-starter-jetty, funciona fuera de la caja, sin necesidad de configuración adicional necesaria.

¿Alguien sabe cómo resolver esto? ¡Gracias!

Respuestas

AndrianekenaMoise Jan 06 2021 at 23:33

Después de mirar el marco spring-webflux, la compresión está deshabilitada por defecto en reactor-netty. De hecho, el constructor predeterminado de clase ReactorNettyRequestUpgradeStrategycrea una instancia del valor del parámetro de clase WebsocketServerSpec con el valor predeterminado (compresión = falso).

Reactor-netty verifica el predicado websocketClientSpec.compress()para establecer un soporte de compresión.

Entonces el parámetro websocketClientSpec.compressdebe activarse.

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

El resultado del apretón de manos: