diff --git a/src/RequestHeaderParser.php b/src/RequestHeaderParser.php index 6fb7d0b5..fc6d80bb 100644 --- a/src/RequestHeaderParser.php +++ b/src/RequestHeaderParser.php @@ -154,7 +154,7 @@ private function parseRequest($headers) } // ensure absolute-form request-target contains a valid URI - if (strpos($request->getRequestTarget(), '://') !== false) { + if (strpos($request->getRequestTarget(), '://') !== false && substr($request->getRequestTarget(), 0, 1) !== '/') { $parts = parse_url($request->getRequestTarget()); // make sure value contains valid host component (IP or hostname), but no fragment diff --git a/tests/RequestHeaderParserTest.php b/tests/RequestHeaderParserTest.php index cf200fb8..550b0934 100644 --- a/tests/RequestHeaderParserTest.php +++ b/tests/RequestHeaderParserTest.php @@ -234,6 +234,44 @@ public function testInvalidAbsoluteFormSchemeEmitsError() $this->assertSame('Invalid absolute-form request-target', $error->getMessage()); } + public function testOriginFormWithSchemeSeparatorInParam() + { + $request = null; + + $parser = new RequestHeaderParser(); + $parser->on('error', $this->expectCallableNever()); + $parser->on('headers', function ($parsedRequest, $parsedBodyBuffer) use (&$request) { + $request = $parsedRequest; + }); + + $parser->feed("GET /somepath?param=http://example.com HTTP/1.1\r\nHost: localhost\r\n\r\n"); + + $this->assertInstanceOf('Psr\Http\Message\RequestInterface', $request); + $this->assertSame('GET', $request->getMethod()); + $this->assertEquals('http://localhost/somepath?param=http://example.com', $request->getUri()); + $this->assertSame('1.1', $request->getProtocolVersion()); + $headers = array( + 'Host' => array('localhost') + ); + $this->assertSame($headers, $request->getHeaders()); + } + + public function testUriStartingWithColonSlashSlashFails() + { + $error = null; + + $parser = new RequestHeaderParser(); + $parser->on('headers', $this->expectCallableNever()); + $parser->on('error', function ($message) use (&$error) { + $error = $message; + }); + + $parser->feed("GET ://example.com:80/ HTTP/1.0\r\n\r\n"); + + $this->assertInstanceOf('InvalidArgumentException', $error); + $this->assertSame('Invalid request string', $error->getMessage()); + } + public function testInvalidAbsoluteFormWithFragmentEmitsError() { $error = null;