diff --git a/src/RequestParser.php b/src/RequestParser.php index c4b913b8..b7bd1c55 100644 --- a/src/RequestParser.php +++ b/src/RequestParser.php @@ -70,10 +70,11 @@ protected function isRequestComplete() // if the content is present and has the // right length, we're good to go - if (array_key_exists('Content-Length', $headers) && strlen($this->buffer) >= $headers['Content-Length']) { + // NOTE: "right length" means body should have exactly "Content-Length" bytes + if (array_key_exists('Content-Length', $headers) && strlen($this->buffer) === (int) $headers['Content-Length']) { // store the expected content length - $this->length = $this->request->getHeaders()['Content-Length']; + $this->length = (int) $this->request->getHeaders()['Content-Length']; return true; } diff --git a/tests/RequestParserTest.php b/tests/RequestParserTest.php index 728166b3..c09ce506 100644 --- a/tests/RequestParserTest.php +++ b/tests/RequestParserTest.php @@ -110,10 +110,11 @@ public function testShouldReceiveBodyContent() $body = $parsedBodyBuffer; }); - $data = $this->createAdvancedPostRequest('', 17); + $len = strlen($content1.$content2); + $data = $this->createAdvancedPostRequest('', $len); $parser->feed($data); $parser->feed($content1); - $parser->feed($content2 . "\r\n"); + $parser->feed($content2); $this->assertInstanceOf('React\Http\Request', $request); $this->assertEquals($content1 . $content2, $request->getBody()); @@ -152,7 +153,7 @@ public function testShouldReceivePostInBody() $parser->on('headers', function ($parsedRequest, $parsedBodyBuffer) use (&$request, &$body) { $request = $parsedRequest; $body = $parsedBodyBuffer; - }); + }); $parser->feed($this->createPostWithContent()); @@ -239,6 +240,9 @@ private function createAdvancedPostRequest($content = '', $len = 0) $data .= "Connection: close\r\n"; if($len) { $data .= "Content-Length: $len\r\n"; + } elseif ($content) { + $len = strlen($content); + $data .= "Content-Length: {$len}\r\n"; } $data .= "\r\n"; $data .= $content; @@ -255,55 +259,57 @@ private function createPostWithContent() $data .= "Content-Type: application/x-www-form-urlencoded\r\n"; $data .= "Content-Length: 79\r\n"; $data .= "\r\n"; - $data .= "user=single&user2=second&users%5B%5D=first+in+array&users%5B%5D=second+in+array\r\n"; + $data .= "user=single&user2=second&users%5B%5D=first+in+array&users%5B%5D=second+in+array"; return $data; } private function createMultipartRequest() { - $data = "POST / HTTP/1.1\r\n"; - $data .= "Host: localhost:8080\r\n"; - $data .= "Connection: close\r\n"; - $data .= "Content-Type: multipart/form-data; boundary=---------------------------12758086162038677464950549563\r\n"; - $data .= "Content-Length: 1097\r\n"; - $data .= "\r\n"; - - $data .= "-----------------------------12758086162038677464950549563\r\n"; - $data .= "Content-Disposition: form-data; name=\"user\"\r\n"; - $data .= "\r\n"; - $data .= "single\r\n"; - $data .= "-----------------------------12758086162038677464950549563\r\n"; - $data .= "Content-Disposition: form-data; name=\"user2\"\r\n"; - $data .= "\r\n"; - $data .= "second\r\n"; - $data .= "-----------------------------12758086162038677464950549563\r\n"; - $data .= "Content-Disposition: form-data; name=\"users[]\"\r\n"; - $data .= "\r\n"; - $data .= "first in array\r\n"; - $data .= "-----------------------------12758086162038677464950549563\r\n"; - $data .= "Content-Disposition: form-data; name=\"users[]\"\r\n"; - $data .= "\r\n"; - $data .= "second in array\r\n"; - $data .= "-----------------------------12758086162038677464950549563\r\n"; - $data .= "Content-Disposition: form-data; name=\"file\"; filename=\"User.php\"\r\n"; - $data .= "Content-Type: text/php\r\n"; - $data .= "\r\n"; - $data .= "