diff --git a/src/StreamingBodyParser/FormUrlencodedParser.php b/src/StreamingBodyParser/FormUrlencodedParser.php new file mode 100644 index 00000000..f030ac22 --- /dev/null +++ b/src/StreamingBodyParser/FormUrlencodedParser.php @@ -0,0 +1,57 @@ +getHeaders(); + $headers = array_change_key_case($headers, CASE_LOWER); + + $this->promise = ContentLengthBufferedSink::createPromise( + $request, + $headers['content-length'] + )->then([$this, 'finish']); + } + + /** + * @param string $buffer + */ + public function finish($buffer) + { + parse_str(trim($buffer), $result); + foreach ($result as $key => $value) { + $this->emit('post', [$key, $value]); + } + $this->emit('end'); + } + + public function cancel() + { + $this->promise->cancel(); + } +} diff --git a/tests/StreamingBodyParser/FormUrlencodedParserTest.php b/tests/StreamingBodyParser/FormUrlencodedParserTest.php new file mode 100644 index 00000000..81bbb605 --- /dev/null +++ b/tests/StreamingBodyParser/FormUrlencodedParserTest.php @@ -0,0 +1,32 @@ + 79, + ]); + $parser = new FormUrlencodedParser($request); + $parser->on('post', function ($key, $value) use (&$post) { + $post[] = [$key, $value]; + }); + $request->emit('data', ['user=single&user2=second&us']); + $request->emit('data', ['ers%5B%5D=first+in+array&users%5B%5D=second+in+array']); + $this->assertEquals( + [ + ['user', 'single'], + ['user2', 'second'], + ['users', ['first in array', 'second in array']], + ], + $post + ); + } +}