Skip to content

Http Client mangles multiple-valued keys in parseMultipartBodyFormat #55732

@tobia

Description

@tobia

Laravel Version

12.x

PHP Version

8.4

Database Driver & Version

No response

Description

Premise: http post data often contains multiple values for the same key. This is needed to post the selection of checkbox widgets, select widgets with the multiple flag set, and others. Laravel's http client receives the post data and stores it internally as a keyed array, therefore the only way to post multiple values for a single key is to associate the key with an array of values:

Http::post('http://example.com/users', [
    'name' => 'Steve',
    'roles' => ['Network Administrator', 'Janitor'],
]);

This bug happens when the request includes both attached files, which forces it to be sent as multipart/form-data, and checkboxes or other input elements with multiple values.
The source of the bug is PendingRequest::parseMultipartBodyFormat in the following code:

is_array($value) ? $value : ['name' => $key, 'contents' => $value]

This fails to handle multiple value arrays, such as ['Network Administrator', 'Janitor'].

Steps To Reproduce

Use the Laravel Http client to make a POST request that includes both an attached file and a multiple-valued key. For example:

Http::attach(
    'attachment', file_get_contents('photo.jpg'), 'photo.jpg', ['Content-Type' => 'image/jpeg']
)->post('http://example.com/users', [
    'name' => 'Steve',
    'roles' => ['Network Administrator', 'Janitor'],
]);

This mangles the multiple-valued key and results in InvalidArgumentException: A 'contents' key is required.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions