From 935b3eabbcf3622ec5d71f24a5a1d945a42cc8f7 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Wed, 5 Oct 2016 08:44:27 +0200 Subject: [PATCH 1/2] Form URLEncoded parser (not updated to new interface yet) --- .../FormUrlencodedParser.php | 37 +++++++++++++++++++ .../FormUrlencodedParserTest.php | 32 ++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/StreamingBodyParser/FormUrlencodedParser.php create mode 100644 tests/StreamingBodyParser/FormUrlencodedParserTest.php diff --git a/src/StreamingBodyParser/FormUrlencodedParser.php b/src/StreamingBodyParser/FormUrlencodedParser.php new file mode 100644 index 00000000..a3f6f88b --- /dev/null +++ b/src/StreamingBodyParser/FormUrlencodedParser.php @@ -0,0 +1,37 @@ +getHeaders(); + $headers = array_change_key_case($headers, CASE_LOWER); + + 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'); + } +} 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 + ); + } +} From 9b6e0afbd9dd9640a2a7a0d5e37253b786e936f0 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Wed, 5 Oct 2016 16:54:34 +0200 Subject: [PATCH 2/2] Implement cancelable promise --- .../FormUrlencodedParser.php | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/StreamingBodyParser/FormUrlencodedParser.php b/src/StreamingBodyParser/FormUrlencodedParser.php index a3f6f88b..f030ac22 100644 --- a/src/StreamingBodyParser/FormUrlencodedParser.php +++ b/src/StreamingBodyParser/FormUrlencodedParser.php @@ -4,20 +4,35 @@ use Evenement\EventEmitterTrait; use React\Http\Request; +use React\Promise\CancellablePromiseInterface; class FormUrlencodedParser implements ParserInterface { use EventEmitterTrait; + /** + * @var CancellablePromiseInterface + */ + private $promise; + + /** + * @param Request $request + * @return ParserInterface + */ + public static function create(Request $request) + { + return new static($request); + } + /** * @param Request $request */ - public function __construct(Request $request) + private function __construct(Request $request) { $headers = $request->getHeaders(); $headers = array_change_key_case($headers, CASE_LOWER); - ContentLengthBufferedSink::createPromise( + $this->promise = ContentLengthBufferedSink::createPromise( $request, $headers['content-length'] )->then([$this, 'finish']); @@ -34,4 +49,9 @@ public function finish($buffer) } $this->emit('end'); } + + public function cancel() + { + $this->promise->cancel(); + } }