/*
 *
 *  * Copyright 2002-2017 the original author or authors.
 *  *
 *  * Licensed under the Apache License, Version 2.0 (the "License");
 *  * you may not use this file except in compliance with the License.
 *  * You may obtain a copy of the License at
 *  *
 *  *      http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS,
 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  * See the License for the specific language governing permissions and
 *  * limitations under the License.
 *
 */
package org.springframework.security.web.server;

import java.util.Iterator;
import java.util.List;

import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;

import reactor.core.publisher.Mono;

/**
 * @author Rob Winch
 * @since 5.0
 */
public class WebFilterChainFilter implements WebFilter {
	private final List<WebFilter> filters;

	public WebFilterChainFilter(List<WebFilter> filters) {
		super();
		this.filters = filters;
	}

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
		SecurityWebFilterChain delegate = new SecurityWebFilterChain(chain, filters.iterator());
		return delegate.filter(exchange);
	}

	static class SecurityWebFilterChain implements WebFilterChain {
		private final WebFilterChain delegate;
		private final Iterator<WebFilter> filters;

		public SecurityWebFilterChain(WebFilterChain delegate, Iterator<WebFilter> filters) {
			super();
			this.delegate = delegate;
			this.filters = filters;
		}

		@Override
		public Mono<Void> filter(ServerWebExchange exchange) {
			if (filters.hasNext()) {
				WebFilter filter = filters.next();
				return filter.filter(exchange, this);
			} else {
				return delegate.filter(exchange);
			}
		}

	}
}

@@ -921,16 +921,152 @@
 Chain;%0A%0A
+import org.springframework.web.server.handler.DefaultWebFilterChain;%0Aimport org.springframework.web.server.handler.FilteringWebHandler;%0A
 import r
@@ -1093,16 +1093,16 @@
 r.Mono;%0A
-
 %0A/**%0A * 
@@ -1423,24 +1423,23 @@
 in) %7B%0A%09%09
-Security
+Default
 WebFilte
@@ -1464,604 +1464,87 @@
 new 
-SecurityWebFilterChain(chain, filters.iterator());%0A%09%09return delegate.filter(exchange);%0A%09%7D%0A%0A%09static class SecurityWebFilterChain implements WebFilterChain %7B%0A%09%09private final WebFilterChain delegate;%0A%09%09private final Iterator%3CWebFilter%3E filters;%0A%0A%09%09public SecurityWebFilterChain(WebFilterChain delegate, Iterator%3CWebFilter%3E filters) %7B%0A%09%09%09super();%0A%09%09%09this.delegate = delegate;%0A%09%09%09this.filters = filters;%0A%09%09%7D%0A%0A%09%09@Override%0A%09%09public Mono%3CVoid%3E filter(ServerWebExchange exchange) %7B%0A%09%09%09if (filters.hasNext()) %7B%0A%09%09%09%09WebFilter filter = filters.next();%0A%09%09%09%09return filter.filter(exchange, thi
+DefaultWebFilterChain(new FilteringWebHandler(e -%3E chain.filter(e), filter
 s)
+)
 ;%0A
-%09%09%09%7D else %7B%0A%09%09
 %09%09re
@@ -1579,18 +1579,8 @@
 e);%0A
-%09%09%09%7D%0A%09%09%7D%0A%0A
 %09%7D%0A%7D

Delete SecurityWebFilterChain in favor of DefaultWebFilterChain