diff --git a/src/Request.php b/src/Request.php index 3f53ceb..714eefc 100644 --- a/src/Request.php +++ b/src/Request.php @@ -132,7 +132,11 @@ public function handleData($data) $this->buffer .= $data; if (false !== strpos($this->buffer, "\r\n\r\n")) { - list($response, $bodyChunk) = $this->parseResponse($this->buffer); + try { + list($response, $bodyChunk) = $this->parseResponse($this->buffer); + } catch (\InvalidArgumentException $exception) { + $this->emit('error', [$exception, $this]); + } $this->buffer = null; @@ -141,6 +145,10 @@ public function handleData($data) $this->stream->removeListener('end', array($this, 'handleEnd')); $this->stream->removeListener('error', array($this, 'handleError')); + if (!isset($response)) { + return; + } + $this->response = $response; $response->on('end', function () { diff --git a/tests/RequestTest.php b/tests/RequestTest.php index 3008f14..9142334 100644 --- a/tests/RequestTest.php +++ b/tests/RequestTest.php @@ -220,6 +220,28 @@ public function requestShouldEmitErrorIfConnectionEmitsError() $request->handleError(new \Exception('test')); } + /** @test */ + public function requestShouldEmitErrorIfGuzzleParseThrowsException() + { + $requestData = new RequestData('GET', 'http://www.example.com'); + $request = new Request($this->connector, $requestData); + + $this->successfulConnectionMock(); + + $handler = $this->createCallableMock(); + $handler->expects($this->once()) + ->method('__invoke') + ->with( + $this->isInstanceOf('\InvalidArgumentException'), + $this->isInstanceOf('React\HttpClient\Request') + ); + + $request->on('error', $handler); + + $request->writeHead(); + $request->handleData("\r\n\r\n"); + } + /** * @test * @expectedException Exception