on('headers', $this->expectCallableNever()); $parser->feed("GET / HTTP/1.1\r\n"); $parser->feed("Host: example.com:80\r\n"); $parser->feed("Connection: close\r\n"); $parser->removeAllListeners(); $parser->on('headers', $this->expectCallableOnce()); $parser->feed("\r\n"); } public function testFeedInOneGo() { $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableOnce()); $data = $this->createGetRequest(); $parser->feed($data); } public function testHeadersEventShouldReturnRequestAndBodyBuffer() { $request = null; $bodyBuffer = null; $parser = new RequestHeaderParser(); $parser->on('headers', function ($parsedRequest, $parsedBodyBuffer) use (&$request, &$bodyBuffer) { $request = $parsedRequest; $bodyBuffer = $parsedBodyBuffer; }); $data = $this->createGetRequest(); $data .= 'RANDOM DATA'; $parser->feed($data); $this->assertInstanceOf('React\Http\Request', $request); $this->assertSame('GET', $request->getMethod()); $this->assertSame('/', $request->getPath()); $this->assertSame(array(), $request->getQuery()); $this->assertSame('1.1', $request->getHttpVersion()); $this->assertSame(array('Host' => 'example.com:80', 'Connection' => 'close'), $request->getHeaders()); $this->assertSame('RANDOM DATA', $bodyBuffer); } public function testHeadersEventShouldReturnBinaryBodyBuffer() { $bodyBuffer = null; $parser = new RequestHeaderParser(); $parser->on('headers', function ($parsedRequest, $parsedBodyBuffer) use (&$bodyBuffer) { $bodyBuffer = $parsedBodyBuffer; }); $data = $this->createGetRequest(); $data .= "\0x01\0x02\0x03\0x04\0x05"; $parser->feed($data); $this->assertSame("\0x01\0x02\0x03\0x04\0x05", $bodyBuffer); } public function testHeadersEventShouldParsePathAndQueryString() { $request = null; $parser = new RequestHeaderParser(); $parser->on('headers', function ($parsedRequest, $parsedBodyBuffer) use (&$request) { $request = $parsedRequest; }); $data = $this->createAdvancedPostRequest(); $parser->feed($data); $this->assertInstanceOf('React\Http\Request', $request); $this->assertSame('POST', $request->getMethod()); $this->assertSame('/foo', $request->getPath()); $this->assertSame(array('bar' => 'baz'), $request->getQuery()); $this->assertSame('1.1', $request->getHttpVersion()); $headers = array( 'Host' => 'example.com:80', 'User-Agent' => 'react/alpha', 'Connection' => 'close', ); $this->assertSame($headers, $request->getHeaders()); } public function testHeaderOverflowShouldEmitError() { $error = null; $parser = new RequestHeaderParser(); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; }); $data = str_repeat('A', 4097); $parser->feed($data); $this->assertInstanceOf('OverflowException', $error); $this->assertSame('Maximum header size of 4096 exceeded.', $error->getMessage()); } private function createGetRequest() { $data = "GET / HTTP/1.1\r\n"; $data .= "Host: example.com:80\r\n"; $data .= "Connection: close\r\n"; $data .= "\r\n"; return $data; } private function createAdvancedPostRequest() { $data = "POST /foo?bar=baz HTTP/1.1\r\n"; $data .= "Host: example.com:80\r\n"; $data .= "User-Agent: react/alpha\r\n"; $data .= "Connection: close\r\n"; $data .= "\r\n"; return $data; } }