From 42d9cb0bfd16df99cac137edc589e85ae2619969 Mon Sep 17 00:00:00 2001 From: Michal Skrzypecki Date: Tue, 15 Sep 2015 12:11:18 +0200 Subject: [PATCH 1/2] Inject array values to data for multipart --- src/MultipartContentParser.php | 6 +++- test/ContentTypeListenerTest.php | 30 ++++++++++++++++ test/TestAsset/multipart-form-data-array.txt | 37 ++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 test/TestAsset/multipart-form-data-array.txt diff --git a/src/MultipartContentParser.php b/src/MultipartContentParser.php index cd02211..0035115 100644 --- a/src/MultipartContentParser.php +++ b/src/MultipartContentParser.php @@ -87,6 +87,7 @@ public function parse() */ protected function parseFromStream($stream) { + $buffer = ''; $data = new Parameters(); $files = new Parameters(); $partInProgress = false; @@ -111,7 +112,8 @@ protected function parseFromStream($stream) // Time to handle the data we've already parsed! // Data if (! $filename) { - $data->set($name, rtrim($content, "\r\n")); + $content = rtrim($content, "\r\n"); + $buffer .= "$name=$content&"; } // File (successful upload so far) @@ -263,6 +265,8 @@ protected function parseFromStream($stream) $this->request->setFiles($files); } + $data->fromString(rtrim($buffer, '&')); + return $data->toArray(); } diff --git a/test/ContentTypeListenerTest.php b/test/ContentTypeListenerTest.php index f701718..934598a 100644 --- a/test/ContentTypeListenerTest.php +++ b/test/ContentTypeListenerTest.php @@ -502,4 +502,34 @@ public function testReturns400ResponseWhenBodyPartIsMissingName() $details = $result->getApiProblem()->toArray(); $this->assertContains('does not contain a "name" field', $details['detail']); } + + public function testReturnsArrayWhenFieldNamesHaveArraySyntax() + { + $request = new Request(); + $request->setMethod('PUT'); + $request->getHeaders()->addHeaderLine( + 'Content-Type', + 'multipart/form-data; boundary=6603ddd555b044dc9a022f3ad9281c20' + ); + $request->setContent(file_get_contents(__DIR__ . '/TestAsset/multipart-form-data-array.txt')); + $event = new MvcEvent(); + $event->setRequest($request); + $event->setRouteMatch(new RouteMatch([])); + $listener = $this->listener; + $result = $listener($event); + $parameterData = $event->getParam('ZFContentNegotiationParameterData'); + $params = $parameterData->getBodyParams(); + $this->assertEquals([ + 'string_value' => 'string_value', + 'array_name' => [ + 'array_name[0]', + 'array_name[1]', + 'a' => 'array_name[a]', + 'b' => [ + 0 => 'array_name[b][0]', + 'b' => 'array_name[b][b]', + ], + ], + ], $params); + } } diff --git a/test/TestAsset/multipart-form-data-array.txt b/test/TestAsset/multipart-form-data-array.txt new file mode 100644 index 0000000..d3a0504 --- /dev/null +++ b/test/TestAsset/multipart-form-data-array.txt @@ -0,0 +1,37 @@ +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="string_value" +Content-Type: text/plain + +string_value +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="array_name[]" +Content-Type: text/plain + +array_name[0] +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="array_name[]" +Content-Type: text/plain + +array_name[1] +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="array_name[a]" +Content-Type: text/plain + +array_name[a] +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="array_name[b]" +Content-Type: text/plain + +array_name[b] +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="array_name[b][]" +Content-Type: text/plain + +array_name[b][0] +--6603ddd555b044dc9a022f3ad9281c20 +Content-Disposition: form-data; name="array_name[b][b]" +Content-Type: text/plain + +array_name[b][b] + +--6603ddd555b044dc9a022f3ad9281c20-- \ No newline at end of file From b169073f6ae58f767d3c0376f14e5f812378ed1b Mon Sep 17 00:00:00 2001 From: Matias Fuster Date: Wed, 30 Mar 2016 14:17:22 -0300 Subject: [PATCH 2/2] - Fixed values that contain ampersand character. - Added failing test for strings with ampersand character --- src/MultipartContentParser.php | 2 +- test/ContentTypeListenerTest.php | 2 +- test/TestAsset/multipart-form-data-array.txt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MultipartContentParser.php b/src/MultipartContentParser.php index 0035115..cda7e32 100644 --- a/src/MultipartContentParser.php +++ b/src/MultipartContentParser.php @@ -113,7 +113,7 @@ protected function parseFromStream($stream) // Data if (! $filename) { $content = rtrim($content, "\r\n"); - $buffer .= "$name=$content&"; + $buffer .= "$name=".rawurlencode($content)."&"; } // File (successful upload so far) diff --git a/test/ContentTypeListenerTest.php b/test/ContentTypeListenerTest.php index 934598a..88e5716 100644 --- a/test/ContentTypeListenerTest.php +++ b/test/ContentTypeListenerTest.php @@ -520,7 +520,7 @@ public function testReturnsArrayWhenFieldNamesHaveArraySyntax() $parameterData = $event->getParam('ZFContentNegotiationParameterData'); $params = $parameterData->getBodyParams(); $this->assertEquals([ - 'string_value' => 'string_value', + 'string_value' => 'string_value_with&ersand', 'array_name' => [ 'array_name[0]', 'array_name[1]', diff --git a/test/TestAsset/multipart-form-data-array.txt b/test/TestAsset/multipart-form-data-array.txt index d3a0504..3bf1474 100644 --- a/test/TestAsset/multipart-form-data-array.txt +++ b/test/TestAsset/multipart-form-data-array.txt @@ -2,7 +2,7 @@ Content-Disposition: form-data; name="string_value" Content-Type: text/plain -string_value +string_value_with&ersand --6603ddd555b044dc9a022f3ad9281c20 Content-Disposition: form-data; name="array_name[]" Content-Type: text/plain @@ -34,4 +34,4 @@ Content-Type: text/plain array_name[b][b] ---6603ddd555b044dc9a022f3ad9281c20-- \ No newline at end of file +--6603ddd555b044dc9a022f3ad9281c20--