From ee3f068b459fafe0f32fdecafb2070ad47c1d9bc Mon Sep 17 00:00:00 2001 From: Martijn Wennink Date: Thu, 4 Aug 2016 21:29:08 +0200 Subject: [PATCH 1/2] Fix url mismatch when the base path contains a space --- Slim/Http/Uri.php | 3 ++- tests/Http/UriTest.php | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Slim/Http/Uri.php b/Slim/Http/Uri.php index 6b877476a..bae3468bc 100644 --- a/Slim/Http/Uri.php +++ b/Slim/Http/Uri.php @@ -197,7 +197,8 @@ public static function createFromEnvironment(Environment $env) } // Path - $requestScriptName = parse_url($env->get('SCRIPT_NAME'), PHP_URL_PATH); + $envScriptName = str_replace(' ', '%20', $env->get('SCRIPT_NAME')); + $requestScriptName = parse_url($envScriptName, PHP_URL_PATH); $requestScriptDir = dirname($requestScriptName); // parse_url() requires a full URL. As we don't extract the domain name or scheme, diff --git a/tests/Http/UriTest.php b/tests/Http/UriTest.php index f09e3c729..0b4a2a053 100644 --- a/tests/Http/UriTest.php +++ b/tests/Http/UriTest.php @@ -555,6 +555,20 @@ public function testCreateEnvironmentWithBasePath() $this->assertEquals('http://localhost/foo/bar', (string) $uri); } + public function testCreateEnvironmentWithBasePathContainingSpace() + { + $environment = Environment::mock([ + 'SCRIPT_NAME' => '/foo bar/index.php', + 'REQUEST_URI' => '/foo%20bar/baz', + ]); + $uri = Uri::createFromEnvironment($environment); + + $this->assertEquals('/foo%20bar', $uri->getBasePath()); + $this->assertEquals('baz', $uri->getPath()); + + $this->assertEquals('http://localhost/foo%20bar/baz', (string) $uri); + } + public function testGetBaseUrl() { $environment = Environment::mock([ From df1591c944ef9e011029c6221bd8ceb107c4e94d Mon Sep 17 00:00:00 2001 From: Martijn Wennink Date: Wed, 12 Oct 2016 15:30:20 +0200 Subject: [PATCH 2/2] Use rawurldecode on the REQUST_URI instead of changing the SCRIPT_NAME --- Slim/Http/Uri.php | 4 ++-- tests/Http/UriTest.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Slim/Http/Uri.php b/Slim/Http/Uri.php index bae3468bc..2ade7437e 100644 --- a/Slim/Http/Uri.php +++ b/Slim/Http/Uri.php @@ -197,13 +197,13 @@ public static function createFromEnvironment(Environment $env) } // Path - $envScriptName = str_replace(' ', '%20', $env->get('SCRIPT_NAME')); - $requestScriptName = parse_url($envScriptName, PHP_URL_PATH); + $requestScriptName = parse_url($env->get('SCRIPT_NAME'), PHP_URL_PATH); $requestScriptDir = dirname($requestScriptName); // parse_url() requires a full URL. As we don't extract the domain name or scheme, // we use a stand-in. $requestUri = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_PATH); + $requestUri = rawurldecode($requestUri); $basePath = ''; $virtualPath = $requestUri; diff --git a/tests/Http/UriTest.php b/tests/Http/UriTest.php index 0b4a2a053..2fc5ff9c6 100644 --- a/tests/Http/UriTest.php +++ b/tests/Http/UriTest.php @@ -558,15 +558,15 @@ public function testCreateEnvironmentWithBasePath() public function testCreateEnvironmentWithBasePathContainingSpace() { $environment = Environment::mock([ - 'SCRIPT_NAME' => '/foo bar/index.php', - 'REQUEST_URI' => '/foo%20bar/baz', + 'SCRIPT_NAME' => "/f'oo bar/index.php", + 'REQUEST_URI' => "/f'oo%20bar/baz", ]); $uri = Uri::createFromEnvironment($environment); - $this->assertEquals('/foo%20bar', $uri->getBasePath()); + $this->assertEquals("/f%27oo%20bar", $uri->getBasePath()); $this->assertEquals('baz', $uri->getPath()); - $this->assertEquals('http://localhost/foo%20bar/baz', (string) $uri); + $this->assertEquals('http://localhost/f%27oo%20bar/baz', (string) $uri); } public function testGetBaseUrl()