From 1260081436aa11ff22ddd10bbbd46a2988b2f843 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 14 Nov 2025 16:34:15 +0100 Subject: [PATCH] Add WebClient integration test for multipart This commit adds an integration test for `WebClient`, specifically testing that a failure happening while pulishing the request body is reported on the main reactive pipeline. See gh-35678 --- .../client/WebClientIntegrationTests.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java index e870c28a6eb..a9636790a71 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java @@ -71,12 +71,14 @@ import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; import org.springframework.http.ResponseCookie; import org.springframework.http.ResponseEntity; +import org.springframework.http.client.MultipartBodyBuilder; import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.HttpComponentsClientHttpConnector; import org.springframework.http.client.reactive.JdkClientHttpConnector; import org.springframework.http.client.reactive.JettyClientHttpConnector; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.BodyExtractors; +import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient.ResponseSpec; import org.springframework.web.testfixture.xml.Pojo; @@ -1320,6 +1322,34 @@ class WebClientIntegrationTests { .verify(Duration.ofSeconds(3)); } + @ParameterizedWebClientTest + void failWhileSendingMultipartRequest(ClientHttpConnector connector) throws IOException { + startServer(connector); + prepareResponse(response -> response + .setHeader("Content-Type", "text/plain").body("Hello")); + + MultipartBodyBuilder data = new MultipartBodyBuilder(); + data.part("first", "success"); + data.asyncPart("second", + Mono.delay(Duration.ofMillis(500)).then(Mono.error(new IllegalStateException("multipart client error"))), + String.class); + + Mono> result = this.webClient.post() + .uri("/multipart").accept(MediaType.TEXT_PLAIN) + .body(BodyInserters.fromMultipartData(data.build())) + .retrieve() + .toEntity(String.class) + .log(); + + StepVerifier.create(result) + .expectErrorSatisfies(error -> assertThat(error) + .isInstanceOf(WebClientRequestException.class) + .hasMessageContaining("multipart client error")) + .verify(Duration.ofSeconds(5)); + + expectRequestCount(0); + } + private Mono doMalformedChunkedResponseTest( ClientHttpConnector connector, Function> handler) {