diff --git a/playwright/_impl/_fetch.py b/playwright/_impl/_fetch.py index b53e4e629..c9799e11a 100644 --- a/playwright/_impl/_fetch.py +++ b/playwright/_impl/_fetch.py @@ -39,6 +39,7 @@ async_readfile, async_writefile, is_file_payload, + is_file_array_payload, locals_to_params, object_to_array, to_impl, @@ -381,13 +382,12 @@ async def _inner_fetch( # Convert file-like values to ServerFilePayload structs. for name, value in multipart.items(): if is_file_payload(value): - payload = cast(FilePayload, value) - assert isinstance( - payload["buffer"], bytes - ), f"Unexpected buffer type of 'data.{name}'" - multipart_data.append( - FormField(name=name, file=file_payload_to_json(payload)) - ) + file_payload_json = get_file_payload(name, value) + multipart_data.append(FormField(name=name, file=file_payload_json)) + elif is_file_array_payload(value): + for value_item in value: + file_payload_json = get_file_payload(name, value_item) + multipart_data.append(FormField(name=name, file=file_payload_json)) elif isinstance(value, str): multipart_data.append(FormField(name=name, value=value)) if ( @@ -435,6 +435,14 @@ async def storage_state( return result +def get_file_payload(name: str, value: Optional[Any]): + payload = cast(FilePayload, value) + assert isinstance( + payload["buffer"], bytes + ), f"Unexpected buffer type of 'data.{name}', filename='{payload.filename}'" + return file_payload_to_json(payload) + + def file_payload_to_json(payload: FilePayload) -> ServerFilePayload: return ServerFilePayload( name=payload["name"], diff --git a/playwright/_impl/_helper.py b/playwright/_impl/_helper.py index 2f7ab57b0..8c06dee31 100644 --- a/playwright/_impl/_helper.py +++ b/playwright/_impl/_helper.py @@ -442,6 +442,13 @@ def is_file_payload(value: Optional[Any]) -> bool: ) +def is_file_array_payload(value: Optional[Any]) -> bool: + return ( + isinstance(value, list) + and all(is_file_payload(x) for x in value) + ) + + TEXTUAL_MIME_TYPE = re.compile( r"^(text\/.*?|application\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\/svg(\+xml)?|application\/.*?(\+json|\+xml))(;\s*charset=.*)?$" )