Fixed url parsing for unicode characters.

This commit is contained in:
Simon Sessingø
2017-08-23 21:04:11 +01:00
parent ea255baec3
commit 65c811356d
14 changed files with 41 additions and 32 deletions
+2 -2
View File
@@ -706,7 +706,7 @@ class CustomExceptionHandler implements IExceptionHandler
/* You can use the exception handler to format errors depending on the request and type. */ /* You can use the exception handler to format errors depending on the request and type. */
if (stripos($request->getUri(), '/api') !== false) { if (stripos($request->getUri()->getPath(), '/api') !== false) {
response()->json([ response()->json([
'error' => $error->getMessage(), 'error' => $error->getMessage(),
@@ -1091,7 +1091,7 @@ class CustomRouterRules implement IRouterBootManager {
// If the current uri matches the url, we use our custom route // If the current uri matches the url, we use our custom route
if($request->getUri() === $url) { if($request->getUri()->getPath() === $url) {
$request->setRewriteUrl($rule); $request->setRewriteUrl($rule);
return $request; return $request;
} }
@@ -41,9 +41,9 @@ class BaseCsrfVerifier implements IMiddleware
$url = rtrim($url, '/'); $url = rtrim($url, '/');
if ($url[strlen($url) - 1] === '*') { if ($url[strlen($url) - 1] === '*') {
$url = rtrim($url, '*'); $url = rtrim($url, '*');
$skip = (stripos($request->getUri(), $url) === 0); $skip = (stripos($request->getUri()->getPath(), $url) === 0);
} else { } else {
$skip = ($url === rtrim($request->getUri(), '/')); $skip = ($url === $request->getUri()->getPath());
} }
if ($skip === true) { if ($skip === true) {
+5 -5
View File
@@ -29,8 +29,8 @@ class Request
public function __construct() public function __construct()
{ {
$this->parseHeaders(); $this->parseHeaders();
$this->host = $this->getHeader('http-host'); $this->setHost($this->getHeader('http-host'));
$this->uri = urldecode($this->getHeader('request-uri')); $this->setUri(new Uri($this->getHeader('request-uri')));
$this->input = new Input($this); $this->input = new Input($this);
$this->method = strtolower($this->input->get('_method', $this->getHeader('request-method'), 'post')); $this->method = strtolower($this->input->get('_method', $this->getHeader('request-method'), 'post'));
} }
@@ -58,7 +58,7 @@ class Request
} }
/** /**
* @return string * @return Uri
*/ */
public function getUri() public function getUri()
{ {
@@ -215,9 +215,9 @@ class Request
} }
/** /**
* @param string $uri * @param Uri $uri
*/ */
public function setUri($uri) public function setUri(Uri $uri)
{ {
$this->uri = $uri; $this->uri = $uri;
} }
+1 -1
View File
@@ -41,7 +41,7 @@ class Response
public function refresh() public function refresh()
{ {
$this->redirect($this->request->getUri()); $this->redirect($this->request->getUri()->getPath());
} }
/** /**
+10 -3
View File
@@ -20,6 +20,11 @@ class Uri
{ {
$this->originalUrl = $url; $this->originalUrl = $url;
$this->data = array_merge($this->data, $this->parseUrl($url)); $this->data = array_merge($this->data, $this->parseUrl($url));
if (isset($this->data['path']) === true && $this->data['path'] !== '/') {
$this->data['path'] = rtrim($this->data['path'], '/') . '/';
}
} }
/** /**
@@ -122,12 +127,14 @@ class Uri
/** /**
* UTF-8 aware parse_url() replacement. * UTF-8 aware parse_url() replacement.
* @param string $url
* @param int $component
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
* @return array * @return array
*/ */
public function parseUrl($url) public function parseUrl($url, $component = -1)
{ {
$enc_url = preg_replace_callback( $encodedUrl = preg_replace_callback(
'%[^:/@?&=#]+%u', '%[^:/@?&=#]+%u',
function ($matches) { function ($matches) {
return urlencode($matches[0]); return urlencode($matches[0]);
@@ -135,7 +142,7 @@ class Uri
$url $url
); );
$parts = parse_url($enc_url); $parts = parse_url($encodedUrl, $component);
if ($parts === false) { if ($parts === false) {
throw new \InvalidArgumentException('Malformed URL: ' . $url); throw new \InvalidArgumentException('Malformed URL: ' . $url);
@@ -87,8 +87,6 @@ class RouteController extends LoadableRoute implements IControllerRoute
public function matchRoute($url, Request $request) public function matchRoute($url, Request $request)
{ {
$url = rtrim(parse_url($url, PHP_URL_PATH), '/') . '/';
/* Match global regular-expression for route */ /* Match global regular-expression for route */
$regexMatch = $this->matchRegex($request, $url); $regexMatch = $this->matchRegex($request, $url);
@@ -79,8 +79,6 @@ class RouteResource extends LoadableRoute implements IControllerRoute
public function matchRoute($url, Request $request) public function matchRoute($url, Request $request)
{ {
$url = rtrim(parse_url($url, PHP_URL_PATH), '/') . '/';
/* Match global regular-expression for route */ /* Match global regular-expression for route */
$regexMatch = $this->matchRegex($request, $url); $regexMatch = $this->matchRegex($request, $url);
@@ -14,8 +14,6 @@ class RouteUrl extends LoadableRoute
public function matchRoute($url, Request $request) public function matchRoute($url, Request $request)
{ {
$url = rtrim(parse_url($url, PHP_URL_PATH), '/') . '/';
/* Match global regular-expression for route */ /* Match global regular-expression for route */
$regexMatch = $this->matchRegex($request, $url); $regexMatch = $this->matchRegex($request, $url);
+9 -8
View File
@@ -122,7 +122,7 @@ class Router
$exceptionHandlers = []; $exceptionHandlers = [];
$url = ($this->request->getRewriteUrl() !== null) ? $this->request->getRewriteUrl() : $this->request->getUri(); $url = ($this->request->getRewriteUrl() !== null) ? $this->request->getRewriteUrl() : $this->request->getUri()->getPath();
/* @var $route IRoute */ /* @var $route IRoute */
for ($i = $max; $i >= 0; $i--) { for ($i = $max; $i >= 0; $i--) {
@@ -224,7 +224,7 @@ class Router
} }
} }
$url = ($this->request->getRewriteUrl() !== null) ? $this->request->getRewriteUrl() : $this->request->getUri(); $url = ($this->request->getRewriteUrl() !== null) ? $this->request->getRewriteUrl() : $this->request->getUri()->getPath();
$max = count($this->processedRoutes) - 1; $max = count($this->processedRoutes) - 1;
@@ -248,6 +248,7 @@ class Router
if ($rewriteRoute !== null) { if ($rewriteRoute !== null) {
$rewriteRoute->loadMiddleware($this->request); $rewriteRoute->loadMiddleware($this->request);
return $rewriteRoute->renderRoute($this->request); return $rewriteRoute->renderRoute($this->request);
} }
@@ -265,6 +266,7 @@ class Router
/* Render route */ /* Render route */
$routeNotAllowed = false; $routeNotAllowed = false;
$this->request->setLoadedRoute($route); $this->request->setLoadedRoute($route);
return $route->renderRoute($this->request); return $route->renderRoute($this->request);
break; break;
@@ -284,9 +286,9 @@ class Router
$rewriteUrl = $this->request->getRewriteUrl(); $rewriteUrl = $this->request->getRewriteUrl();
if ($rewriteUrl !== null) { if ($rewriteUrl !== null) {
$message = sprintf('Route not found: "%s" (rewrite from: "%s")', $rewriteUrl, $this->request->getUri()); $message = sprintf('Route not found: "%s" (rewrite from: "%s")', $rewriteUrl, $this->request->getUri()->getPath());
} else { } else {
$message = sprintf('Route not found: "%s"', $this->request->getUri()); $message = sprintf('Route not found: "%s"', $this->request->getUri()->getPath());
} }
$this->handleException(new NotFoundHttpException($message, 404)); $this->handleException(new NotFoundHttpException($message, 404));
@@ -300,7 +302,7 @@ class Router
*/ */
protected function handleException(\Exception $e) protected function handleException(\Exception $e)
{ {
$url = ($this->request->getRewriteUrl() !== null) ? $this->request->getRewriteUrl() : $this->request->getUri(); $url = ($this->request->getRewriteUrl() !== null) ? $this->request->getRewriteUrl() : $this->request->getUri()->getPath();
$max = count($this->exceptionHandlers); $max = count($this->exceptionHandlers);
@@ -323,6 +325,7 @@ class Router
if ($rewriteRoute !== null) { if ($rewriteRoute !== null) {
$rewriteRoute->loadMiddleware($this->request); $rewriteRoute->loadMiddleware($this->request);
return $rewriteRoute->renderRoute($this->request); return $rewriteRoute->renderRoute($this->request);
} }
@@ -443,9 +446,7 @@ class Router
/* Return current route if no options has been specified */ /* Return current route if no options has been specified */
if ($name === null && $parameters === null) { if ($name === null && $parameters === null) {
$url = rtrim(parse_url($this->request->getUri(), PHP_URL_PATH), '/'); return $this->request->getUri()->getPath() . $this->arrayToParams($getParams);
return (($url === '') ? '/' : $url . '/') . $this->arrayToParams($getParams);
} }
$loadedRoute = $this->request->getLoadedRoute(); $loadedRoute = $this->request->getLoadedRoute();
+1 -1
View File
@@ -7,7 +7,7 @@ class ExceptionHandlerFirst implements \Pecee\Handlers\IExceptionHandler
global $stack; global $stack;
$stack[] = static::class; $stack[] = static::class;
$request->setUri('/'); $request->setUri(new \Pecee\Http\Uri('/'));
return $request; return $request;
} }
@@ -7,7 +7,7 @@ class ExceptionHandlerSecond implements \Pecee\Handlers\IExceptionHandler
global $stack; global $stack;
$stack[] = static::class; $stack[] = static::class;
$request->setUri('/'); $request->setUri(new \Pecee\Http\Uri('/'));
return $request; return $request;
} }
+1 -1
View File
@@ -5,7 +5,7 @@ class TestRouter extends \Pecee\SimpleRouter\SimpleRouter
public static function debugNoReset($testUri, $testMethod = 'get') public static function debugNoReset($testUri, $testMethod = 'get')
{ {
static::request()->setUri($testUri); static::request()->setUri(new \Pecee\Http\Uri($testUri));
static::request()->setMethod($testMethod); static::request()->setMethod($testMethod);
static::start(); static::start();
+1 -1
View File
@@ -64,7 +64,7 @@ class RouteRewriteTest extends PHPUnit_Framework_TestCase
TestRouter::error(function (\Pecee\Http\Request $request, \Exception $error) { TestRouter::error(function (\Pecee\Http\Request $request, \Exception $error) {
if (strtolower($request->getUri()) == '/my/test') { if (strtolower($request->getUri()->getPath()) == '/my/test') {
$request->setRewriteUrl('/another-non-existing'); $request->setRewriteUrl('/another-non-existing');
return $request; return $request;
+8 -1
View File
@@ -31,7 +31,7 @@ class RouterUrlTest extends PHPUnit_Framework_TestCase
public function testUnicodeCharacters() public function testUnicodeCharacters()
{ {
// Test spanish characters // Test spanish characters
TestRouter::get('/cursos/listado/{listado?}/{category?}', 'DummyController@method1', ['defaultParameterRegex' => '[\w\p{L}\s-]+']); TestRouter::get('/cursos/listado/{listado?}/{category?}', 'DummyController@method1', ['defaultParameterRegex' => '[\w\p{L}\s-]+']);
TestRouter::debugNoReset('/cursos/listado/especialidad/cirugía local', 'get'); TestRouter::debugNoReset('/cursos/listado/especialidad/cirugía local', 'get');
$this->assertEquals('/cursos/listado/{listado?}/{category?}/', TestRouter::router()->getRequest()->getLoadedRoute()->getUrl()); $this->assertEquals('/cursos/listado/{listado?}/{category?}/', TestRouter::router()->getRequest()->getLoadedRoute()->getUrl());
@@ -40,6 +40,13 @@ class RouterUrlTest extends PHPUnit_Framework_TestCase
TestRouter::debugNoReset('/kategori/økse', 'get'); TestRouter::debugNoReset('/kategori/økse', 'get');
$this->assertEquals('/kategori/økse/', TestRouter::router()->getRequest()->getLoadedRoute()->getUrl()); $this->assertEquals('/kategori/økse/', TestRouter::router()->getRequest()->getLoadedRoute()->getUrl());
TestRouter::get('/test/{param}', 'DummyController@method1', ['defaultParameterRegex' => '[\w\p{L}\s-\í]+']);
TestRouter::debugNoReset('/test/Dermatología');
$parameters = TestRouter::request()->getLoadedRoute()->getParameters();
$this->assertEquals('Dermatología', $parameters['param']);
TestRouter::router()->reset(); TestRouter::router()->reset();
} }