Skip to content

Commit

Permalink
Polishing contribution
Browse files Browse the repository at this point in the history
Closes gh-31924
  • Loading branch information
rstoyanchev committed Mar 12, 2024
1 parent 667e30f commit 282ee02
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -60,7 +62,12 @@
*/
public class ContentRequestMatchers {

private static final String DEFAULT_ENCODING = "UTF-8";
/**
* The encoding for parsing multipart content when the sender hasn't specified it.
* @see DiskFileItemFactory#setDefaultCharset(String)
*/
private static final Charset DEFAULT_MULTIPART_ENCODING = StandardCharsets.UTF_8;


private final XmlExpectationsHelper xmlHelper;

Expand Down Expand Up @@ -206,7 +213,15 @@ private RequestMatcher formData(MultiValueMap<String, String> expectedMap, boole
* @since 5.3
*/
public RequestMatcher multipartData(MultiValueMap<String, ?> expectedMap) {
return multipartData(expectedMap, true);
return multipartData(expectedMap, DEFAULT_MULTIPART_ENCODING, true);
}

/**
* Variant of {@link #multipartData(MultiValueMap)} with a defaultCharset.
* @since 6.2
*/
public RequestMatcher multipartData(MultiValueMap<String, ?> expectedMap, Charset defaultCharset) {
return multipartData(expectedMap, defaultCharset, true);
}

/**
Expand All @@ -221,13 +236,15 @@ public RequestMatcher multipartData(MultiValueMap<String, ?> expectedMap) {
public RequestMatcher multipartDataContains(Map<String, ?> expectedMap) {
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(expectedMap.size());
expectedMap.forEach(map::add);
return multipartData(map, false);
return multipartData(map, DEFAULT_MULTIPART_ENCODING, false);
}

@SuppressWarnings("ConstantConditions")
private RequestMatcher multipartData(MultiValueMap<String, ?> expectedMap, boolean containsExactly) {
private RequestMatcher multipartData(
MultiValueMap<String, ?> expectedMap, Charset defaultCharset, boolean containsExactly) {

return request -> {
MultiValueMap<String, ?> actualMap = MultipartHelper.parse((MockClientHttpRequest) request);
MultiValueMap<String, ?> actualMap = MultipartHelper.parse((MockClientHttpRequest) request, defaultCharset);
if (containsExactly) {
assertEquals("Multipart request content: " + actualMap, expectedMap.size(), actualMap.size());
}
Expand Down Expand Up @@ -366,11 +383,11 @@ public final void match(ClientHttpRequest request) throws IOException, Assertion

private static class MultipartHelper {

public static MultiValueMap<String, ?> parse(MockClientHttpRequest request) {
public static MultiValueMap<String, ?> parse(MockClientHttpRequest request, Charset defaultCharset) {
try {
FileUpload fileUpload = new FileUpload();
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setDefaultCharset(DEFAULT_ENCODING);
factory.setDefaultCharset(defaultCharset.name());
fileUpload.setFileItemFactory(factory);

List<FileItem> fileItems = fileUpload.parseRequest(new UploadContext() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,23 +128,25 @@ public void testFormDataContains() throws Exception {
@Test
public void testMultipartData() throws Exception {
String contentType = "multipart/form-data;boundary=1234567890";
String body = "--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 1\"\r\n" +
"\r\n" +
"vølue 1\r\n" +
"--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 2\"\r\n" +
"\r\n" +
"value 🙂\r\n" +
"--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 3\"\r\n" +
"\r\n" +
"value 漢字\r\n" +
"--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 4\"\r\n" +
"\r\n" +
"\r\n" +
"--1234567890--\r\n";
String body = """
--1234567890\r
Content-Disposition: form-data; name="name 1"\r
\r
vølue 1\r
--1234567890\r
Content-Disposition: form-data; name="name 2"\r
\r
value 🙂\r
--1234567890\r
Content-Disposition: form-data; name="name 3"\r
\r
value 漢字\r
--1234567890\r
Content-Disposition: form-data; name="name 4"\r
\r
\r
--1234567890--\r
""";

this.request.getHeaders().setContentType(MediaType.parseMediaType(contentType));
this.request.getBody().write(body.getBytes(StandardCharsets.UTF_8));
Expand All @@ -160,23 +162,25 @@ public void testMultipartData() throws Exception {
@Test
public void testMultipartDataContains() throws Exception {
String contentType = "multipart/form-data;boundary=1234567890";
String body = "--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 1\"\r\n" +
"\r\n" +
"vølue 1\r\n" +
"--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 2\"\r\n" +
"\r\n" +
"value 🙂\r\n" +
"--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 3\"\r\n" +
"\r\n" +
"value 漢字\r\n" +
"--1234567890\r\n" +
"Content-Disposition: form-data; name=\"name 4\"\r\n" +
"\r\n" +
"\r\n" +
"--1234567890--\r\n";
String body = """
--1234567890\r
Content-Disposition: form-data; name="name 1"\r
\r
vølue 1\r
--1234567890\r
Content-Disposition: form-data; name="name 2"\r
\r
value 🙂\r
--1234567890\r
Content-Disposition: form-data; name="name 3"\r
\r
value 漢字\r
--1234567890\r
Content-Disposition: form-data; name="name 4"\r
\r
\r
--1234567890--\r
""";

this.request.getHeaders().setContentType(MediaType.parseMediaType(contentType));
this.request.getBody().write(body.getBytes(StandardCharsets.UTF_8));
Expand Down

0 comments on commit 282ee02

Please sign in to comment.