Revise solution for WebFlux JettyRequestUpgradeStrategy

See gh-30344
This commit is contained in:
rstoyanchev
2023-09-13 13:25:02 +01:00
parent c23795a8a6
commit bd4b3866fc

View File

@@ -16,6 +16,7 @@
package org.springframework.web.reactive.socket.server.upgrade;
import java.util.function.Consumer;
import java.util.function.Supplier;
import jakarta.servlet.ServletContext;
@@ -23,6 +24,7 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketCreator;
import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer;
import org.eclipse.jetty.websocket.api.Configurable;
import reactor.core.publisher.Mono;
import org.springframework.core.io.buffer.DataBufferFactory;
@@ -47,6 +49,24 @@ import org.springframework.web.server.ServerWebExchange;
*/
public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy {
@Nullable
private Consumer<Configurable> webSocketConfigurer;
@Nullable
private JettyWebSocketServerContainer serverContainer;
/**
* Add a callback to configure WebSocket server parameters on
* {@link JettyWebSocketServerContainer}.
* @since 6.1.0
*/
public void addWebSocketConfigurer(Consumer<Configurable> webSocketConfigurer) {
this.webSocketConfigurer = (this.webSocketConfigurer != null ?
this.webSocketConfigurer.andThen(webSocketConfigurer) : webSocketConfigurer);
}
@Override
public Mono<Void> upgrade(
ServerWebExchange exchange, WebSocketHandler handler,
@@ -76,8 +96,7 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy {
return adapter;
};
JettyWebSocketServerContainer container = JettyWebSocketServerContainer.getContainer(servletContext);
JettyWebSocketServerContainer container = getWebSocketServerContainer(servletContext);
try {
container.upgrade(webSocketCreator, servletRequest, servletResponse);
}
@@ -89,4 +108,15 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy {
}));
}
private JettyWebSocketServerContainer getWebSocketServerContainer(ServletContext servletContext) {
if (this.serverContainer == null) {
JettyWebSocketServerContainer container = JettyWebSocketServerContainer.getContainer(servletContext);
if (this.webSocketConfigurer != null) {
this.webSocketConfigurer.accept(container);
}
this.serverContainer = container;
}
return this.serverContainer;
}
}