WebFlux support for SSE Fragment stream

See gh-33194
This commit is contained in:
rstoyanchev
2024-07-24 15:33:24 +01:00
parent aa6b47bfce
commit 6e55e78b22
2 changed files with 118 additions and 1 deletions

View File

@@ -90,6 +90,35 @@ public class FragmentViewResolutionResultHandlerTests {
assertThat(body).isEqualTo("<p>Hello Foo</p><p>Hello Bar</p>");
}
@Test
void renderSse() {
MockServerHttpRequest request = MockServerHttpRequest.get("/")
.accept(MediaType.TEXT_EVENT_STREAM)
.acceptLanguageAsLocales(Locale.ENGLISH)
.build();
MockServerWebExchange exchange = MockServerWebExchange.from(request);
HandlerResult result = new HandlerResult(
new Handler(),
Flux.just(fragment1, fragment2).subscribeOn(Schedulers.boundedElastic()),
on(Handler.class).resolveReturnType(Flux.class, Fragment.class),
new BindingContext());
String body = initHandler().handleResult(exchange, result)
.then(Mono.defer(() -> exchange.getResponse().getBodyAsString()))
.block(Duration.ofSeconds(60));
assertThat(body).isEqualTo("""
event:fragment1
data:<p>Hello Foo</p>
event:fragment2
data:<p>Hello Bar</p>
""");
}
private ViewResolutionResultHandler initHandler() {
AnnotationConfigApplicationContext context =
@@ -98,6 +127,7 @@ public class FragmentViewResolutionResultHandlerTests {
String prefix = "org/springframework/web/reactive/result/view/script/kotlin/";
ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".kts");
viewResolver.setApplicationContext(context);
viewResolver.setSupportedMediaTypes(List.of(MediaType.TEXT_HTML, MediaType.TEXT_EVENT_STREAM));
RequestedContentTypeResolver contentTypeResolver = new HeaderContentTypeResolver();
return new ViewResolutionResultHandler(List.of(viewResolver), contentTypeResolver);