From a9a3328876a0de1336850efe2cce732fa8d2c2e8 Mon Sep 17 00:00:00 2001 From: Maz Date: Mon, 7 Oct 2024 12:45:54 +0200 Subject: [PATCH 1/3] Accepts nested array in multipart option field value --- src/MultipartStream.php | 17 +++++++++++++++++ tests/MultipartStreamTest.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/MultipartStream.php b/src/MultipartStream.php index 43d718f6..171eccb6 100644 --- a/src/MultipartStream.php +++ b/src/MultipartStream.php @@ -91,6 +91,23 @@ private function addElement(AppendStream $stream, array $element): void } } + if (is_array($element['contents'])) { + $prepare = function ($contents, $key, $root = null) use ($stream, &$values, &$prepare) { + $fieldName = $root ? sprintf('%s[%s]', $root, $key) : $key; + + if (is_array($contents)) { + array_walk($contents, $prepare, $fieldName); + return; + } + + $this->addElement($stream, ['name' => $fieldName, 'contents' => Utils::streamFor($contents)]); + }; + + array_walk($element['contents'], $prepare, $element['name']); + + return; + } + $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { diff --git a/tests/MultipartStreamTest.php b/tests/MultipartStreamTest.php index ed778e0c..d1319008 100644 --- a/tests/MultipartStreamTest.php +++ b/tests/MultipartStreamTest.php @@ -127,6 +127,35 @@ public function testSerializesNonStringFields(): void self::assertSame($expected, (string) $b); } + public function testExpandNestedArrayFields(): void + { + $b = new MultipartStream([ + [ + 'name' => 'foo', + 'contents' => [ + ['key' => 'bar'], + ['key' => 'baz'] + ] + ] + ], 'boundary'); + + $expected = \implode('', [ + "--boundary\r\n", + "Content-Disposition: form-data; name=\"foo[0][key]\"\r\n", + "Content-Length: 3\r\n", + "\r\n", + "bar\r\n", + "--boundary\r\n", + "Content-Disposition: form-data; name=\"foo[1][key]\"\r\n", + "Content-Length: 3\r\n", + "\r\n", + "baz\r\n", + "--boundary--\r\n", + ]); + + self::assertSame($expected, (string) $b); + } + public function testSerializesFiles(): void { $f1 = Psr7\FnStream::decorate(Psr7\Utils::streamFor('foo'), [ From d4c93db3b2537bcbeb8f5051552774772608f257 Mon Sep 17 00:00:00 2001 From: Maz Date: Mon, 7 Oct 2024 12:58:45 +0200 Subject: [PATCH 2/3] Remove unused code --- src/MultipartStream.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultipartStream.php b/src/MultipartStream.php index 171eccb6..e3a62ca2 100644 --- a/src/MultipartStream.php +++ b/src/MultipartStream.php @@ -92,7 +92,7 @@ private function addElement(AppendStream $stream, array $element): void } if (is_array($element['contents'])) { - $prepare = function ($contents, $key, $root = null) use ($stream, &$values, &$prepare) { + $prepare = function ($contents, $key, $root = null) use ($stream, &$prepare) { $fieldName = $root ? sprintf('%s[%s]', $root, $key) : $key; if (is_array($contents)) { From 6d7ebf53e7cc4a6e06a8ca944a1ba38edf2e9585 Mon Sep 17 00:00:00 2001 From: Maz Date: Mon, 7 Oct 2024 13:04:33 +0200 Subject: [PATCH 3/3] codestyle --- src/MultipartStream.php | 3 ++- tests/MultipartStreamTest.php | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/MultipartStream.php b/src/MultipartStream.php index e3a62ca2..dad84c23 100644 --- a/src/MultipartStream.php +++ b/src/MultipartStream.php @@ -92,11 +92,12 @@ private function addElement(AppendStream $stream, array $element): void } if (is_array($element['contents'])) { - $prepare = function ($contents, $key, $root = null) use ($stream, &$prepare) { + $prepare = function ($contents, $key, $root = null) use ($stream, &$prepare): void { $fieldName = $root ? sprintf('%s[%s]', $root, $key) : $key; if (is_array($contents)) { array_walk($contents, $prepare, $fieldName); + return; } diff --git a/tests/MultipartStreamTest.php b/tests/MultipartStreamTest.php index d1319008..5d4f2197 100644 --- a/tests/MultipartStreamTest.php +++ b/tests/MultipartStreamTest.php @@ -134,9 +134,9 @@ public function testExpandNestedArrayFields(): void 'name' => 'foo', 'contents' => [ ['key' => 'bar'], - ['key' => 'baz'] - ] - ] + ['key' => 'baz'], + ], + ], ], 'boundary'); $expected = \implode('', [