diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java b/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java index a7830bff26..93a2fbf447 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java @@ -147,11 +147,11 @@ public class DefaultServerWebExchange implements ServerWebExchange { ServerCodecConfigurer configurer, String logPrefix) { MediaType contentType = getContentType(request); - if (contentType == null || !contentType.isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED)) { + if (contentType == null || !contentType.isConcrete() || !contentType.isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED)) { return EMPTY_FORM_DATA; } - HttpMessageReader> reader = getReader(configurer, MediaType.APPLICATION_FORM_URLENCODED, FORM_DATA_TYPE); + HttpMessageReader> reader = getReader(configurer, contentType, FORM_DATA_TYPE); if (reader == null) { return Mono.error(new IllegalStateException("No HttpMessageReader for " + contentType)); } @@ -165,7 +165,7 @@ public class DefaultServerWebExchange implements ServerWebExchange { private Mono> initMultipartData(ServerCodecConfigurer configurer, String logPrefix) { MediaType contentType = getContentType(this.request); - if (contentType == null || !contentType.getType().equalsIgnoreCase("multipart")) { + if (contentType == null || !contentType.isConcrete() || !contentType.getType().equalsIgnoreCase("multipart")) { return EMPTY_MULTIPART_DATA; } diff --git a/spring-web/src/test/java/org/springframework/web/server/adapter/DefaultServerWebExchangeTests.java b/spring-web/src/test/java/org/springframework/web/server/adapter/DefaultServerWebExchangeTests.java index 077d22df62..728eb511a4 100644 --- a/spring-web/src/test/java/org/springframework/web/server/adapter/DefaultServerWebExchangeTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/adapter/DefaultServerWebExchangeTests.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.http.codec.multipart.Part; import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver; @@ -60,14 +61,25 @@ class DefaultServerWebExchangeTests { } @Test // gh-34660 - void useFormDataMessageReaderWhenAllContentType() { + void shouldNotDecodeFormDataWhenContentTypeNotConcrete() { MockServerHttpRequest request = MockServerHttpRequest .post("https://example.com") .header(HttpHeaders.CONTENT_TYPE, MediaType.ALL_VALUE) .body("project=spring"); ServerWebExchange exchange = createExchange(request); MultiValueMap body = exchange.getFormData().block(); - assertThat(body.get("project")).contains("spring"); + assertThat(body).isEmpty(); + } + + @Test // gh-34660 + void shouldNotDecodeMultipartWhenContentTypeNotConcrete() { + MockServerHttpRequest request = MockServerHttpRequest + .post("https://example.com") + .header(HttpHeaders.CONTENT_TYPE, "multipart/*") + .body("project=spring"); + ServerWebExchange exchange = createExchange(request); + MultiValueMap body = exchange.getMultipartData().block(); + assertThat(body).isEmpty(); }