Spring Boot 2 - Webflux - Websocket - Netty - Compressione

Dec 04 2020

sto usando

  • spring-boot-starter-web 2.3.1
  • spring-webflux 5.2.7
  • Spring-boot-starter-reattore-netty 2.3.1

Sto cercando di utilizzare le Sec-WebSocket-Extensions: permessage-deflaterisposte sui websocket. Netty supporta la decompressione websocket dalla correzione 507 ( domanda correlata)

Ma non funziona (ovvero, il server non utilizza le permessage-deflateproposte nelle intestazioni delle richieste)

Considerando che quando uso jetty con spring-boot-starter-jetty, funziona immediatamente, non è necessaria alcuna configurazione aggiuntiva.

Qualcuno sa come risolvere questo problema? Grazie!

Risposte

AndrianekenaMoise Jan 06 2021 at 23:33

Dopo aver esaminato il framework spring-webflux, la compressione è disabilitata per impostazione predefinita nel reattore-netty. Infatti, il costruttore predefinito della classe ReactorNettyRequestUpgradeStrategycrea un'istanza del valore del parametro di classe WebsocketServerSpec con valore predefinito (compressione = false).

Reactor-netty controlla il predicato websocketClientSpec.compress()per stabilire un supporto di compressione.

Quindi il parametro websocketClientSpec.compressdeve essere attivato.

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

Il risultato della stretta di mano: