From acbf899bb2f72db5855fe9c2848d0504481d07f7 Mon Sep 17 00:00:00 2001 From: protonnegativo Date: Tue, 27 Oct 2026 01:38:35 -0300 Subject: [PATCH] fix(form): base64-decode bytes values on deserialization FormSerializationWriter.write_bytes_value writes bytes as base64, but FormParseNode.get_bytes_value returned the base64 text encoded as UTF-8 instead of decoding it, so a value written by the writer did not read back as the original bytes. Decode the value with base64.b64decode, as the JSON (#646) and text parse nodes do. --- .../form_parse_node.py | 3 ++- .../form/tests/unit/test_form_parse_node.py | 23 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/serialization/form/kiota_serialization_form/form_parse_node.py b/packages/serialization/form/kiota_serialization_form/form_parse_node.py index 54de0a08..635b02f8 100644 --- a/packages/serialization/form/kiota_serialization_form/form_parse_node.py +++ b/packages/serialization/form/kiota_serialization_form/form_parse_node.py @@ -1,5 +1,6 @@ from __future__ import annotations +import base64 import warnings from collections import defaultdict from collections.abc import Callable @@ -380,7 +381,7 @@ def _get_time_value(value: str) -> Optional[time]: def _get_bytes_value(value: str) -> Optional[bytes]: if value and value != "null": try: - return str(value).encode("utf-8") + return base64.b64decode(value) except: return None return None diff --git a/packages/serialization/form/tests/unit/test_form_parse_node.py b/packages/serialization/form/tests/unit/test_form_parse_node.py index fb8b0ba2..47103e9f 100644 --- a/packages/serialization/form/tests/unit/test_form_parse_node.py +++ b/packages/serialization/form/tests/unit/test_form_parse_node.py @@ -1,4 +1,3 @@ -import base64 from datetime import date, datetime, time, timedelta, timezone from enum import Enum from uuid import UUID @@ -134,7 +133,27 @@ def test_get_bytes_value(): parse_node = FormParseNode('SGVsbG8gd29ybGQ%3D') result = parse_node.get_bytes_value() assert isinstance(result, bytes) - assert base64.b64decode(result) == b'Hello world' + assert result == b'Hello world' + + +def test_get_bytes_value_round_trip(): + writer = FormSerializationWriter() + writer.write_bytes_value('data', b'Hello world') + content = writer.get_serialized_content().decode('utf-8') + parse_node = FormParseNode(content) + result = parse_node.get_child_node('data').get_bytes_value() + assert result == b'Hello world' + + +def test_get_bytes_value_invalid_base64(): + parse_node = FormParseNode('abc') + assert parse_node.get_bytes_value() is None + + +def test_get_collection_of_bytes_values(): + parse_node = FormParseNode('data=SGVsbG8%3D&data=d29ybGQ%3D') + result = parse_node.get_child_node('data').get_collection_of_primitive_values(bytes) + assert result == [b'Hello', b'world'] def test_get_collection_of_numerical_primitive_values(): TEST_FORM_DATA = "numbers=1&numbers=2&numbers=3&"