From 579e9440cfe72fbbceb6bf3340df28815e888c10 Mon Sep 17 00:00:00 2001 From: Irina Kozhevnikova Date: Thu, 13 Aug 2026 16:37:41 +0000 Subject: [PATCH 1/2] test(multipart): assert correct CRLF framing for string parts --- .../test_multipart_serialization_writer.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/serialization/multipart/tests/unit/test_multipart_serialization_writer.py b/packages/serialization/multipart/tests/unit/test_multipart_serialization_writer.py index 4e52e038..d6593aa5 100644 --- a/packages/serialization/multipart/tests/unit/test_multipart_serialization_writer.py +++ b/packages/serialization/multipart/tests/unit/test_multipart_serialization_writer.py @@ -89,3 +89,28 @@ def test_write_object_value_with_filename(user_1, mock_request_adapter, mock_ser content = serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == f'--{mock_multipart_body.boundary}'+'\r\nContent-Type: application/json\r\nContent-Disposition: form-data; name="test user"\r\n\r\n{"id": "eac79bd3-fd08-4abf-9df2-2565cf3a3845", "workDuration": "2:00:00", "birthDay": "2017-09-04", "startWorkTime": "00:00:00", "createdDateTime": "2022-01-27T12:59:45", "businessPhones": ["+1 412 555 0109"], "mobilePhone": null, "accountEnabled": false, "jobTitle": "Auditor", "manager": {"id": "eac79bd3-fd08-4abf-9df2-2565cf3a3845"}}\r\n'+f'--{mock_multipart_body.boundary}'+'\r\nContent-Type: application/octet-stream\r\nContent-Disposition: form-data; name="file"; filename="file.txt"\r\n\r\nHello world\r\n'+f'--{mock_multipart_body.boundary}--\r\n' + +def test_write_object_value_with_string_part(mock_request_adapter, mock_serialization_writer_factory, mock_multipart_body): + mock_request_adapter.get_serialization_writer_factory = Mock(return_value=mock_serialization_writer_factory) + mock_multipart_body.request_adapter = mock_request_adapter + mock_multipart_body.add_or_replace_part("message", "text/plain", "Hello world") + + + serialization_writer = MultipartSerializationWriter() + serialization_writer.write_object_value("", mock_multipart_body, None) + content = serialization_writer.get_serialized_content() + content_string = content.decode('utf-8') + assert content_string == f'--{mock_multipart_body.boundary}'+'\r\nContent-Type: text/plain\r\nContent-Disposition: form-data; name="message"\r\n\r\nHello world\r\n'+f'--{mock_multipart_body.boundary}--\r\n' + +def test_write_object_value_with_multiple_string_parts(mock_request_adapter, mock_serialization_writer_factory, mock_multipart_body): + mock_request_adapter.get_serialization_writer_factory = Mock(return_value=mock_serialization_writer_factory) + mock_multipart_body.request_adapter = mock_request_adapter + mock_multipart_body.add_or_replace_part("message1", "text/plain", "Hello world") + mock_multipart_body.add_or_replace_part("message2", "text/plain", "Goodbye world") + + + serialization_writer = MultipartSerializationWriter() + serialization_writer.write_object_value("", mock_multipart_body, None) + content = serialization_writer.get_serialized_content() + content_string = content.decode('utf-8') + assert content_string == f'--{mock_multipart_body.boundary}'+'\r\nContent-Type: text/plain\r\nContent-Disposition: form-data; name="message1"\r\n\r\nHello world\r\n'+f'--{mock_multipart_body.boundary}'+'\r\nContent-Type: text/plain\r\nContent-Disposition: form-data; name="message2"\r\n\r\nGoodbye world\r\n'+f'--{mock_multipart_body.boundary}--\r\n' \ No newline at end of file From bb6764a9b848a4107ae7382839ef864e77683d48 Mon Sep 17 00:00:00 2001 From: Irina Kozhevnikova Date: Thu, 13 Aug 2026 16:46:10 +0000 Subject: [PATCH 2/2] fix(multipart): strip stray CRLF appended to string part values in MultipartBody.serialize --- packages/abstractions/kiota_abstractions/multipart_body.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/abstractions/kiota_abstractions/multipart_body.py b/packages/abstractions/kiota_abstractions/multipart_body.py index 8a2504bf..6f39989e 100644 --- a/packages/abstractions/kiota_abstractions/multipart_body.py +++ b/packages/abstractions/kiota_abstractions/multipart_body.py @@ -122,7 +122,7 @@ def serialize(self, writer: SerializationWriter) -> None: if isinstance(part_value[1], Parsable): self._write_parsable(writer, part_value) elif isinstance(part_value[1], str): - writer.write_str_value("", part_value[1]) + writer.write_bytes_value("", part_value[1].encode('utf-8')) elif isinstance(part_value[1], bytes): writer.write_bytes_value("", part_value[1]) elif isinstance(part_value[1], io.IOBase):