Skip to content

Commit e15ed44

Browse files
kobaeugenearstoyanchev
authored andcommitted
Make HtmlUnitRequestBuilder handle form data file properly
See gh-18551
1 parent 04bbc2a commit e15ed44

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616

1717
package org.springframework.test.web.servlet.htmlunit;
1818

19+
import java.io.File;
20+
import java.io.IOException;
1921
import java.io.UnsupportedEncodingException;
2022
import java.net.URL;
2123
import java.net.URLDecoder;
2224
import java.nio.charset.Charset;
2325
import java.nio.charset.StandardCharsets;
26+
import java.nio.file.Files;
2427
import java.util.ArrayList;
2528
import java.util.Collections;
2629
import java.util.Enumeration;
@@ -39,13 +42,15 @@
3942
import com.gargoylesoftware.htmlunit.FormEncodingType;
4043
import com.gargoylesoftware.htmlunit.WebClient;
4144
import com.gargoylesoftware.htmlunit.WebRequest;
45+
import com.gargoylesoftware.htmlunit.util.KeyDataPair;
4246
import com.gargoylesoftware.htmlunit.util.NameValuePair;
4347

4448
import org.springframework.beans.Mergeable;
4549
import org.springframework.http.MediaType;
4650
import org.springframework.lang.Nullable;
4751
import org.springframework.mock.web.MockHttpServletRequest;
4852
import org.springframework.mock.web.MockHttpSession;
53+
import org.springframework.mock.web.MockPart;
4954
import org.springframework.test.web.servlet.RequestBuilder;
5055
import org.springframework.test.web.servlet.SmartRequestBuilder;
5156
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -365,7 +370,16 @@ private void params(MockHttpServletRequest request, UriComponents uriComponents)
365370
});
366371
});
367372
for (NameValuePair param : this.webRequest.getRequestParameters()) {
368-
request.addParameter(param.getName(), param.getValue());
373+
if (param instanceof KeyDataPair) {
374+
KeyDataPair fileParam = (KeyDataPair) param;
375+
File file = fileParam.getFile();
376+
MockPart part = new MockPart(fileParam.getName(), file.getName(), readAllBytes(file));
377+
part.getHeaders().setContentType(MediaType.valueOf(fileParam.getMimeType()));
378+
request.addPart(part);
379+
}
380+
else {
381+
request.addParameter(param.getName(), param.getValue());
382+
}
369383
}
370384
}
371385

@@ -378,6 +392,15 @@ private String urlDecode(String value) {
378392
}
379393
}
380394

395+
private byte[] readAllBytes(File file) {
396+
try {
397+
return Files.readAllBytes(file.toPath());
398+
}
399+
catch (IOException ex) {
400+
throw new IllegalStateException(ex);
401+
}
402+
}
403+
381404
private void servletPath(MockHttpServletRequest request, String requestPath) {
382405
String servletPath = requestPath.substring(request.getContextPath().length());
383406
request.setServletPath(servletPath);

spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.test.web.servlet.htmlunit;
1818

19+
import java.io.File;
1920
import java.net.MalformedURLException;
2021
import java.net.URL;
2122
import java.nio.charset.StandardCharsets;
@@ -28,17 +29,21 @@
2829
import javax.servlet.ServletContext;
2930
import javax.servlet.http.Cookie;
3031
import javax.servlet.http.HttpSession;
32+
import javax.servlet.http.Part;
3133

3234
import com.gargoylesoftware.htmlunit.FormEncodingType;
3335
import com.gargoylesoftware.htmlunit.HttpMethod;
3436
import com.gargoylesoftware.htmlunit.WebClient;
3537
import com.gargoylesoftware.htmlunit.WebRequest;
38+
import com.gargoylesoftware.htmlunit.util.KeyDataPair;
39+
import com.gargoylesoftware.htmlunit.util.MimeType;
3640
import com.gargoylesoftware.htmlunit.util.NameValuePair;
3741
import org.apache.commons.io.IOUtils;
3842
import org.apache.http.auth.UsernamePasswordCredentials;
3943
import org.junit.jupiter.api.BeforeEach;
4044
import org.junit.jupiter.api.Test;
4145

46+
import org.springframework.core.io.ClassPathResource;
4247
import org.springframework.mock.web.MockHttpServletRequest;
4348
import org.springframework.mock.web.MockHttpSession;
4449
import org.springframework.mock.web.MockServletContext;
@@ -418,6 +423,23 @@ public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithMult
418423
assertThat(actualRequest.getParameter("name2")).isEqualTo("value2");
419424
}
420425

426+
@Test
427+
public void buildRequestParameterMapViaWebRequestDotSetFileToUploadAsParameter() throws Exception {
428+
File fileToUpload = new ClassPathResource("org/springframework/test/web/htmlunit/test.txt").getFile();
429+
webRequest.setRequestParameters(Arrays.asList(new KeyDataPair(
430+
"key", fileToUpload, "test.txt", MimeType.TEXT_PLAIN, StandardCharsets.UTF_8)));
431+
432+
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
433+
434+
assertThat(actualRequest.getParts().size()).isEqualTo(1);
435+
Part part = actualRequest.getPart("key");
436+
assertThat(part).isNotNull();
437+
assertThat(part.getName()).isEqualTo("key");
438+
assertThat(IOUtils.toString(part.getInputStream(), StandardCharsets.UTF_8)).isEqualTo("test file");
439+
assertThat(part.getSubmittedFileName()).isEqualTo("test.txt");
440+
assertThat(part.getContentType()).isEqualTo(MimeType.TEXT_PLAIN);
441+
}
442+
421443
@Test
422444
public void buildRequestParameterMapFromSingleQueryParam() throws Exception {
423445
webRequest.setUrl(new URL("https://example.com/example/?name=value"));
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test file

0 commit comments

Comments
 (0)