mirror of https://github.com/halo-dev/halo
Support obtaining ServerWebExchange in ContextView (#6705)
#### What type of PR is this? /kind feature /area core /milestone 2.20.x #### What this PR does / why we need it: This PR registers a ServerWebExchangeContextFilter to make ServerWebExchange available under ContextView. The usage example is as follows: ```java Mono.deferContextual(contextView -> { var exchange = ServerWebExchangeContextFilter.getExchange(contextView); assertTrue(exchange.isPresent()); return mono; }) ``` #### Does this PR introduce a user-facing change? ```release-note None ```pull/6488/head
parent
fd40770ebc
commit
9710201aa4
|
@ -26,6 +26,7 @@ import org.springframework.http.codec.ServerCodecConfigurer;
|
||||||
import org.springframework.http.codec.json.Jackson2JsonDecoder;
|
import org.springframework.http.codec.json.Jackson2JsonDecoder;
|
||||||
import org.springframework.http.codec.json.Jackson2JsonEncoder;
|
import org.springframework.http.codec.json.Jackson2JsonEncoder;
|
||||||
import org.springframework.lang.NonNull;
|
import org.springframework.lang.NonNull;
|
||||||
|
import org.springframework.web.filter.reactive.ServerWebExchangeContextFilter;
|
||||||
import org.springframework.web.reactive.config.ResourceHandlerRegistration;
|
import org.springframework.web.reactive.config.ResourceHandlerRegistration;
|
||||||
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
|
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
|
||||||
import org.springframework.web.reactive.config.WebFluxConfigurer;
|
import org.springframework.web.reactive.config.WebFluxConfigurer;
|
||||||
|
@ -252,4 +253,11 @@ public class WebFluxConfig implements WebFluxConfigurer {
|
||||||
return new AdditionalWebFilterChainProxy(extensionGetter);
|
return new AdditionalWebFilterChainProxy(extensionGetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
// We expect this filter to be executed before AdditionalWebFilterChainProxy
|
||||||
|
@Order(-102)
|
||||||
|
ServerWebExchangeContextFilter serverWebExchangeContextFilter() {
|
||||||
|
return new ServerWebExchangeContextFilter();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package run.halo.app.config;
|
package run.halo.app.config;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
@ -18,10 +19,15 @@ import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
|
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
|
||||||
import org.springframework.test.web.reactive.server.WebTestClient;
|
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||||
|
import org.springframework.web.filter.reactive.ServerWebExchangeContextFilter;
|
||||||
|
import org.springframework.web.reactive.function.server.RouterFunction;
|
||||||
|
import org.springframework.web.reactive.function.server.RouterFunctions;
|
||||||
|
import org.springframework.web.reactive.function.server.ServerResponse;
|
||||||
import org.springframework.web.reactive.socket.WebSocketHandler;
|
import org.springframework.web.reactive.socket.WebSocketHandler;
|
||||||
import org.springframework.web.reactive.socket.WebSocketMessage;
|
import org.springframework.web.reactive.socket.WebSocketMessage;
|
||||||
import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient;
|
import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
import reactor.test.StepVerifier;
|
import reactor.test.StepVerifier;
|
||||||
import run.halo.app.core.endpoint.WebSocketEndpoint;
|
import run.halo.app.core.endpoint.WebSocketEndpoint;
|
||||||
import run.halo.app.core.extension.Role;
|
import run.halo.app.core.extension.Role;
|
||||||
|
@ -31,7 +37,10 @@ import run.halo.app.extension.Metadata;
|
||||||
|
|
||||||
@SpringBootTest(properties = "halo.console.location=classpath:/console/", webEnvironment =
|
@SpringBootTest(properties = "halo.console.location=classpath:/console/", webEnvironment =
|
||||||
SpringBootTest.WebEnvironment.RANDOM_PORT)
|
SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
@Import(WebFluxConfigTest.WebSocketSupportTest.TestWebSocketConfiguration.class)
|
@Import({
|
||||||
|
WebFluxConfigTest.WebSocketSupportTest.TestWebSocketConfiguration.class,
|
||||||
|
WebFluxConfigTest.ServerWebExchangeContextFilterTest.TestConfig.class
|
||||||
|
})
|
||||||
@AutoConfigureWebTestClient
|
@AutoConfigureWebTestClient
|
||||||
class WebFluxConfigTest {
|
class WebFluxConfigTest {
|
||||||
|
|
||||||
|
@ -154,4 +163,34 @@ class WebFluxConfigTest {
|
||||||
.expectStatus().isNotFound();
|
.expectStatus().isNotFound();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class ServerWebExchangeContextFilterTest {
|
||||||
|
|
||||||
|
@TestConfiguration
|
||||||
|
static class TestConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
RouterFunction<ServerResponse> assertServerWebExchangeRoute() {
|
||||||
|
return RouterFunctions.route()
|
||||||
|
.GET("/assert-server-web-exchange",
|
||||||
|
request -> Mono.deferContextual(contextView -> {
|
||||||
|
var exchange = ServerWebExchangeContextFilter.getExchange(contextView);
|
||||||
|
assertTrue(exchange.isPresent());
|
||||||
|
return ServerResponse.ok().build();
|
||||||
|
}))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldGetExchangeFromContextView() {
|
||||||
|
webClient.get().uri("/assert-server-web-exchange")
|
||||||
|
.exchange()
|
||||||
|
.expectStatus().isOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue