diff --git a/README.md b/README.md index 971c8e0..6fc5813 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ var newPost = postService.createPost(new Post( System.out.println(newPost); ``` -## 🛠️ Installation +## ⚙ Installation You can install CleverClient by adding the following dependency to your Maven project: diff --git a/pom.xml b/pom.xml index c01f6af..c90fd40 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.sashirestela cleverclient - 1.4.0 + 1.4.1 jar cleverclient @@ -52,19 +52,19 @@ 11 2.0.12 - 1.18.30 - 2.16.1 + 1.18.32 + 2.17.0 5.10.2 - 5.10.0 + 5.11.0 - 3.12.1 + 3.13.0 3.4.1 3.2.5 3.2.0 - 0.8.11 + 0.8.12 3.5.0 2.16.2 - 3.3.0 + 3.3.1 3.6.3 3.1.0 1.6.13 diff --git a/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java b/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java index add7c35..0678188 100644 --- a/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java +++ b/src/main/java/io/github/sashirestela/cleverclient/support/HttpMultipart.java @@ -8,6 +8,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -49,15 +50,32 @@ public static List toByteArrays(Map data) { byteArrays.add(toBytes(NL)); } else { var fieldValue = entry.getValue(); - byteArrays.add(toBytes(FIELD_NAME + DQ + fieldName + DQ + NL)); - byteArrays.add(toBytes(NL)); - byteArrays.add(toBytes(fieldValue + NL)); + var isFirst = true; + if (fieldValue instanceof Collection) { + for (Object item : (Collection) fieldValue) { + addIndividualField(byteArrays, fieldName + "[]", item, isFirst); + isFirst = false; + } + } else { + addIndividualField(byteArrays, fieldName, fieldValue, isFirst); + } } } byteArrays.add(toBytes(DASH + Constant.BOUNDARY_VALUE + DASH + NL)); return byteArrays; } + private static void addIndividualField(List byteArrays, String fieldName, Object fieldValue, + boolean isFirst) { + if (!isFirst) { + byteArrays.add(toBytes(DASH + Constant.BOUNDARY_VALUE + NL)); + byteArrays.add(toBytes(DISPOSITION)); + } + byteArrays.add(toBytes(FIELD_NAME + DQ + fieldName + DQ + NL)); + byteArrays.add(toBytes(NL)); + byteArrays.add(toBytes(fieldValue + NL)); + } + private static byte[] toBytes(String text) { return text.getBytes(StandardCharsets.UTF_8); } diff --git a/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java b/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java index d054a2c..d234f49 100644 --- a/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java +++ b/src/test/java/io/github/sashirestela/cleverclient/http/ITest.java @@ -171,4 +171,20 @@ static class Generic { } + @Getter + @AllArgsConstructor + static class MultipartClass { + + private java.nio.file.Path file; + + private int id; + + private String text; + + private List group; + + private Integer[] numbers; + + } + } diff --git a/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java b/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java new file mode 100644 index 0000000..817e7b9 --- /dev/null +++ b/src/test/java/io/github/sashirestela/cleverclient/support/HttpMultipartTest.java @@ -0,0 +1,57 @@ +package io.github.sashirestela.cleverclient.support; + +import io.github.sashirestela.cleverclient.http.ITest; +import io.github.sashirestela.cleverclient.util.JsonUtil; +import org.junit.jupiter.api.Test; + +import java.nio.file.Paths; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class HttpMultipartTest { + + @Test + void testToByteArrays() { + String[] expectedData = { + "Content-Disposition: form-data", + "Content-Type: text/plain\r\n", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + "Content-Disposition: form-data", + "; name=\"id\"\r\n", + "101\r\n", + "Content-Disposition: form-data", + "; name=\"text\"\r\n", + "Testing\r\n", + "Content-Disposition: form-data", + "; name=\"group[]\"\r\n", + "one\r\n", + "Content-Disposition: form-data", + "; name=\"group[]\"\r\n", + "two\r\n", + "Content-Disposition: form-data", + "; name=\"numbers[]\"\r\n", + "13\r\n", + "Content-Disposition: form-data", + "; name=\"numbers[]\"\r\n", + "25\r\n", + "Content-Disposition: form-data", + "; name=\"numbers[]\"\r\n", + "37\r\n" + }; + var object = new ITest.MultipartClass(Paths.get("src/test/resources/loremipsum.txt"), 101, "Testing", + List.of("one", "two"), new Integer[] { 13, 25, 37 }); + var objectMap = JsonUtil.objectToMap(object); + var bytesList = HttpMultipart.toByteArrays(objectMap); + var i = 0; + for (byte[] bytes : bytesList) { + var currentData = new String(bytes); + if (!currentData.startsWith("--") && !currentData.startsWith("\r\n") + && !currentData.contains("filename=")) { + assertEquals(expectedData[i], currentData); + i++; + } + } + } + +} diff --git a/src/test/resources/loremipsum.txt b/src/test/resources/loremipsum.txt new file mode 100644 index 0000000..120ef61 --- /dev/null +++ b/src/test/resources/loremipsum.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \ No newline at end of file