Skip to content

Commit 27036b8

Browse files
authored
[Python] Fix multipart when files part is optional (#9144)
fix #9136 Related PR: - [ ] #9139
1 parent b1176f5 commit 27036b8

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
changeKind: fix
3+
packages:
4+
- "@typespec/http-client-python"
5+
---
6+
7+
Fix multipart when files part is optional

packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ def _serialize_body_parameter(self, builder: OperationType) -> list[str]:
679679
")",
680680
f"_file_fields: list[str] = {file_fields}",
681681
f"_data_fields: list[str] = {data_fields}",
682-
"_files, _data = prepare_multipart_form_data(_body, _file_fields, _data_fields)",
682+
"_files = prepare_multipart_form_data(_body, _file_fields, _data_fields)",
683683
]
684684
)
685685
return retval
@@ -861,7 +861,6 @@ def _create_request_builder_call(
861861
retval.append(f" {client_name}=_{client_name},")
862862
elif request_builder.has_form_data_body:
863863
retval.append(" files=_files,")
864-
retval.append(" data=_data,")
865864
elif request_builder.overloads:
866865
seen_body_params = set()
867866
for overload in request_builder.overloads:

packages/http-client-python/generator/pygen/codegen/templates/utils.py.jinja2

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,21 @@ def serialize_multipart_data_entry(data_entry: Any) -> Any:
7878

7979
def prepare_multipart_form_data(
8080
body: Mapping[str, Any], multipart_fields: list[str], data_fields: list[str]
81-
) -> tuple[list[FileType], dict[str, Any]]:
81+
) -> list[FileType]:
8282
files: list[FileType] = []
83-
data: dict[str, Any] = {}
8483
for multipart_field in multipart_fields:
8584
multipart_entry = body.get(multipart_field)
8685
if isinstance(multipart_entry, list):
8786
files.extend([(multipart_field, e) for e in multipart_entry ])
8887
elif multipart_entry:
8988
files.append((multipart_field, multipart_entry))
9089

90+
# if files is empty, sdk core library can't handle multipart/form-data correctly, so
91+
# we put data fields into files with filename as None to avoid that scenario.
9192
for data_field in data_fields:
9293
data_entry = body.get(data_field)
9394
if data_entry:
94-
data[data_field] = serialize_multipart_data_entry(data_entry)
95+
files.append((data_field, str(serialize_multipart_data_entry(data_entry))))
9596

96-
return files, data
97+
return files
9798
{% endif %}

0 commit comments

Comments
 (0)