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<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().getHeaders().putAll(render.headers());
 | 
			
		||||
 | 
			
		||||
						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);
 | 
			
		||||
					}
 | 
			
		||||
| 
						 | 
				
			
			@ -331,7 +333,8 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
		fragment.mergeAttributes(bindingContext.getModel());
 | 
			
		||||
| 
						 | 
				
			
			@ -343,19 +346,17 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
 | 
			
		|||
				Mono.just(List.of(fragment.view())) :
 | 
			
		||||
				resolveViews(fragment.viewName() != null ? fragment.viewName() : getDefaultViewName(exchange), locale));
 | 
			
		||||
 | 
			
		||||
		FragmentFormatter fragmentFormatter = getFragmentFormatter(exchange);
 | 
			
		||||
 | 
			
		||||
		return selectedViews.flatMap(views -> render(views, fragment.model(), bindingContext, mutatedExchange))
 | 
			
		||||
				.then(Mono.fromSupplier(() -> (fragmentFormatter != null ?
 | 
			
		||||
						fragmentFormatter.format(response.getBodyFlux(), fragment, exchange) :
 | 
			
		||||
				.then(Mono.fromSupplier(() -> (streamHandler != null ?
 | 
			
		||||
						streamHandler.format(response.getBodyFlux(), fragment, exchange) :
 | 
			
		||||
						response.getBodyFlux())));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Nullable
 | 
			
		||||
	private FragmentFormatter getFragmentFormatter(ServerWebExchange exchange) {
 | 
			
		||||
		for (FragmentFormatter formatter : this.fragmentFormatters) {
 | 
			
		||||
			if (formatter.supports(exchange.getRequest())) {
 | 
			
		||||
				return formatter;
 | 
			
		||||
	private StreamHandler getStreamHandler(ServerWebExchange exchange) {
 | 
			
		||||
		for (StreamHandler handler : this.streamHandlers) {
 | 
			
		||||
			if (handler.supports(exchange.getRequest())) {
 | 
			
		||||
				return handler;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -460,7 +461,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
 | 
			
		|||
	/**
 | 
			
		||||
	 * Strategy to render fragment with stream formatting.
 | 
			
		||||
	 */
 | 
			
		||||
	private interface FragmentFormatter {
 | 
			
		||||
	private interface StreamHandler {
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Whether the formatter supports the given request.
 | 
			
		||||
| 
						 | 
				
			
			@ -469,12 +470,12 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
 | 
			
		|||
 | 
			
		||||
		/**
 | 
			
		||||
		 * 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 exchange the current exchange
 | 
			
		||||
		 * @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.
 | 
			
		||||
	 */
 | 
			
		||||
	private static class SseFragmentFormatter implements FragmentFormatter {
 | 
			
		||||
	private static class SseStreamHandler implements StreamHandler {
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public boolean supports(ServerHttpRequest request) {
 | 
			
		||||
| 
						 | 
				
			
			@ -492,7 +493,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
 | 
			
		|||
 | 
			
		||||
		@Override
 | 
			
		||||
		public Flux<DataBuffer> format(
 | 
			
		||||
				Flux<DataBuffer> fragmentBuffers, Fragment fragment, ServerWebExchange exchange) {
 | 
			
		||||
				Flux<DataBuffer> fragmentContent, Fragment fragment, ServerWebExchange exchange) {
 | 
			
		||||
 | 
			
		||||
			Charset charset = getCharset(exchange.getRequest());
 | 
			
		||||
			DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
 | 
			
		||||
| 
						 | 
				
			
			@ -501,7 +502,7 @@ public class ViewResolutionResultHandler extends HandlerResultHandlerSupport imp
 | 
			
		|||
 | 
			
		||||
			return Flux.concat(
 | 
			
		||||
					Flux.just(encodeText(eventLine + "data:", charset, bufferFactory)),
 | 
			
		||||
					fragmentBuffers,
 | 
			
		||||
					fragmentContent,
 | 
			
		||||
					Flux.just(encodeText("\n\n", charset, bufferFactory)));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue