From 32d4517c982c7b1899fc2b2a3456af5e43909a46 Mon Sep 17 00:00:00 2001 From: Frederik Boster Date: Mon, 25 Nov 2019 15:01:24 +0100 Subject: [PATCH 1/2] Add test to multipart request mock for non-file parts. --- .../MockMultipartHttpServletRequestTests.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequestTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequestTests.java index 96fc17a33cc4..5b1a0ec44f72 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequestTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequestTests.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Test; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.util.FileCopyUtils; import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; @@ -61,6 +63,24 @@ void mockMultipartHttpServletRequestWithInputStream() throws IOException { doTestMultipartHttpServletRequest(request); } + @Test + void mockMultiPartHttpServletRequestWithMixedData() { + MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest(); + request.addFile(new MockMultipartFile("file", "myOrigFilename", MediaType.TEXT_PLAIN_VALUE, "myContent2".getBytes())); + + MockPart metadataPart = new MockPart("metadata", "{\"foo\": \"bar\"}".getBytes()); + metadataPart.getHeaders().setContentType(MediaType.APPLICATION_JSON); + request.addPart(metadataPart); + + HttpHeaders fileHttpHeaders = request.getMultipartHeaders("file"); + assertThat(fileHttpHeaders).isNotNull(); + assertThat(fileHttpHeaders.getContentType()).isEqualTo(MediaType.TEXT_PLAIN); + + HttpHeaders dataHttpHeaders = request.getMultipartHeaders("metadata"); + assertThat(dataHttpHeaders).isNotNull(); + assertThat(dataHttpHeaders.getContentType()).isEqualTo(MediaType.APPLICATION_JSON); + } + private void doTestMultipartHttpServletRequest(MultipartHttpServletRequest request) throws IOException { Set fileNames = new HashSet<>(); Iterator fileIter = request.getFileNames(); From fdc69e89a8776fc5e114a21167da0bfaa892c34f Mon Sep 17 00:00:00 2001 From: Frederik Boster Date: Mon, 25 Nov 2019 15:02:13 +0100 Subject: [PATCH 2/2] Fix determination of content type in multipart request mock. --- .../mock/web/MockMultipartHttpServletRequest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java index 935d66aee71e..e118497c19c7 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java @@ -16,6 +16,7 @@ package org.springframework.mock.web; +import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; @@ -23,6 +24,8 @@ import java.util.Map; import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.Part; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -121,9 +124,17 @@ public String getMultipartContentType(String paramOrFileName) { if (file != null) { return file.getContentType(); } - else { - return null; + + try { + Part part = getPart(paramOrFileName); + if (part != null) { + return part.getContentType(); + } + } catch (ServletException | IOException e) { + throw new IllegalStateException("Cannot extract content type from multipart request.", e); } + + return null; } @Override