diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java b/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java index b4957970a5d..9ac40eb9e20 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java @@ -84,8 +84,8 @@ public class WebExchangeDataBinder extends WebDataBinder { } /** - * Protected method to obtain the values for data binding. By default this - * method delegates to {@link #extractValuesToBind(ServerWebExchange)}. + * Obtain the values for data binding. By default, this delegates to + * {@link #extractValuesToBind(ServerWebExchange)}. * @param exchange the current exchange * @return a map of bind values * @since 5.3 diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java b/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java index d10616e6b64..0756cc8b58f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 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. @@ -18,14 +18,11 @@ package org.springframework.web.reactive; import java.util.Collections; import java.util.Map; -import java.util.TreeMap; import reactor.core.publisher.Mono; -import org.springframework.http.codec.multipart.Part; import org.springframework.lang.Nullable; import org.springframework.ui.Model; -import org.springframework.util.MultiValueMap; import org.springframework.validation.support.BindingAwareConcurrentModel; import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.bind.support.WebExchangeDataBinder; @@ -127,21 +124,9 @@ public class BindingContext { @Override public Mono> getValuesToBind(ServerWebExchange exchange) { - Map vars = exchange.getAttributeOrDefault( - HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, Collections.emptyMap()); - MultiValueMap queryParams = exchange.getRequest().getQueryParams(); - Mono> formData = exchange.getFormData(); - Mono> multipartData = exchange.getMultipartData(); - - return Mono.zip(Mono.just(vars), Mono.just(queryParams), formData, multipartData) - .map(tuple -> { - Map result = new TreeMap<>(); - tuple.getT1().forEach(result::put); - tuple.getT2().forEach((key, values) -> addBindValue(result, key, values)); - tuple.getT3().forEach((key, values) -> addBindValue(result, key, values)); - tuple.getT4().forEach((key, values) -> addBindValue(result, key, values)); - return result; - }); + return super.getValuesToBind(exchange).doOnNext(map -> + map.putAll(exchange.>getAttributeOrDefault( + HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, Collections.emptyMap()))); } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/JettyWebSocketClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/JettyWebSocketClient.java index b95b7728bcf..f7782aa552d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/JettyWebSocketClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/JettyWebSocketClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -164,7 +164,7 @@ public class JettyWebSocketClient implements WebSocketClient, Lifecycle { private HandshakeInfo createHandshakeInfo(URI url, Session jettySession) { HttpHeaders headers = new HttpHeaders(); - jettySession.getUpgradeResponse().getHeaders().forEach(headers::put); + headers.putAll(jettySession.getUpgradeResponse().getHeaders()); String protocol = headers.getFirst("Sec-WebSocket-Protocol"); return new HandshakeInfo(url, headers, Mono.empty(), protocol); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/StandardWebSocketClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/StandardWebSocketClient.java index 39b61505a19..74e01b480ee 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/StandardWebSocketClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/StandardWebSocketClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 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. @@ -170,7 +170,7 @@ public class StandardWebSocketClient implements WebSocketClient { @Override public void afterResponse(HandshakeResponse response) { - response.getHeaders().forEach(this.responseHeaders::put); + this.responseHeaders.putAll(response.getHeaders()); } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/UndertowWebSocketClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/UndertowWebSocketClient.java index 272e04f345d..e8280c84b44 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/UndertowWebSocketClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/UndertowWebSocketClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 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. @@ -243,7 +243,7 @@ public class UndertowWebSocketClient implements WebSocketClient { @Override public void beforeRequest(Map> headers) { - this.requestHeaders.forEach(headers::put); + headers.putAll(this.requestHeaders); if (this.delegate != null) { this.delegate.beforeRequest(headers); } @@ -251,7 +251,7 @@ public class UndertowWebSocketClient implements WebSocketClient { @Override public void afterRequest(Map> headers) { - headers.forEach(this.responseHeaders::put); + this.responseHeaders.putAll(headers); if (this.delegate != null) { this.delegate.afterRequest(headers); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java index de8ad303d94..34b4aedda6d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java @@ -975,7 +975,8 @@ public class DispatcherServlet extends FrameworkServlet { private void logRequest(HttpServletRequest request) { LogFormatUtils.traceDebug(logger, traceOn -> { String params; - if (StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/")) { + String contentType = request.getContentType(); + if (StringUtils.startsWithIgnoreCase(contentType, "multipart/")) { params = "multipart"; } else if (isEnableLoggingRequestDetails()) { @@ -984,7 +985,9 @@ public class DispatcherServlet extends FrameworkServlet { .collect(Collectors.joining(", ")); } else { - params = (request.getParameterMap().isEmpty() ? "" : "masked"); + // Avoid request body parsing for form data + params = (StringUtils.startsWithIgnoreCase(contentType, "application/x-www-form-urlencoded") || + !request.getParameterMap().isEmpty() ? "masked" : ""); } String queryString = request.getQueryString();