Make HtmlUnitRequestBuilder handle form data file properly

See gh-18551
This commit is contained in:
Evgenii Koba
2020-04-18 14:48:01 +10:00
committed by Rossen Stoyanchev
parent 04bbc2ac2b
commit e15ed44a68
3 changed files with 47 additions and 1 deletions

View File

@@ -16,11 +16,14 @@
package org.springframework.test.web.servlet.htmlunit;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
@@ -39,6 +42,7 @@ import com.gargoylesoftware.htmlunit.CookieManager;
import com.gargoylesoftware.htmlunit.FormEncodingType;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.util.KeyDataPair;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
import org.springframework.beans.Mergeable;
@@ -46,6 +50,7 @@ import org.springframework.http.MediaType;
import org.springframework.lang.Nullable;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.mock.web.MockPart;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.SmartRequestBuilder;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
@@ -365,7 +370,16 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
});
});
for (NameValuePair param : this.webRequest.getRequestParameters()) {
request.addParameter(param.getName(), param.getValue());
if (param instanceof KeyDataPair) {
KeyDataPair fileParam = (KeyDataPair) param;
File file = fileParam.getFile();
MockPart part = new MockPart(fileParam.getName(), file.getName(), readAllBytes(file));
part.getHeaders().setContentType(MediaType.valueOf(fileParam.getMimeType()));
request.addPart(part);
}
else {
request.addParameter(param.getName(), param.getValue());
}
}
}
@@ -378,6 +392,15 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
}
}
private byte[] readAllBytes(File file) {
try {
return Files.readAllBytes(file.toPath());
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
private void servletPath(MockHttpServletRequest request, String requestPath) {
String servletPath = requestPath.substring(request.getContextPath().length());
request.setServletPath(servletPath);