-
Notifications
You must be signed in to change notification settings - Fork 11.5k
Description
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.