diff --git a/packages/abstractions/src/multipartBody.ts b/packages/abstractions/src/multipartBody.ts index 9e2dcdd09..6b7ea83fd 100644 --- a/packages/abstractions/src/multipartBody.ts +++ b/packages/abstractions/src/multipartBody.ts @@ -93,7 +93,7 @@ interface MultipartEntry { serializationCallback?: ModelSerializerFunction; } -export const serializeMultipartBody = (writer: SerializationWriter, multipartBody: Partial | undefined | null = new MultipartBody()): void => { +export const serializeMultipartBody = (writer: SerializationWriter, multipartBody: Partial = new MultipartBody()): void => { if (!writer) { throw new Error("writer cannot be undefined"); } @@ -117,13 +117,16 @@ export const serializeMultipartBody = (writer: SerializationWriter, multipartBod if (first) { first = false; } else { - writer.writeStringValue(undefined, ""); + writer.writeStringValue(undefined, "\r\n"); } writer.writeStringValue(undefined, "--" + boundary); + writer.writeStringValue(undefined, "\r\n"); const part = parts[partName]; writer.writeStringValue("Content-Type", part.contentType); + writer.writeStringValue(undefined, "\r\n"); writer.writeStringValue("Content-Disposition", 'form-data; name="' + part.originalName + '"'); - writer.writeStringValue(undefined, ""); + writer.writeStringValue(undefined, "\r\n"); + writer.writeStringValue(undefined, "\r\n"); if (typeof part.content === "string") { writer.writeStringValue(undefined, part.content); } else if (part.content instanceof ArrayBuffer) { @@ -150,8 +153,9 @@ export const serializeMultipartBody = (writer: SerializationWriter, multipartBod } } } - writer.writeStringValue(undefined, ""); + writer.writeStringValue(undefined, "\r\n"); writer.writeStringValue(undefined, "--" + boundary + "--"); + writer.writeStringValue(undefined, "\r\n"); }; export const deserializeIntoMultipartBody = ( diff --git a/packages/serialization/multipart/src/multipartSerializationWriter.ts b/packages/serialization/multipart/src/multipartSerializationWriter.ts index a2a166cab..133c2734f 100644 --- a/packages/serialization/multipart/src/multipartSerializationWriter.ts +++ b/packages/serialization/multipart/src/multipartSerializationWriter.ts @@ -34,19 +34,16 @@ export class MultipartSerializationWriter implements SerializationWriter { if (key) { this.writeRawStringValue(key); } - if (value !== undefined) { + if (value) { if (key) { this.writeRawStringValue(": "); } this.writeRawStringValue(value); } - this.writeRawStringValue("\r\n"); }; private writeRawStringValue = (value?: string | null): void => { - if (value !== undefined) { - const isNullValue = value === null; - - this.writeByteArrayValue(undefined, new TextEncoder().encode(isNullValue ? "null" : value).buffer); + if (value) { + this.writeByteArrayValue(undefined, new TextEncoder().encode(value).buffer); } }; // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/packages/serialization/multipart/test/common/multipartSerializationWriter.ts b/packages/serialization/multipart/test/common/multipartSerializationWriter.ts index e3c753109..810a0b069 100644 --- a/packages/serialization/multipart/test/common/multipartSerializationWriter.ts +++ b/packages/serialization/multipart/test/common/multipartSerializationWriter.ts @@ -50,6 +50,21 @@ describe("MultipartSerializationWriter", () => { .join(""), ); }); + it("serializes multipart body with correct CRLF delimiters", () => { + const multipartSerializationWriter = new MultipartSerializationWriter(); + const mpBody = new MultipartBody(); + mpBody.addOrReplacePart("testPart", "text/plain", "test content"); + mpBody.requestAdapter = { + getSerializationWriterFactory: () => new JsonSerializationWriterFactory(), + } as RequestAdapter; + + multipartSerializationWriter.writeObjectValue(undefined, mpBody, serializeMultipartBody); + const multipartContent = multipartSerializationWriter.getSerializedContent(); + const result = new TextDecoder().decode(multipartContent); + + 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`; + assert.equal(result, expectedString); + }); it("writes a structured object", () => { const testEntity = {} as TestEntity; testEntity.id = "48d31887-5fad-4d73-a9f5-3c356e68a038";