[python] fixes multipart/form-data bug (#13926)

* api_client template updated

* Samples regenerated

* Fixes tests

* Adds missing test file

* Adds test fix
This commit is contained in:
Justin Black
2022-11-05 17:10:24 +01:00
committed by GitHub
parent d5f896fe20
commit b35ea31e82
7 changed files with 193 additions and 99 deletions

View File

@@ -1389,24 +1389,24 @@ class RequestBody(StyleFormSerializer, JSONDetector):
def __multipart_json_item(self, key: str, value: Schema) -> RequestField:
json_value = self.__json_encoder.default(value)
return RequestField(name=key, data=json.dumps(json_value), headers={'Content-Type': 'application/json'})
request_field = RequestField(name=key, data=json.dumps(json_value))
request_field.make_multipart(content_type='application/json')
return request_field
def __multipart_form_item(self, key: str, value: Schema) -> RequestField:
if isinstance(value, str):
return RequestField(name=key, data=str(value), headers={'Content-Type': 'text/plain'})
request_field = RequestField(name=key, data=str(value))
request_field.make_multipart(content_type='text/plain')
elif isinstance(value, bytes):
return RequestField(name=key, data=value, headers={'Content-Type': 'application/octet-stream'})
request_field = RequestField(name=key, data=value)
request_field.make_multipart(content_type='application/octet-stream')
elif isinstance(value, FileIO):
request_field = RequestField(
name=key,
data=value.read(),
filename=os.path.basename(value.name),
headers={'Content-Type': 'application/octet-stream'}
)
# TODO use content.encoding to limit allowed content types if they are present
request_field = RequestField.from_tuples(key, (os.path.basename(value.name), value.read()))
value.close()
return request_field
else:
return self.__multipart_json_item(key=key, value=value)
request_field = self.__multipart_json_item(key=key, value=value)
return request_field
def __serialize_multipart_form_data(
self, in_data: Schema
@@ -1496,4 +1496,4 @@ class RequestBody(StyleFormSerializer, JSONDetector):
return self.__serialize_application_x_www_form_data(cast_in_data)
elif content_type == 'application/octet-stream':
return self.__serialize_application_octet_stream(cast_in_data)
raise NotImplementedError('Serialization has not yet been implemented for {}'.format(content_type))
raise NotImplementedError('Serialization has not yet been implemented for {}'.format(content_type))