|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2020 the original author or authors. |
| 2 | + * Copyright 2002-2021 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
17 | 17 | package org.springframework.test.web.servlet.request;
|
18 | 18 |
|
19 | 19 | import java.io.IOException;
|
| 20 | +import java.io.InputStream; |
20 | 21 | import java.io.InputStreamReader;
|
21 | 22 | import java.net.URI;
|
22 | 23 | import java.nio.charset.Charset;
|
|
38 | 39 | import org.springframework.util.FileCopyUtils;
|
39 | 40 | import org.springframework.util.LinkedMultiValueMap;
|
40 | 41 | import org.springframework.util.MultiValueMap;
|
41 |
| -import org.springframework.web.multipart.MultipartFile; |
42 | 42 |
|
43 | 43 | /**
|
44 | 44 | * Default builder for {@link MockMultipartHttpServletRequest}.
|
@@ -144,47 +144,40 @@ public Object merge(@Nullable Object parent) {
|
144 | 144 | @Override
|
145 | 145 | protected final MockHttpServletRequest createServletRequest(ServletContext servletContext) {
|
146 | 146 | MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest(servletContext);
|
| 147 | + Charset defaultCharset = (request.getCharacterEncoding() != null ? |
| 148 | + Charset.forName(request.getCharacterEncoding()) : StandardCharsets.UTF_8); |
| 149 | + |
147 | 150 | this.files.forEach(request::addFile);
|
148 | 151 | this.parts.values().stream().flatMap(Collection::stream).forEach(part -> {
|
149 | 152 | request.addPart(part);
|
150 | 153 | try {
|
151 |
| - MultipartFile file = asMultipartFile(part); |
152 |
| - if (file != null) { |
153 |
| - request.addFile(file); |
154 |
| - return; |
| 154 | + String name = part.getName(); |
| 155 | + String filename = part.getSubmittedFileName(); |
| 156 | + InputStream is = part.getInputStream(); |
| 157 | + if (filename != null) { |
| 158 | + request.addFile(new MockMultipartFile(name, filename, part.getContentType(), is)); |
155 | 159 | }
|
156 |
| - String value = toParameterValue(part); |
157 |
| - if (value != null) { |
158 |
| - request.addParameter(part.getName(), toParameterValue(part)); |
| 160 | + else { |
| 161 | + InputStreamReader reader = new InputStreamReader(is, getCharsetOrDefault(part, defaultCharset)); |
| 162 | + String value = FileCopyUtils.copyToString(reader); |
| 163 | + request.addParameter(part.getName(), value); |
159 | 164 | }
|
160 | 165 | }
|
161 | 166 | catch (IOException ex) {
|
162 | 167 | throw new IllegalStateException("Failed to read content for part " + part.getName(), ex);
|
163 | 168 | }
|
164 | 169 | });
|
165 |
| - return request; |
166 |
| - } |
167 | 170 |
|
168 |
| - @Nullable |
169 |
| - private MultipartFile asMultipartFile(Part part) throws IOException { |
170 |
| - String name = part.getName(); |
171 |
| - String filename = part.getSubmittedFileName(); |
172 |
| - if (filename != null) { |
173 |
| - return new MockMultipartFile(name, filename, part.getContentType(), part.getInputStream()); |
174 |
| - } |
175 |
| - return null; |
| 171 | + return request; |
176 | 172 | }
|
177 | 173 |
|
178 |
| - @Nullable |
179 |
| - private String toParameterValue(Part part) throws IOException { |
180 |
| - String rawType = part.getContentType(); |
181 |
| - MediaType mediaType = (rawType != null ? MediaType.parseMediaType(rawType) : MediaType.TEXT_PLAIN); |
182 |
| - if (!mediaType.isCompatibleWith(MediaType.TEXT_PLAIN)) { |
183 |
| - return null; |
| 174 | + private Charset getCharsetOrDefault(Part part, Charset defaultCharset) { |
| 175 | + if (part.getContentType() != null) { |
| 176 | + MediaType mediaType = MediaType.parseMediaType(part.getContentType()); |
| 177 | + if (mediaType.getCharset() != null) { |
| 178 | + return mediaType.getCharset(); |
| 179 | + } |
184 | 180 | }
|
185 |
| - Charset charset = (mediaType.getCharset() != null ? mediaType.getCharset() : StandardCharsets.UTF_8); |
186 |
| - InputStreamReader reader = new InputStreamReader(part.getInputStream(), charset); |
187 |
| - return FileCopyUtils.copyToString(reader); |
| 181 | + return defaultCharset; |
188 | 182 | }
|
189 |
| - |
190 | 183 | }
|
0 commit comments