From 3baf4746ae1bdfca06939b894a2c25b731ba967f Mon Sep 17 00:00:00 2001 From: Jan Thewess Date: Mon, 28 Sep 2020 22:26:21 +0200 Subject: [PATCH] Fixes #25829 by changing the check away from instanceof. Now checking if the request has parts. If this is the case we extract them otherwise use getFile(). Test is added for verification. --- .../RequestPartServletServerHttpRequest.java | 12 +++++++++-- ...uestPartServletServerHttpRequestTests.java | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) 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); + } + }