Revisit request parameters access with HtmlUnit

Prior to this commit, the `HtmlUnitRequestBuilder` would "translate"
HtmlUnit web requests into Servlet requests using APIs that were not
clearly defined and meant for internal usage.

HtmlUnit 2.64.0 introduced a new `.getParameters()` API for collecting
`NameValuePair` parsed from the request URI or request body, depending
on the nature of the request. This arrangement is much more stable and
in line with HtmlUnit's expectations.

This commit uses this new API and makes HtmlUnit 2.64.0 a new minimum
requirement for using HtmlUnit integration with Spring Framework.
This also removes tests that were previously testing HtmlUnit's behavior
and using the API now marked as internal.

Closes gh-28240
This commit is contained in:
Brian Clozel 2022-09-06 13:35:58 +02:00
parent 10ade235e3
commit dd1e6b9412
4 changed files with 126 additions and 259 deletions

View File

@ -83,7 +83,7 @@ dependencies {
api("jaxen:jaxen:1.2.0")
api("junit:junit:4.13.2")
api("net.sf.jopt-simple:jopt-simple:5.0.4")
api("net.sourceforge.htmlunit:htmlunit:2.63.0")
api("net.sourceforge.htmlunit:htmlunit:2.64.0")
api("org.apache-extras.beanshell:bsh:2.0b6")
api("org.apache.activemq:activemq-broker:5.16.2")
api("org.apache.activemq:activemq-kahadb-store:5.16.2")

View File

@ -18,7 +18,6 @@ package org.springframework.test.web.servlet.htmlunit;
import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
@ -159,7 +158,7 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
cookies(request);
this.webRequest.getAdditionalHeaders().forEach(request::addHeader);
locales(request);
params(request, uri);
params(request);
request.setQueryString(uri.getQuery());
return postProcess(request);
@ -364,42 +363,36 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
}
}
private void params(MockHttpServletRequest request, UriComponents uriComponents) {
uriComponents.getQueryParams().forEach((name, values) -> {
String urlDecodedName = urlDecode(name);
values.forEach(value -> {
value = (value != null ? urlDecode(value) : "");
request.addParameter(urlDecodedName, value);
});
});
for (NameValuePair param : this.webRequest.getRequestParameters()) {
if (param instanceof KeyDataPair pair) {
File file = pair.getFile();
MockPart part;
if (file != null) {
part = new MockPart(pair.getName(), file.getName(), readAllBytes(file));
}
else {
// Support empty file upload OR file upload via setData().
// For an empty file upload, getValue() returns an empty string, and
// getData() returns null.
// For a file upload via setData(), getData() returns the file data, and
// getValue() returns the file name (if set) or an empty string.
part = new MockPart(pair.getName(), pair.getValue(), pair.getData());
}
MediaType mediaType = (pair.getMimeType() != null ? MediaType.valueOf(pair.getMimeType()) :
MediaType.APPLICATION_OCTET_STREAM);
part.getHeaders().setContentType(mediaType);
request.addPart(part);
}
else {
request.addParameter(param.getName(), param.getValue());
}
private void params(MockHttpServletRequest request) {
for (NameValuePair param : this.webRequest.getParameters()) {
addRequestParameter(request, param);
}
}
private String urlDecode(String value) {
return URLDecoder.decode(value, StandardCharsets.UTF_8);
private void addRequestParameter(MockHttpServletRequest request, NameValuePair param) {
if (param instanceof KeyDataPair) {
KeyDataPair pair = (KeyDataPair) param;
File file = pair.getFile();
MockPart part;
if (file != null) {
part = new MockPart(pair.getName(), file.getName(), readAllBytes(file));
}
else {
// Support empty file upload OR file upload via setData().
// For an empty file upload, getValue() returns an empty string, and
// getData() returns null.
// For a file upload via setData(), getData() returns the file data, and
// getValue() returns the file name (if set) or an empty string.
part = new MockPart(pair.getName(), pair.getValue(), pair.getData());
}
MediaType mediaType = (pair.getMimeType() != null ? MediaType.valueOf(pair.getMimeType()) :
MediaType.APPLICATION_OCTET_STREAM);
part.getHeaders().setContentType(mediaType);
request.addPart(part);
}
else {
request.addParameter(param.getName(), param.getValue());
}
}
private byte[] readAllBytes(File file) {

View File

@ -16,13 +16,9 @@
package org.springframework.test.web.servlet.htmlunit;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
@ -32,19 +28,14 @@ import com.gargoylesoftware.htmlunit.FormEncodingType;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.util.KeyDataPair;
import com.gargoylesoftware.htmlunit.util.MimeType;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpSession;
import jakarta.servlet.http.Part;
import org.apache.commons.io.IOUtils;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.mock.web.MockServletContext;
@ -54,7 +45,6 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.assertj.core.api.SoftAssertions.assertSoftly;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
/**
@ -78,7 +68,7 @@ public class HtmlUnitRequestBuilderTests {
@BeforeEach
public void setup() throws Exception {
void setup() throws Exception {
webRequest = new WebRequest(new URL("https://example.com/test/this/here"));
webRequest.setHttpMethod(HttpMethod.GET);
requestBuilder = new HtmlUnitRequestBuilder(sessions, webClient, webRequest);
@ -88,19 +78,19 @@ public class HtmlUnitRequestBuilderTests {
// --- constructor
@Test
public void constructorNullSessions() {
void constructorNullSessions() {
assertThatIllegalArgumentException().isThrownBy(() ->
new HtmlUnitRequestBuilder(null, webClient, webRequest));
}
@Test
public void constructorNullWebClient() {
void constructorNullWebClient() {
assertThatIllegalArgumentException().isThrownBy(() ->
new HtmlUnitRequestBuilder(sessions, null, webRequest));
}
@Test
public void constructorNullWebRequest() {
void constructorNullWebRequest() {
assertThatIllegalArgumentException().isThrownBy(() ->
new HtmlUnitRequestBuilder(sessions, webClient, null));
}
@ -110,7 +100,7 @@ public class HtmlUnitRequestBuilderTests {
@Test
@SuppressWarnings("deprecation")
public void buildRequestBasicAuth() {
void buildRequestBasicAuth() {
String base64Credentials = "dXNlcm5hbWU6cGFzc3dvcmQ=";
String authzHeaderValue = "Basic: " + base64Credentials;
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(base64Credentials);
@ -124,7 +114,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestCharacterEncoding() {
void buildRequestCharacterEncoding() {
webRequest.setCharset(StandardCharsets.UTF_8);
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -133,14 +123,14 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestDefaultCharacterEncoding() {
void buildRequestDefaultCharacterEncoding() {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getCharacterEncoding()).isEqualTo("ISO-8859-1");
}
@Test
public void buildRequestContentLength() {
void buildRequestContentLength() {
String content = "some content that has length";
webRequest.setHttpMethod(HttpMethod.POST);
webRequest.setRequestBody(content);
@ -151,7 +141,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestContentType() {
void buildRequestContentType() {
String contentType = "text/html;charset=UTF-8";
webRequest.setAdditionalHeader("Content-Type", contentType);
@ -162,7 +152,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test // SPR-14916
public void buildRequestContentTypeWithFormSubmission() {
void buildRequestContentTypeWithFormSubmission() {
webRequest.setEncodingType(FormEncodingType.URL_ENCODED);
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -174,14 +164,14 @@ public class HtmlUnitRequestBuilderTests {
@Test
public void buildRequestContextPathUsesFirstSegmentByDefault() {
void buildRequestContextPathUsesFirstSegmentByDefault() {
String contextPath = requestBuilder.buildRequest(servletContext).getContextPath();
assertThat(contextPath).isEqualTo("/test");
}
@Test
public void buildRequestContextPathUsesNoFirstSegmentWithDefault() throws MalformedURLException {
void buildRequestContextPathUsesNoFirstSegmentWithDefault() throws MalformedURLException {
webRequest.setUrl(new URL("https://example.com/"));
String contextPath = requestBuilder.buildRequest(servletContext).getContextPath();
@ -189,7 +179,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestContextPathInvalid() {
void buildRequestContextPathInvalid() {
requestBuilder.setContextPath("/invalid");
assertThatIllegalArgumentException().isThrownBy(() ->
@ -197,7 +187,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestContextPathEmpty() {
void buildRequestContextPathEmpty() {
String expected = "";
requestBuilder.setContextPath(expected);
@ -207,7 +197,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestContextPathExplicit() {
void buildRequestContextPathExplicit() {
String expected = "/test";
requestBuilder.setContextPath(expected);
@ -217,7 +207,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestContextPathMulti() {
void buildRequestContextPathMulti() {
String expected = "/test/this";
requestBuilder.setContextPath(expected);
@ -227,14 +217,14 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestCookiesNull() {
void buildRequestCookiesNull() {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getCookies()).isNull();
}
@Test
public void buildRequestCookiesSingle() {
void buildRequestCookiesSingle() {
webRequest.setAdditionalHeader("Cookie", "name=value");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -246,7 +236,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestCookiesMulti() {
void buildRequestCookiesMulti() {
webRequest.setAdditionalHeader("Cookie", "name=value; name2=value2");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -263,7 +253,7 @@ public class HtmlUnitRequestBuilderTests {
@Test
@SuppressWarnings("deprecation")
public void buildRequestInputStream() throws Exception {
void buildRequestInputStream() throws Exception {
String content = "some content that has length";
webRequest.setHttpMethod(HttpMethod.POST);
webRequest.setRequestBody(content);
@ -274,21 +264,21 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocalAddr() {
void buildRequestLocalAddr() {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getLocalAddr()).isEqualTo("127.0.0.1");
}
@Test
public void buildRequestLocaleDefault() {
void buildRequestLocaleDefault() {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getLocale()).isEqualTo(Locale.getDefault());
}
@Test
public void buildRequestLocaleDa() {
void buildRequestLocaleDa() {
webRequest.setAdditionalHeader("Accept-Language", "da");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -297,7 +287,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocaleEnGbQ08() {
void buildRequestLocaleEnGbQ08() {
webRequest.setAdditionalHeader("Accept-Language", "en-gb;q=0.8");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -306,7 +296,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocaleEnQ07() {
void buildRequestLocaleEnQ07() {
webRequest.setAdditionalHeader("Accept-Language", "en");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -315,7 +305,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocaleEnUs() {
void buildRequestLocaleEnUs() {
webRequest.setAdditionalHeader("Accept-Language", "en-US");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -324,7 +314,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocaleFr() {
void buildRequestLocaleFr() {
webRequest.setAdditionalHeader("Accept-Language", "fr");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -333,7 +323,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocaleMulti() {
void buildRequestLocaleMulti() {
webRequest.setAdditionalHeader("Accept-Language", "en-gb;q=0.8, da, en;q=0.7");
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -343,14 +333,14 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocalName() {
void buildRequestLocalName() {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getLocalName()).isEqualTo("localhost");
}
@Test
public void buildRequestLocalPort() throws Exception {
void buildRequestLocalPort() throws Exception {
webRequest.setUrl(new URL("http://localhost:80/test/this/here"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -358,7 +348,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestLocalMissing() throws Exception {
void buildRequestLocalMissing() throws Exception {
webRequest.setUrl(new URL("http://localhost/test/this"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -366,7 +356,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestMethods() {
void buildRequestMethods() {
for (HttpMethod expectedMethod : HttpMethod.values()) {
webRequest.setHttpMethod(expectedMethod);
String actualMethod = requestBuilder.buildRequest(servletContext).getMethod();
@ -374,159 +364,41 @@ public class HtmlUnitRequestBuilderTests {
}
}
@Test
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithSingleRequestParam() {
webRequest.setRequestParameters(Arrays.asList(new NameValuePair("name", "value")));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameter("name")).isEqualTo("value");
}
// --- buildRequest with parameters
@Test
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithSingleRequestParamWithNullValue() {
webRequest.setRequestParameters(Arrays.asList(new NameValuePair("name", null)));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameter("name")).isNull();
}
@Test
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithSingleRequestParamWithEmptyValue() {
webRequest.setRequestParameters(Arrays.asList(new NameValuePair("name", "")));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameter("name")).isEqualTo("");
}
@Test
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithSingleRequestParamWithValueSetToSpace() {
webRequest.setRequestParameters(Arrays.asList(new NameValuePair("name", " ")));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameter("name")).isEqualTo(" ");
}
@Test
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithMultipleRequestParams() {
webRequest.setRequestParameters(Arrays.asList(new NameValuePair("name1", "value1"), new NameValuePair("name2", "value2")));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(2);
assertThat(actualRequest.getParameter("name1")).isEqualTo("value1");
assertThat(actualRequest.getParameter("name2")).isEqualTo("value2");
}
@Test // gh-24926
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithFileToUploadAsParameter() throws Exception {
webRequest.setRequestParameters(Collections.singletonList(
new KeyDataPair("key",
new ClassPathResource("org/springframework/test/web/htmlunit/test.txt").getFile(),
"test.txt", MimeType.TEXT_PLAIN, StandardCharsets.UTF_8)));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParts()).hasSize(1);
Part part = actualRequest.getPart("key");
assertThat(part).isNotNull();
assertThat(part.getName()).isEqualTo("key");
assertThat(IOUtils.toString(part.getInputStream(), StandardCharsets.UTF_8)).isEqualTo("test file");
assertThat(part.getSubmittedFileName()).isEqualTo("test.txt");
assertThat(part.getContentType()).isEqualTo(MimeType.TEXT_PLAIN);
}
@Test // gh-27199
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithFileDataAsParameter() throws Exception {
String data = "{}";
KeyDataPair keyDataPair = new KeyDataPair("key", new File("test.json"), null, MimeType.APPLICATION_JSON, StandardCharsets.UTF_8);
keyDataPair.setData(data.getBytes());
webRequest.setRequestParameters(Collections.singletonList(keyDataPair));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParts()).hasSize(1);
Part part = actualRequest.getPart("key");
assertSoftly(softly -> {
softly.assertThat(part).as("part").isNotNull();
softly.assertThat(part.getName()).as("name").isEqualTo("key");
softly.assertThat(part.getSubmittedFileName()).as("file name").isEqualTo("test.json");
softly.assertThat(part.getContentType()).as("content type").isEqualTo(MimeType.APPLICATION_JSON);
try {
softly.assertThat(IOUtils.toString(part.getInputStream(), StandardCharsets.UTF_8)).as("content").isEqualTo(data);
}
catch (IOException ex) {
softly.fail("failed to get InputStream", ex);
}
});
}
@Test // gh-26799
public void buildRequestParameterMapViaWebRequestDotSetRequestParametersWithNullFileToUploadAsParameter() throws Exception {
webRequest.setRequestParameters(Collections.singletonList(new KeyDataPair("key", null, null, null, (Charset) null)));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParts()).hasSize(1);
Part part = actualRequest.getPart("key");
assertSoftly(softly -> {
softly.assertThat(part).as("part").isNotNull();
softly.assertThat(part.getName()).as("name").isEqualTo("key");
softly.assertThat(part.getSize()).as("size").isEqualTo(0);
try {
softly.assertThat(part.getInputStream()).as("input stream").isEmpty();
}
catch (IOException ex) {
softly.fail("failed to get InputStream", ex);
}
softly.assertThat(part.getSubmittedFileName()).as("filename").isEqualTo("");
softly.assertThat(part.getContentType()).as("content-type").isEqualTo("application/octet-stream");
});
}
@Test
public void buildRequestParameterMapFromSingleQueryParam() throws Exception {
void buildRequestParameterMapFromSingleQueryParam() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?name=value"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameterMap()).hasSize(1);
assertThat(actualRequest.getParameter("name")).isEqualTo("value");
}
// SPR-14177
@Test
public void buildRequestParameterMapDecodesParameterName() throws Exception {
void buildRequestParameterMapDecodesParameterName() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?row%5B0%5D=value"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameterMap()).hasSize(1);
assertThat(actualRequest.getParameter("row[0]")).isEqualTo("value");
}
@Test
public void buildRequestParameterMapDecodesParameterValue() throws Exception {
void buildRequestParameterMapDecodesParameterValue() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?name=row%5B0%5D"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(1);
assertThat(actualRequest.getParameterMap()).hasSize(1);
assertThat(actualRequest.getParameter("name")).isEqualTo("row[0]");
}
@Test
public void buildRequestParameterMapFromSingleQueryParamWithoutValueAndWithoutEqualsSign() throws Exception {
void buildRequestParameterMapFromSingleQueryParamWithoutValueAndWithoutEqualsSign() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?name"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -536,7 +408,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestParameterMapFromSingleQueryParamWithoutValueButWithEqualsSign() throws Exception {
void buildRequestParameterMapFromSingleQueryParamWithoutValueButWithEqualsSign() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?name="));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -546,7 +418,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestParameterMapFromSingleQueryParamWithValueSetToEncodedSpace() throws Exception {
void buildRequestParameterMapFromSingleQueryParamWithValueSetToEncodedSpace() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?name=%20"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -556,25 +428,25 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestParameterMapFromMultipleQueryParams() throws Exception {
void buildRequestParameterMapFromMultipleQueryParams() throws Exception {
webRequest.setUrl(new URL("https://example.com/example/?name=value&param2=value+2"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getParameterMap().size()).isEqualTo(2);
assertThat(actualRequest.getParameterMap()).hasSize(2);
assertThat(actualRequest.getParameter("name")).isEqualTo("value");
assertThat(actualRequest.getParameter("param2")).isEqualTo("value 2");
}
@Test
public void buildRequestPathInfo() throws Exception {
void buildRequestPathInfo() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getPathInfo()).isNull();
}
@Test
public void buildRequestPathInfoNull() throws Exception {
void buildRequestPathInfoNull() throws Exception {
webRequest.setUrl(new URL("https://example.com/example"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -583,7 +455,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestAndAntPathRequestMatcher() throws Exception {
void buildRequestAndAntPathRequestMatcher() throws Exception {
webRequest.setUrl(new URL("https://example.com/app/login/authenticate"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -594,14 +466,14 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestProtocol() throws Exception {
void buildRequestProtocol() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getProtocol()).isEqualTo("HTTP/1.1");
}
@Test
public void buildRequestQueryWithSingleQueryParam() throws Exception {
void buildRequestQueryWithSingleQueryParam() throws Exception {
String expectedQuery = "param=value";
webRequest.setUrl(new URL("https://example.com/example?" + expectedQuery));
@ -611,7 +483,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestQueryWithSingleQueryParamWithoutValueAndWithoutEqualsSign() throws Exception {
void buildRequestQueryWithSingleQueryParamWithoutValueAndWithoutEqualsSign() throws Exception {
String expectedQuery = "param";
webRequest.setUrl(new URL("https://example.com/example?" + expectedQuery));
@ -621,7 +493,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestQueryWithSingleQueryParamWithoutValueButWithEqualsSign() throws Exception {
void buildRequestQueryWithSingleQueryParamWithoutValueButWithEqualsSign() throws Exception {
String expectedQuery = "param=";
webRequest.setUrl(new URL("https://example.com/example?" + expectedQuery));
@ -631,7 +503,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestQueryWithSingleQueryParamWithValueSetToEncodedSpace() throws Exception {
void buildRequestQueryWithSingleQueryParamWithValueSetToEncodedSpace() throws Exception {
String expectedQuery = "param=%20";
webRequest.setUrl(new URL("https://example.com/example?" + expectedQuery));
@ -641,7 +513,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestQueryWithMultipleQueryParams() throws Exception {
void buildRequestQueryWithMultipleQueryParams() throws Exception {
String expectedQuery = "param1=value1&param2=value2";
webRequest.setUrl(new URL("https://example.com/example?" + expectedQuery));
@ -651,7 +523,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestReader() throws Exception {
void buildRequestReader() throws Exception {
String expectedBody = "request body";
webRequest.setHttpMethod(HttpMethod.POST);
webRequest.setRequestBody(expectedBody);
@ -662,21 +534,21 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestRemoteAddr() throws Exception {
void buildRequestRemoteAddr() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getRemoteAddr()).isEqualTo("127.0.0.1");
}
@Test
public void buildRequestRemoteHost() throws Exception {
void buildRequestRemoteHost() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getRemoteAddr()).isEqualTo("127.0.0.1");
}
@Test
public void buildRequestRemotePort() throws Exception {
void buildRequestRemotePort() throws Exception {
webRequest.setUrl(new URL("http://localhost:80/test/this/here"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -684,7 +556,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestRemotePort8080() throws Exception {
void buildRequestRemotePort8080() throws Exception {
webRequest.setUrl(new URL("https://example.com:8080/"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -693,7 +565,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestRemotePort80WithDefault() throws Exception {
void buildRequestRemotePort80WithDefault() throws Exception {
webRequest.setUrl(new URL("http://company.example/"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -702,7 +574,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestRequestedSessionId() throws Exception {
void buildRequestRequestedSessionId() throws Exception {
String sessionId = "session-id";
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -711,26 +583,26 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestRequestedSessionIdNull() throws Exception {
void buildRequestRequestedSessionIdNull() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getRequestedSessionId()).isNull();
}
@Test
public void buildRequestUri() {
void buildRequestUri() {
String uri = requestBuilder.buildRequest(servletContext).getRequestURI();
assertThat(uri).isEqualTo("/test/this/here");
}
@Test
public void buildRequestUrl() {
void buildRequestUrl() {
String uri = requestBuilder.buildRequest(servletContext).getRequestURL().toString();
assertThat(uri).isEqualTo("https://example.com/test/this/here");
}
@Test
public void buildRequestSchemeHttp() throws Exception {
void buildRequestSchemeHttp() throws Exception {
webRequest.setUrl(new URL("http://localhost:80/test/this/here"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -738,7 +610,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSchemeHttps() throws Exception {
void buildRequestSchemeHttps() throws Exception {
webRequest.setUrl(new URL("https://example.com/"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -746,14 +618,14 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestServerName() throws Exception {
void buildRequestServerName() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getServerName()).isEqualTo("example.com");
}
@Test
public void buildRequestServerPort() throws Exception {
void buildRequestServerPort() throws Exception {
webRequest.setUrl(new URL("http://localhost:80/test/this/here"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -761,7 +633,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestServerPortDefault() throws Exception {
void buildRequestServerPortDefault() throws Exception {
webRequest.setUrl(new URL("https://example.com/"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -769,21 +641,21 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestServletContext() throws Exception {
void buildRequestServletContext() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getServletContext()).isEqualTo(servletContext);
}
@Test
public void buildRequestServletPath() throws Exception {
void buildRequestServletPath() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getServletPath()).isEqualTo("/this/here");
}
@Test // gh-27837
public void buildRequestServletPathWithEncodedUrl() throws Exception {
void buildRequestServletPathWithEncodedUrl() throws Exception {
webRequest.setUrl(new URL("http://localhost/test/Fr%C3%BChling%20Sommer%20Herbst%20Winter"));
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -793,7 +665,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSession() throws Exception {
void buildRequestSession() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
HttpSession newSession = actualRequest.getSession();
@ -810,7 +682,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSessionWithExistingSession() throws Exception {
void buildRequestSessionWithExistingSession() throws Exception {
String sessionId = "session-id";
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -831,7 +703,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSessionTrue() throws Exception {
void buildRequestSessionTrue() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
HttpSession session = actualRequest.getSession(true);
@ -839,7 +711,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSessionFalseIsNull() throws Exception {
void buildRequestSessionFalseIsNull() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
HttpSession session = actualRequest.getSession(false);
@ -847,7 +719,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSessionFalseWithExistingSession() throws Exception {
void buildRequestSessionFalseWithExistingSession() throws Exception {
String sessionId = "session-id";
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
@ -857,14 +729,14 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSessionIsNew() throws Exception {
void buildRequestSessionIsNew() throws Exception {
MockHttpServletRequest actualRequest = requestBuilder.buildRequest(servletContext);
assertThat(actualRequest.getSession().isNew()).isTrue();
}
@Test
public void buildRequestSessionIsNewFalse() throws Exception {
void buildRequestSessionIsNewFalse() throws Exception {
String sessionId = "session-id";
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
@ -874,7 +746,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void buildRequestSessionInvalidate() throws Exception {
void buildRequestSessionInvalidate() throws Exception {
String sessionId = "session-id";
webRequest.setAdditionalHeader("Cookie", "JSESSIONID=" + sessionId);
@ -898,33 +770,33 @@ public class HtmlUnitRequestBuilderTests {
// --- setContextPath
@Test
public void setContextPathNull() {
void setContextPathNull() {
requestBuilder.setContextPath(null);
assertThat(getContextPath()).isNull();
}
@Test
public void setContextPathEmptyString() {
void setContextPathEmptyString() {
requestBuilder.setContextPath("");
assertThat(getContextPath()).isEmpty();
}
@Test
public void setContextPathDoesNotStartWithSlash() {
void setContextPathDoesNotStartWithSlash() {
assertThatIllegalArgumentException().isThrownBy(() ->
requestBuilder.setContextPath("abc/def"));
}
@Test
public void setContextPathEndsWithSlash() {
void setContextPathEndsWithSlash() {
assertThatIllegalArgumentException().isThrownBy(() ->
requestBuilder.setContextPath("/abc/def/"));
}
@Test
public void setContextPath() {
void setContextPath() {
String expectedContextPath = "/abc/def";
requestBuilder.setContextPath(expectedContextPath);
@ -932,7 +804,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void mergeHeader() throws Exception {
void mergeHeader() throws Exception {
String headerName = "PARENT";
String headerValue = "VALUE";
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController())
@ -943,7 +815,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void mergeSession() throws Exception {
void mergeSession() throws Exception {
String attrName = "PARENT";
String attrValue = "VALUE";
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController())
@ -954,7 +826,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void mergeSessionNotInitialized() throws Exception {
void mergeSessionNotInitialized() throws Exception {
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController())
.defaultRequest(get("/"))
.build();
@ -963,7 +835,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void mergeParameter() throws Exception {
void mergeParameter() throws Exception {
String paramName = "PARENT";
String paramValue = "VALUE";
String paramValue2 = "VALUE2";
@ -976,7 +848,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void mergeCookie() throws Exception {
void mergeCookie() throws Exception {
String cookieName = "PARENT";
String cookieValue = "VALUE";
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController())
@ -992,7 +864,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test
public void mergeRequestAttribute() throws Exception {
void mergeRequestAttribute() throws Exception {
String attrName = "PARENT";
String attrValue = "VALUE";
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController())
@ -1003,7 +875,7 @@ public class HtmlUnitRequestBuilderTests {
}
@Test // SPR-14584
public void mergeDoesNotCorruptPathInfoOnParent() throws Exception {
void mergeDoesNotCorruptPathInfoOnParent() throws Exception {
String pathInfo = "/foo/bar";
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HelloController())
.defaultRequest(get("/"))

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -103,7 +103,7 @@ class MockMvcWebClientBuilderTests {
WebClient client = MockMvcWebClientBuilder.mockMvcSetup(this.mockMvc).build();
assertThat(getResponse(client, "http://localhost/").getContentAsString()).isEqualTo("NA");
assertThat(postResponse(client, "http://localhost/?cookie=foo").getContentAsString()).isEqualTo("Set");
assertThat(postResponse(client, "http://localhost/", "cookie=foo").getContentAsString()).isEqualTo("Set");
assertThat(getResponse(client, "http://localhost/").getContentAsString()).isEqualTo("foo");
assertThat(deleteResponse(client, "http://localhost/").getContentAsString()).isEqualTo("Delete");
assertThat(getResponse(client, "http://localhost/").getContentAsString()).isEqualTo("NA");
@ -117,8 +117,10 @@ class MockMvcWebClientBuilderTests {
return createResponse(client, new WebRequest(new URL(url)));
}
private WebResponse postResponse(WebClient client, String url) throws IOException {
return createResponse(client, new WebRequest(new URL(url), HttpMethod.POST));
private WebResponse postResponse(WebClient client, String url, String body) throws IOException {
WebRequest request = new WebRequest(new URL(url), HttpMethod.POST);
request.setRequestBody(body);
return createResponse(client, request);
}
private WebResponse deleteResponse(WebClient client, String url) throws IOException {