diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequest.java index 901c7a6328a7..72f2f0cfcf61 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequest.java @@ -20,8 +20,10 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; - +import java.util.Collection; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.Part; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -81,7 +83,13 @@ public HttpHeaders getHeaders() { @Override public InputStream getBody() throws IOException { - if (this.multipartRequest instanceof StandardMultipartHttpServletRequest) { + Collection parts = null; + try { + parts = this.multipartRequest.getParts(); + } catch (ServletException e) { + //ignoring this as it might be a non multipart/form-data Content-Type + } + if (parts != null && !parts.isEmpty()) { try { return this.multipartRequest.getPart(this.partName).getInputStream(); } diff --git a/spring-web/src/test/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequestTests.java b/spring-web/src/test/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequestTests.java index 9c47afeb679c..4cf08092e12b 100644 --- a/spring-web/src/test/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequestTests.java +++ b/spring-web/src/test/java/org/springframework/web/multipart/support/RequestPartServletServerHttpRequestTests.java @@ -22,6 +22,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.catalina.Server; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; @@ -32,6 +33,7 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.testfixture.servlet.MockMultipartFile; import org.springframework.web.testfixture.servlet.MockMultipartHttpServletRequest; +import org.springframework.web.testfixture.servlet.MockPart; import static org.assertj.core.api.Assertions.assertThat; @@ -137,4 +139,23 @@ public HttpHeaders getMultipartHeaders(String paramOrFileName) { assertThat(result).isEqualTo(bytes); } + @Test //#25829 + public void getBodyViaRequestPart() throws Exception { + MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest() { + @Override + public HttpHeaders getMultipartHeaders(String paramOrFileName) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return headers; + } + }; + byte[] bytes = "Hello".getBytes(); + MockPart mockPart = new MockPart("part", bytes); + mockPart.getHeaders().setContentType(MediaType.TEXT_PLAIN); + mockRequest.addPart(mockPart); + ServerHttpRequest request = new RequestPartServletServerHttpRequest(mockRequest, "part"); + byte[] result = FileCopyUtils.copyToByteArray(request.getBody()); + assertThat(result).isEqualTo(bytes); + } + }