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