Skip to content

Commit 7200ac7

Browse files
authored
fix: Fix order of file upload multipart request (#1261)
1 parent 8f7bdc0 commit 7200ac7

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

src/main/java/com/box/sdk/AbstractBoxMultipartRequest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,14 @@ protected String bodyToString() {
141141
protected void writeMethodWithBody(Request.Builder requestBuilder, ProgressListener progressListener) {
142142
MultipartBody.Builder bodyBuilder =
143143
new MultipartBody.Builder()
144-
.setType(MultipartBody.FORM)
145-
.addFormDataPart(
146-
getPartName(),
147-
filename,
148-
getBody(progressListener)
149-
);
144+
.setType(MultipartBody.FORM);
145+
// Attributes should go first
150146
this.fields.forEach(bodyBuilder::addFormDataPart);
147+
// File should go second
148+
bodyBuilder.addFormDataPart(
149+
getPartName(),
150+
filename,
151+
getBody(progressListener));
151152
requestBuilder.post(bodyBuilder.build());
152153
}
153154

src/test/java/com/box/sdk/BoxFolderTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.github.tomakehurst.wiremock.client.WireMock;
2626
import com.github.tomakehurst.wiremock.junit.WireMockRule;
2727
import com.github.tomakehurst.wiremock.matching.EqualToJsonPattern;
28+
import com.github.tomakehurst.wiremock.matching.EqualToPattern;
29+
import com.github.tomakehurst.wiremock.matching.MultipartValuePatternBuilder;
2830
import java.io.ByteArrayInputStream;
2931
import java.io.IOException;
3032
import java.io.InputStream;
@@ -1235,6 +1237,43 @@ public void testDeleteClassification() {
12351237
WireMock.verify(1, WireMock.deleteRequestedFor(WireMock.urlPathEqualTo(metadataURL)));
12361238
}
12371239

1240+
@Test
1241+
public void testUploadFileWithCorrectMultipartOrder() {
1242+
final String folderID = "0";
1243+
final String fileURL = "/2.0/files/content";
1244+
final String fileContent = "Test file";
1245+
final String fileName = "Test File.txt";
1246+
final String fileDescription = "Test Description";
1247+
InputStream stream = new ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8));
1248+
final String expectedAttributesJson =
1249+
"{\"name\":\"Test File.txt\",\"parent\":{\"id\": \"0\"},\"description\":\"Test Description\"}";
1250+
1251+
String result = TestUtils.getFixture("BoxFile/CreateFileWithDescription201");
1252+
1253+
wireMockRule.stubFor(WireMock.post(WireMock.urlPathEqualTo(fileURL))
1254+
.withRequestBody(WireMock.matching(".*attributes.*file.*")) // Check that attributes comes before file
1255+
.withMultipartRequestBody(
1256+
new MultipartValuePatternBuilder()
1257+
.withName("attributes")
1258+
.withBody(new EqualToJsonPattern(expectedAttributesJson, false, false))
1259+
).withMultipartRequestBody(
1260+
new MultipartValuePatternBuilder()
1261+
.withName("file")
1262+
.withBody(new EqualToPattern(fileContent))
1263+
)
1264+
.willReturn(WireMock.aResponse()
1265+
.withHeader("Content-Type", APPLICATION_JSON_PATCH)
1266+
.withBody(result)
1267+
.withStatus(201)));
1268+
1269+
BoxFolder folder = new BoxFolder(this.api, folderID);
1270+
BoxFile.Info file = folder.uploadFile(stream, fileName, fileDescription);
1271+
1272+
assertEquals(fileDescription, file.getDescription());
1273+
assertEquals(folderID, file.getParent().getID());
1274+
assertEquals(fileName, file.getName());
1275+
}
1276+
12381277
@Test
12391278
public void testUploadFileWithDescriptionSucceeds() {
12401279
final String folderID = "12345";

0 commit comments

Comments
 (0)