parent
3863b77536
commit
f5ed1b8f6d
|
@ -100,7 +100,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
|
|
||||||
private final List<View> defaultViews = new ArrayList<>(4);
|
private final List<View> defaultViews = new ArrayList<>(4);
|
||||||
|
|
||||||
private final List<FragmentFormatter> fragmentFormatters = List.of(new SseFragmentFormatter());
|
private final List<StreamHandler> streamHandlers = List.of(new SseStreamHandler());
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -273,10 +273,12 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
exchange.getResponse().setStatusCode(status);
|
exchange.getResponse().setStatusCode(status);
|
||||||
}
|
}
|
||||||
exchange.getResponse().getHeaders().putAll(render.headers());
|
exchange.getResponse().getHeaders().putAll(render.headers());
|
||||||
|
|
||||||
bindingContext.updateModel(exchange);
|
bindingContext.updateModel(exchange);
|
||||||
Flux<Flux<DataBuffer>> renderFlux = render.fragments()
|
|
||||||
.concatMap(fragment -> renderFragment(fragment, locale, bindingContext, exchange));
|
StreamHandler streamHandler = getStreamHandler(exchange);
|
||||||
|
|
||||||
|
Flux<Flux<DataBuffer>> renderFlux = render.fragments().concatMap(fragment ->
|
||||||
|
renderFragment(fragment, streamHandler, locale, bindingContext, exchange));
|
||||||
|
|
||||||
return exchange.getResponse().writeAndFlushWith(renderFlux);
|
return exchange.getResponse().writeAndFlushWith(renderFlux);
|
||||||
}
|
}
|
||||||
|
@ -331,7 +333,8 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<Flux<DataBuffer>> renderFragment(
|
private Mono<Flux<DataBuffer>> renderFragment(
|
||||||
Fragment fragment, Locale locale, BindingContext bindingContext, ServerWebExchange exchange) {
|
Fragment fragment, @Nullable StreamHandler streamHandler, Locale locale,
|
||||||
|
BindingContext bindingContext, ServerWebExchange exchange) {
|
||||||
|
|
||||||
// Merge attributes from top-level model
|
// Merge attributes from top-level model
|
||||||
fragment.mergeAttributes(bindingContext.getModel());
|
fragment.mergeAttributes(bindingContext.getModel());
|
||||||
|
@ -343,19 +346,17 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
Mono.just(List.of(fragment.view())) :
|
Mono.just(List.of(fragment.view())) :
|
||||||
resolveViews(fragment.viewName() != null ? fragment.viewName() : getDefaultViewName(exchange), locale));
|
resolveViews(fragment.viewName() != null ? fragment.viewName() : getDefaultViewName(exchange), locale));
|
||||||
|
|
||||||
FragmentFormatter fragmentFormatter = getFragmentFormatter(exchange);
|
|
||||||
|
|
||||||
return selectedViews.flatMap(views -> render(views, fragment.model(), bindingContext, mutatedExchange))
|
return selectedViews.flatMap(views -> render(views, fragment.model(), bindingContext, mutatedExchange))
|
||||||
.then(Mono.fromSupplier(() -> (fragmentFormatter != null ?
|
.then(Mono.fromSupplier(() -> (streamHandler != null ?
|
||||||
fragmentFormatter.format(response.getBodyFlux(), fragment, exchange) :
|
streamHandler.format(response.getBodyFlux(), fragment, exchange) :
|
||||||
response.getBodyFlux())));
|
response.getBodyFlux())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private FragmentFormatter getFragmentFormatter(ServerWebExchange exchange) {
|
private StreamHandler getStreamHandler(ServerWebExchange exchange) {
|
||||||
for (FragmentFormatter formatter : this.fragmentFormatters) {
|
for (StreamHandler handler : this.streamHandlers) {
|
||||||
if (formatter.supports(exchange.getRequest())) {
|
if (handler.supports(exchange.getRequest())) {
|
||||||
return formatter;
|
return handler;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -460,7 +461,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
/**
|
/**
|
||||||
* Strategy to render fragment with stream formatting.
|
* Strategy to render fragment with stream formatting.
|
||||||
*/
|
*/
|
||||||
private interface FragmentFormatter {
|
private interface StreamHandler {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the formatter supports the given request.
|
* Whether the formatter supports the given request.
|
||||||
|
@ -469,12 +470,12 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format the given fragment.
|
* Format the given fragment.
|
||||||
* @param fragmentBuffers the fragment serialized to data buffers
|
* @param fragmentContent the fragment serialized to data buffers
|
||||||
* @param fragment the fragment being rendered
|
* @param fragment the fragment being rendered
|
||||||
* @param exchange the current exchange
|
* @param exchange the current exchange
|
||||||
* @return the formatted fragment
|
* @return the formatted fragment
|
||||||
*/
|
*/
|
||||||
Flux<DataBuffer> format(Flux<DataBuffer> fragmentBuffers, Fragment fragment, ServerWebExchange exchange);
|
Flux<DataBuffer> format(Flux<DataBuffer> fragmentContent, Fragment fragment, ServerWebExchange exchange);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,7 +483,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
/**
|
/**
|
||||||
* Formatter for Server-Sent Events formatting.
|
* Formatter for Server-Sent Events formatting.
|
||||||
*/
|
*/
|
||||||
private static class SseFragmentFormatter implements FragmentFormatter {
|
private static class SseStreamHandler implements StreamHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supports(ServerHttpRequest request) {
|
public boolean supports(ServerHttpRequest request) {
|
||||||
|
@ -492,7 +493,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<DataBuffer> format(
|
public Flux<DataBuffer> format(
|
||||||
Flux<DataBuffer> fragmentBuffers, Fragment fragment, ServerWebExchange exchange) {
|
Flux<DataBuffer> fragmentContent, Fragment fragment, ServerWebExchange exchange) {
|
||||||
|
|
||||||
Charset charset = getCharset(exchange.getRequest());
|
Charset charset = getCharset(exchange.getRequest());
|
||||||
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
|
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
|
||||||
|
@ -501,7 +502,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
|
||||||
|
|
||||||
return Flux.concat(
|
return Flux.concat(
|
||||||
Flux.just(encodeText(eventLine + "data:", charset, bufferFactory)),
|
Flux.just(encodeText(eventLine + "data:", charset, bufferFactory)),
|
||||||
fragmentBuffers,
|
fragmentContent,
|
||||||
Flux.just(encodeText("\n\n", charset, bufferFactory)));
|
Flux.just(encodeText("\n\n", charset, bufferFactory)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue