Skip to content

Commit 1925744

Browse files
shemogumbep30arenabaywet
authored
Fix malformed multipart body (#1423)
* fix malformed body and include additional optional data * Revert "fix malformed body and include additional optional data" This reverts commit 26d18e1. * revert changes, only fix \r\n * prettify code * prettify files * fix code format * added guard for in * fix code errors" * pretify code * enable nulls * add unit test for multipart error fix * fix code format * reintroduce nulls to writer methods * feat(multipart-body): fix multipart body serialization * fix: switches back to arrow function * chore: linting --------- Co-authored-by: aliep <p30arena@gmail.com> Co-authored-by: Vincent Biret <vibiret@microsoft.com>
1 parent 4ce2e5b commit 1925744

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

packages/abstractions/src/multipartBody.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ interface MultipartEntry {
9393
serializationCallback?: ModelSerializerFunction<Parsable>;
9494
}
9595

96-
export const serializeMultipartBody = (writer: SerializationWriter, multipartBody: Partial<MultipartBody> | undefined | null = new MultipartBody()): void => {
96+
export const serializeMultipartBody = (writer: SerializationWriter, multipartBody: Partial<MultipartBody> = new MultipartBody()): void => {
9797
if (!writer) {
9898
throw new Error("writer cannot be undefined");
9999
}
@@ -117,13 +117,16 @@ export const serializeMultipartBody = (writer: SerializationWriter, multipartBod
117117
if (first) {
118118
first = false;
119119
} else {
120-
writer.writeStringValue(undefined, "");
120+
writer.writeStringValue(undefined, "\r\n");
121121
}
122122
writer.writeStringValue(undefined, "--" + boundary);
123+
writer.writeStringValue(undefined, "\r\n");
123124
const part = parts[partName];
124125
writer.writeStringValue("Content-Type", part.contentType);
126+
writer.writeStringValue(undefined, "\r\n");
125127
writer.writeStringValue("Content-Disposition", 'form-data; name="' + part.originalName + '"');
126-
writer.writeStringValue(undefined, "");
128+
writer.writeStringValue(undefined, "\r\n");
129+
writer.writeStringValue(undefined, "\r\n");
127130
if (typeof part.content === "string") {
128131
writer.writeStringValue(undefined, part.content);
129132
} else if (part.content instanceof ArrayBuffer) {
@@ -150,8 +153,9 @@ export const serializeMultipartBody = (writer: SerializationWriter, multipartBod
150153
}
151154
}
152155
}
153-
writer.writeStringValue(undefined, "");
156+
writer.writeStringValue(undefined, "\r\n");
154157
writer.writeStringValue(undefined, "--" + boundary + "--");
158+
writer.writeStringValue(undefined, "\r\n");
155159
};
156160

157161
export const deserializeIntoMultipartBody = (

packages/serialization/multipart/src/multipartSerializationWriter.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,16 @@ export class MultipartSerializationWriter implements SerializationWriter {
3434
if (key) {
3535
this.writeRawStringValue(key);
3636
}
37-
if (value !== undefined) {
37+
if (value) {
3838
if (key) {
3939
this.writeRawStringValue(": ");
4040
}
4141
this.writeRawStringValue(value);
4242
}
43-
this.writeRawStringValue("\r\n");
4443
};
4544
private writeRawStringValue = (value?: string | null): void => {
46-
if (value !== undefined) {
47-
const isNullValue = value === null;
48-
49-
this.writeByteArrayValue(undefined, new TextEncoder().encode(isNullValue ? "null" : value).buffer);
45+
if (value) {
46+
this.writeByteArrayValue(undefined, new TextEncoder().encode(value).buffer);
5047
}
5148
};
5249
// eslint-disable-next-line @typescript-eslint/no-unused-vars

packages/serialization/multipart/test/common/multipartSerializationWriter.ts

+15
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ describe("MultipartSerializationWriter", () => {
5050
.join(""),
5151
);
5252
});
53+
it("serializes multipart body with correct CRLF delimiters", () => {
54+
const multipartSerializationWriter = new MultipartSerializationWriter();
55+
const mpBody = new MultipartBody();
56+
mpBody.addOrReplacePart("testPart", "text/plain", "test content");
57+
mpBody.requestAdapter = {
58+
getSerializationWriterFactory: () => new JsonSerializationWriterFactory(),
59+
} as RequestAdapter;
60+
61+
multipartSerializationWriter.writeObjectValue(undefined, mpBody, serializeMultipartBody);
62+
const multipartContent = multipartSerializationWriter.getSerializedContent();
63+
const result = new TextDecoder().decode(multipartContent);
64+
65+
const expectedString = `--${mpBody.getBoundary()}\r\nContent-Type: text/plain\r\nContent-Disposition: form-data; name="testPart"\r\n\r\ntest content\r\n--${mpBody.getBoundary()}--\r\n`;
66+
assert.equal(result, expectedString);
67+
});
5368
it("writes a structured object", () => {
5469
const testEntity = {} as TestEntity;
5570
testEntity.id = "48d31887-5fad-4d73-a9f5-3c356e68a038";

0 commit comments

Comments
 (0)