diff --git a/src/RequestHeaderParser.php b/src/RequestHeaderParser.php index a6126da9..a04475c0 100644 --- a/src/RequestHeaderParser.php +++ b/src/RequestHeaderParser.php @@ -15,15 +15,20 @@ class RequestHeaderParser extends EventEmitter { private $buffer = ''; - private $maxSize = 4096; + private $maxSize; private $localSocketUri; private $remoteSocketUri; - public function __construct($localSocketUri = null, $remoteSocketUri = null) + public function __construct($localSocketUri = null, $remoteSocketUri = null, $maxSize = 4096) { + if (!is_integer($maxSize)) { + throw new \InvalidArgumentException('Invalid type for maxSize provided. Expected an integer value.'); + } + $this->localSocketUri = $localSocketUri; $this->remoteSocketUri = $remoteSocketUri; + $this->maxSize = $maxSize; } public function feed($data) diff --git a/tests/RequestHeaderParserTest.php b/tests/RequestHeaderParserTest.php index 550b0934..52e7e206 100644 --- a/tests/RequestHeaderParserTest.php +++ b/tests/RequestHeaderParserTest.php @@ -6,6 +6,14 @@ class RequestHeaderParserTest extends TestCase { + + public function testMaxSizeParameterShouldFailOnWrongType() + { + $this->setExpectedException('InvalidArgumentException', 'Invalid type for maxSize provided. Expected an integer value.'); + + new RequestHeaderParser(null, null, 'abc'); + } + public function testSplitShouldHappenOnDoubleCrlf() { $parser = new RequestHeaderParser(); @@ -124,6 +132,29 @@ public function testHeaderEventViaHttpsShouldApplySchemeFromConstructor() $this->assertEquals('example.com', $request->getHeaderLine('Host')); } + public function testCustomBufferSizeOverflowShouldEmitError() + { + $error = null; + $passedParser = null; + $newCustomBufferSize = 1024 * 16; + + $parser = new RequestHeaderParser(null, null, $newCustomBufferSize); + $parser->on('headers', $this->expectCallableNever()); + $parser->on('error', function ($message, $parser) use (&$error, &$passedParser) { + $error = $message; + $passedParser = $parser; + }); + + $this->assertSame(1, count($parser->listeners('headers'))); + $this->assertSame(1, count($parser->listeners('error'))); + + $data = str_repeat('A', $newCustomBufferSize + 1); + $parser->feed($data); + + $this->assertInstanceOf('OverflowException', $error); + $this->assertSame('Maximum header size of ' . $newCustomBufferSize . ' exceeded.', $error->getMessage()); + } + public function testHeaderOverflowShouldEmitError() { $error = null;