diff --git a/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java b/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java index bdd01bba656..c1f758c7e77 100644 --- a/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java +++ b/spring-web/src/main/java/org/springframework/web/server/ServerWebExchange.java @@ -146,7 +146,15 @@ public interface ServerWebExchange { * @since 6.0.10 * @see Part#delete() */ - Mono cleanupMultipart(); + default Mono cleanupMultipart() { + return getMultipartData() + .onErrorResume(t -> Mono.empty()) // ignore errors reading multipart data + .flatMapIterable(Map::values) + .flatMapIterable(Function.identity()) + .flatMap(part -> part.delete() + .onErrorResume(ex -> Mono.empty())) + .then(); + } /** * Return the {@link LocaleContext} using the configured diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java index 3cf12536f8e..a97fbd90256 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java @@ -324,30 +324,28 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { private final Mono> multipartDataMono; - private volatile boolean multipartRead = false; - - DelegatingServerWebExchange(ServerHttpRequest request, Map attributes, ServerWebExchange delegate, List> messageReaders) { this.request = request; this.attributes = attributes; this.delegate = delegate; - this.formDataMono = initFormData(messageReaders); + this.formDataMono = initFormData(request, messageReaders); this.multipartDataMono = initMultipartData(request, messageReaders); } @SuppressWarnings("unchecked") - private Mono> initFormData(List> readers) { + private static Mono> initFormData(ServerHttpRequest request, + List> readers) { + try { - MediaType contentType = this.request.getHeaders().getContentType(); + MediaType contentType = request.getHeaders().getContentType(); if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(contentType)) { return ((HttpMessageReader>) readers.stream() .filter(reader -> reader.canRead(FORM_DATA_TYPE, MediaType.APPLICATION_FORM_URLENCODED)) .findFirst() .orElseThrow(() -> new IllegalStateException("No form data HttpMessageReader."))) - .readMono(FORM_DATA_TYPE, this.request, Hints.none()) - .doOnNext(ignored -> this.multipartRead = true) + .readMono(FORM_DATA_TYPE, request, Hints.none()) .switchIfEmpty(EMPTY_FORM_DATA) .cache(); } @@ -400,23 +398,7 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { return this.multipartDataMono; } - @Override - public Mono cleanupMultipart() { - if (this.multipartRead) { - return getMultipartData() - .onErrorResume(t -> Mono.empty()) // ignore errors reading multipart data - .flatMapIterable(Map::values) - .flatMapIterable(Function.identity()) - .flatMap(part -> part.delete() - .onErrorResume(ex -> Mono.empty())) - .then(); - } - else { - return Mono.empty(); - } - } - - // Delegating methods + // Delegating methods @Override public ServerHttpResponse getResponse() {