Skip to content

Commit bcc97da

Browse files
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.
1 parent 45bad36 commit bcc97da

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

‎packages/serialization/form/kiota_serialization_form/form_parse_node.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import base64
34
import warnings
45
from collections import defaultdict
56
from collections.abc import Callable
@@ -380,7 +381,7 @@ def _get_time_value(value: str) -> Optional[time]:
380381
def _get_bytes_value(value: str) -> Optional[bytes]:
381382
if value and value != "null":
382383
try:
383-
return str(value).encode("utf-8")
384+
return base64.b64decode(value)
384385
except:
385386
return None
386387
return None

‎packages/serialization/form/tests/unit/test_form_parse_node.py‎

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import base64
21
from datetime import date, datetime, time, timedelta, timezone
32
from enum import Enum
43
from uuid import UUID
@@ -134,7 +133,27 @@ def test_get_bytes_value():
134133
parse_node = FormParseNode('SGVsbG8gd29ybGQ%3D')
135134
result = parse_node.get_bytes_value()
136135
assert isinstance(result, bytes)
137-
assert base64.b64decode(result) == b'Hello world'
136+
assert result == b'Hello world'
137+
138+
139+
def test_get_bytes_value_round_trip():
140+
writer = FormSerializationWriter()
141+
writer.write_bytes_value('data', b'Hello world')
142+
content = writer.get_serialized_content().decode('utf-8')
143+
parse_node = FormParseNode(content)
144+
result = parse_node.get_child_node('data').get_bytes_value()
145+
assert result == b'Hello world'
146+
147+
148+
def test_get_bytes_value_invalid_base64():
149+
parse_node = FormParseNode('abc')
150+
assert parse_node.get_bytes_value() is None
151+
152+
153+
def test_get_collection_of_bytes_values():
154+
parse_node = FormParseNode('data=SGVsbG8%3D&data=d29ybGQ%3D')
155+
result = parse_node.get_child_node('data').get_collection_of_primitive_values(bytes)
156+
assert result == [b'Hello', b'world']
138157

139158
def test_get_collection_of_numerical_primitive_values():
140159
TEST_FORM_DATA = "numbers=1&numbers=2&numbers=3&"

0 commit comments

Comments
 (0)