Skip to content

Commit a15a726

Browse files
Frederik Bosterrstoyanchev
authored andcommitted
Improve getMultipartContentType in mock request.
See gh-24074
1 parent 47779df commit a15a726

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616

1717
package org.springframework.mock.web;
1818

19+
import java.io.IOException;
1920
import java.util.Collections;
2021
import java.util.Enumeration;
2122
import java.util.Iterator;
2223
import java.util.List;
2324
import java.util.Map;
2425

2526
import javax.servlet.ServletContext;
27+
import javax.servlet.ServletException;
28+
import javax.servlet.http.Part;
2629

2730
import org.springframework.http.HttpHeaders;
2831
import org.springframework.http.HttpMethod;
@@ -121,9 +124,17 @@ public String getMultipartContentType(String paramOrFileName) {
121124
if (file != null) {
122125
return file.getContentType();
123126
}
124-
else {
125-
return null;
127+
128+
try {
129+
Part part = getPart(paramOrFileName);
130+
if (part != null) {
131+
return part.getContentType();
132+
}
133+
} catch (ServletException | IOException e) {
134+
throw new IllegalStateException("Cannot extract content type from multipart request.", e);
126135
}
136+
137+
return null;
127138
}
128139

129140
@Override

spring-test/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequestTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import org.junit.jupiter.api.Test;
2929

30+
import org.springframework.http.HttpHeaders;
31+
import org.springframework.http.MediaType;
3032
import org.springframework.util.FileCopyUtils;
3133
import org.springframework.util.ObjectUtils;
3234
import org.springframework.web.multipart.MultipartFile;
@@ -61,6 +63,24 @@ void mockMultipartHttpServletRequestWithInputStream() throws IOException {
6163
doTestMultipartHttpServletRequest(request);
6264
}
6365

66+
@Test
67+
void mockMultiPartHttpServletRequestWithMixedData() {
68+
MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();
69+
request.addFile(new MockMultipartFile("file", "myOrigFilename", MediaType.TEXT_PLAIN_VALUE, "myContent2".getBytes()));
70+
71+
MockPart metadataPart = new MockPart("metadata", "{\"foo\": \"bar\"}".getBytes());
72+
metadataPart.getHeaders().setContentType(MediaType.APPLICATION_JSON);
73+
request.addPart(metadataPart);
74+
75+
HttpHeaders fileHttpHeaders = request.getMultipartHeaders("file");
76+
assertThat(fileHttpHeaders).isNotNull();
77+
assertThat(fileHttpHeaders.getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
78+
79+
HttpHeaders dataHttpHeaders = request.getMultipartHeaders("metadata");
80+
assertThat(dataHttpHeaders).isNotNull();
81+
assertThat(dataHttpHeaders.getContentType()).isEqualTo(MediaType.APPLICATION_JSON);
82+
}
83+
6484
private void doTestMultipartHttpServletRequest(MultipartHttpServletRequest request) throws IOException {
6585
Set<String> fileNames = new HashSet<>();
6686
Iterator<String> fileIter = request.getFileNames();

0 commit comments

Comments
 (0)