From 0b183960bb06d63fa219635876bbe23053e6e0d1 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Fri, 9 Sep 2016 13:14:38 +0200 Subject: [PATCH 1/3] Ensure removeAllListeners on all error event in RequestHeaderParser --- src/RequestHeaderParser.php | 2 +- tests/RequestHeaderParserTest.php | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/RequestHeaderParser.php b/src/RequestHeaderParser.php index 4e4db46f..ca9d57f7 100644 --- a/src/RequestHeaderParser.php +++ b/src/RequestHeaderParser.php @@ -19,7 +19,7 @@ public function feed($data) { if (strlen($this->buffer) + strlen($data) > $this->maxSize) { $this->emit('error', array(new \OverflowException("Maximum header size of {$this->maxSize} exceeded."), $this)); - + $this->removeAllListeners(); return; } diff --git a/tests/RequestHeaderParserTest.php b/tests/RequestHeaderParserTest.php index b2fa87dc..ccb66ee0 100644 --- a/tests/RequestHeaderParserTest.php +++ b/tests/RequestHeaderParserTest.php @@ -99,24 +99,27 @@ public function testHeadersEventShouldParsePathAndQueryString() public function testHeaderOverflowShouldEmitError() { $error = null; - $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; }); + $this->assertSame(1, count($parser->listeners('headers'))); + $this->assertSame(1, count($parser->listeners('error'))); + $data = str_repeat('A', 4097); $parser->feed($data); $this->assertInstanceOf('OverflowException', $error); $this->assertSame('Maximum header size of 4096 exceeded.', $error->getMessage()); + $this->assertSame(0, count($parser->listeners('headers'))); + $this->assertSame(0, count($parser->listeners('error'))); } public function testGuzzleRequestParseException() { $error = null; - $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { From 6b667d34f7ea4d7489d65bf97ca80ad50e2c4e8b Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Fri, 9 Sep 2016 13:21:46 +0200 Subject: [PATCH 2/3] Ensure all error events from RequestHeaderParser emit $this as second item in event --- src/RequestHeaderParser.php | 2 +- tests/RequestHeaderParserTest.php | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/RequestHeaderParser.php b/src/RequestHeaderParser.php index ca9d57f7..1ea99fce 100644 --- a/src/RequestHeaderParser.php +++ b/src/RequestHeaderParser.php @@ -29,7 +29,7 @@ public function feed($data) try { $this->parseAndEmitRequest(); } catch (Exception $exception) { - $this->emit('error', [$exception]); + $this->emit('error', [$exception, $this]); } $this->removeAllListeners(); diff --git a/tests/RequestHeaderParserTest.php b/tests/RequestHeaderParserTest.php index ccb66ee0..9ba18425 100644 --- a/tests/RequestHeaderParserTest.php +++ b/tests/RequestHeaderParserTest.php @@ -99,10 +99,13 @@ public function testHeadersEventShouldParsePathAndQueryString() public function testHeaderOverflowShouldEmitError() { $error = null; + $passedParser = null; + $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableNever()); - $parser->on('error', function ($message) use (&$error) { + $parser->on('error', function ($message, $parser) use (&$error, &$passedParser) { $error = $message; + $passedParser = $parser; }); $this->assertSame(1, count($parser->listeners('headers'))); @@ -113,6 +116,7 @@ public function testHeaderOverflowShouldEmitError() $this->assertInstanceOf('OverflowException', $error); $this->assertSame('Maximum header size of 4096 exceeded.', $error->getMessage()); + $this->assertSame($parser, $passedParser); $this->assertSame(0, count($parser->listeners('headers'))); $this->assertSame(0, count($parser->listeners('error'))); } @@ -120,10 +124,13 @@ public function testHeaderOverflowShouldEmitError() public function testGuzzleRequestParseException() { $error = null; + $passedParser = null; + $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableNever()); - $parser->on('error', function ($message) use (&$error) { + $parser->on('error', function ($message, $parser) use (&$error, &$passedParser) { $error = $message; + $passedParser = $parser; }); $this->assertSame(1, count($parser->listeners('headers'))); @@ -133,6 +140,7 @@ public function testGuzzleRequestParseException() $this->assertInstanceOf('InvalidArgumentException', $error); $this->assertSame('Invalid message', $error->getMessage()); + $this->assertSame($parser, $passedParser); $this->assertSame(0, count($parser->listeners('headers'))); $this->assertSame(0, count($parser->listeners('error'))); } From 7569bd9818991fc211e8595707692928bc356865 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Sun, 23 Oct 2016 01:42:19 +0200 Subject: [PATCH 3/3] Reverted emitting $this with error --- src/RequestHeaderParser.php | 2 +- tests/RequestHeaderParserTest.php | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/RequestHeaderParser.php b/src/RequestHeaderParser.php index 1ea99fce..ca9d57f7 100644 --- a/src/RequestHeaderParser.php +++ b/src/RequestHeaderParser.php @@ -29,7 +29,7 @@ public function feed($data) try { $this->parseAndEmitRequest(); } catch (Exception $exception) { - $this->emit('error', [$exception, $this]); + $this->emit('error', [$exception]); } $this->removeAllListeners(); diff --git a/tests/RequestHeaderParserTest.php b/tests/RequestHeaderParserTest.php index 9ba18425..807af42c 100644 --- a/tests/RequestHeaderParserTest.php +++ b/tests/RequestHeaderParserTest.php @@ -124,13 +124,11 @@ public function testHeaderOverflowShouldEmitError() public function testGuzzleRequestParseException() { $error = null; - $passedParser = null; $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableNever()); - $parser->on('error', function ($message, $parser) use (&$error, &$passedParser) { + $parser->on('error', function ($message) use (&$error) { $error = $message; - $passedParser = $parser; }); $this->assertSame(1, count($parser->listeners('headers'))); @@ -140,7 +138,6 @@ public function testGuzzleRequestParseException() $this->assertInstanceOf('InvalidArgumentException', $error); $this->assertSame('Invalid message', $error->getMessage()); - $this->assertSame($parser, $passedParser); $this->assertSame(0, count($parser->listeners('headers'))); $this->assertSame(0, count($parser->listeners('error'))); }