mirror of
https://github.com/skipperbent/simple-php-router.git
synced 2026-06-19 01:31:28 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ad765b9856 | |||
| 4778a8f29e | |||
| 847cb3e273 | |||
| 2b4ae2b211 | |||
| fa05d64a76 | |||
| b937b610de | |||
| 5ac747374b | |||
| d6642a7f7b | |||
| ebf9224407 | |||
| c635771fcd | |||
| 791d69b24d | |||
| aa654a3ac6 | |||
| 6c6d81d3c9 | |||
| fadb783d3c | |||
| 8c79b74e14 |
@@ -1036,6 +1036,17 @@ class CustomExceptionHandler implements IExceptionHandler
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
/* Other error */
|
||||
if($error instanceof MyCustomException) {
|
||||
|
||||
$request->setRewriteRoute(
|
||||
// Add new route based on current url (minus query-string) and add custom parameters.
|
||||
(new RouteUrl(url(null, null, []), 'PageController@error'))->setParameters(['exception' => $error])
|
||||
);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
throw $error;
|
||||
|
||||
|
||||
@@ -89,6 +89,7 @@ class InputItem implements ArrayAccess, IInputItem, IteratorAggregate
|
||||
return isset($this->value[$offset]);
|
||||
}
|
||||
|
||||
#[\ReturnTypeWillChange]
|
||||
public function offsetGet($offset): ?self
|
||||
{
|
||||
if ($this->offsetExists($offset) === true) {
|
||||
|
||||
@@ -17,13 +17,13 @@ class BaseCsrfVerifier implements IMiddleware
|
||||
* For example: /admin/*
|
||||
* @var array|null
|
||||
*/
|
||||
protected ?array $except = null;
|
||||
protected array $except = [];
|
||||
|
||||
/**
|
||||
* Urls to include. Can be used to include urls from a certain path.
|
||||
* @var array|null
|
||||
*/
|
||||
protected ?array $include = null;
|
||||
protected array $include = [];
|
||||
|
||||
/**
|
||||
* @var ITokenProvider
|
||||
@@ -38,6 +38,23 @@ class BaseCsrfVerifier implements IMiddleware
|
||||
$this->tokenProvider = new CookieTokenProvider();
|
||||
}
|
||||
|
||||
protected function isIncluded(Request $request): bool
|
||||
{
|
||||
if (count($this->include) > 0) {
|
||||
foreach ($this->include as $includeUrl) {
|
||||
$includeUrl = rtrim($includeUrl, '/');
|
||||
if ($includeUrl[strlen($includeUrl) - 1] === '*') {
|
||||
$includeUrl = rtrim($includeUrl, '*');
|
||||
return $request->getUrl()->contains($includeUrl);
|
||||
}
|
||||
|
||||
return ($includeUrl === rtrim($request->getUrl()->getRelativeUrl(false), '/'));
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the url matches the urls in the except property
|
||||
* @param Request $request
|
||||
@@ -45,11 +62,11 @@ class BaseCsrfVerifier implements IMiddleware
|
||||
*/
|
||||
protected function skip(Request $request): bool
|
||||
{
|
||||
if ($this->except === null || count($this->except) === 0) {
|
||||
if (count($this->except) === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach($this->except as $url) {
|
||||
foreach ($this->except as $url) {
|
||||
$url = rtrim($url, '/');
|
||||
if ($url[strlen($url) - 1] === '*') {
|
||||
$url = rtrim($url, '*');
|
||||
@@ -60,20 +77,9 @@ class BaseCsrfVerifier implements IMiddleware
|
||||
|
||||
if ($skip === true) {
|
||||
|
||||
if(is_array($this->include) === true && count($this->include) > 0) {
|
||||
foreach($this->include as $includeUrl) {
|
||||
$includeUrl = rtrim($includeUrl, '/');
|
||||
if ($includeUrl[strlen($includeUrl) - 1] === '*') {
|
||||
$includeUrl = rtrim($includeUrl, '*');
|
||||
$skip = !$request->getUrl()->contains($includeUrl);
|
||||
break;
|
||||
}
|
||||
$skip = !$this->isIncluded($request);
|
||||
|
||||
$skip = !($includeUrl === rtrim($request->getUrl()->getRelativeUrl(false), '/'));
|
||||
}
|
||||
}
|
||||
|
||||
if($skip === false) {
|
||||
if ($skip === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -92,12 +98,11 @@ class BaseCsrfVerifier implements IMiddleware
|
||||
*/
|
||||
public function handle(Request $request): void
|
||||
{
|
||||
if ($this->skip($request) === false && $request->isPostBack() === true) {
|
||||
if ($this->skip($request) === false && ($request->isPostBack() === true || $this->isIncluded($request) === true)) {
|
||||
|
||||
$token = $request->getInputHandler()->value(
|
||||
static::POST_KEY,
|
||||
$request->getHeader(static::HEADER_KEY),
|
||||
Request::$requestTypesPost
|
||||
);
|
||||
|
||||
if ($this->tokenProvider->validate((string)$token) === false) {
|
||||
|
||||
@@ -27,11 +27,11 @@ class ClassLoader implements IClassLoader
|
||||
* @param object $class
|
||||
* @param string $method
|
||||
* @param array $parameters
|
||||
* @return mixed
|
||||
* @return string
|
||||
*/
|
||||
public function loadClassMethod($class, string $method, array $parameters)
|
||||
public function loadClassMethod($class, string $method, array $parameters): string
|
||||
{
|
||||
return call_user_func_array([$class, $method], array_values($parameters));
|
||||
return (string)call_user_func_array([$class, $method], array_values($parameters));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -39,11 +39,11 @@ class ClassLoader implements IClassLoader
|
||||
*
|
||||
* @param Callable $closure
|
||||
* @param array $parameters
|
||||
* @return mixed
|
||||
* @return string
|
||||
*/
|
||||
public function loadClosure(Callable $closure, array $parameters)
|
||||
public function loadClosure(callable $closure, array $parameters): string
|
||||
{
|
||||
return call_user_func_array($closure, array_values($parameters));
|
||||
return (string)call_user_func_array($closure, array_values($parameters));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -35,7 +35,7 @@ class Router
|
||||
* @var bool
|
||||
*/
|
||||
protected bool $isProcessingRoute;
|
||||
|
||||
|
||||
/**
|
||||
* Defines all data from current processing route.
|
||||
* @var ILoadableRoute
|
||||
@@ -59,7 +59,7 @@ class Router
|
||||
* when a route is being processed.
|
||||
* @var array
|
||||
*/
|
||||
protected array$routeStack = [];
|
||||
protected array $routeStack = [];
|
||||
|
||||
/**
|
||||
* List of added bootmanagers
|
||||
@@ -166,7 +166,7 @@ class Router
|
||||
public function addRoute(IRoute $route): IRoute
|
||||
{
|
||||
$this->fireEvents(EventHandler::EVENT_ADD_ROUTE, [
|
||||
'route' => $route,
|
||||
'route' => $route,
|
||||
'isSubRoute' => $this->isProcessingRoute,
|
||||
]);
|
||||
|
||||
@@ -307,7 +307,7 @@ class Router
|
||||
$this->debug('Rendering bootmanager "%s"', $className);
|
||||
$this->fireEvents(EventHandler::EVENT_RENDER_BOOTMANAGER, [
|
||||
'bootmanagers' => $this->bootManagers,
|
||||
'bootmanager' => $manager,
|
||||
'bootmanager' => $manager,
|
||||
]);
|
||||
|
||||
/* Render bootmanager */
|
||||
@@ -345,8 +345,8 @@ class Router
|
||||
try {
|
||||
/* Verify csrf token for request */
|
||||
$this->csrfVerifier->handle($this->request);
|
||||
} catch(Exception $e) {
|
||||
$this->handleException($e);
|
||||
} catch (Exception $e) {
|
||||
return $this->handleException($e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -381,7 +381,7 @@ class Router
|
||||
foreach ($this->processedRoutes as $key => $route) {
|
||||
|
||||
$this->debug('Matching route "%s"', get_class($route));
|
||||
|
||||
|
||||
/* Add current processing route to constants */
|
||||
$this->currentProcessingRoute = $route;
|
||||
|
||||
@@ -405,7 +405,7 @@ class Router
|
||||
}
|
||||
|
||||
$this->fireEvents(EventHandler::EVENT_RENDER_MIDDLEWARES, [
|
||||
'route' => $route,
|
||||
'route' => $route,
|
||||
'middlewares' => $route->getMiddlewares(),
|
||||
]);
|
||||
|
||||
@@ -427,7 +427,7 @@ class Router
|
||||
$routeOutput = $route->renderRoute($this->request, $this);
|
||||
|
||||
if ($this->renderMultipleRoutes === true) {
|
||||
if ($routeOutput !== null) {
|
||||
if ($routeOutput !== '') {
|
||||
return $routeOutput;
|
||||
}
|
||||
|
||||
@@ -443,13 +443,17 @@ class Router
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
$this->handleException($e);
|
||||
} catch (\Throwable $e) {
|
||||
if ($e instanceof Exception) {
|
||||
return $this->handleException($e);
|
||||
}
|
||||
|
||||
return $this->handleException(new Exception($e->getMessage(), $e->getCode()));
|
||||
}
|
||||
|
||||
if ($methodNotAllowed === true) {
|
||||
$message = sprintf('Route "%s" or method "%s" not allowed.', $this->request->getUrl()->getPath(), $this->request->getMethod());
|
||||
$this->handleException(new NotFoundHttpException($message, 403));
|
||||
return $this->handleException(new NotFoundHttpException($message, 403));
|
||||
}
|
||||
|
||||
if (count($this->request->getLoadedRoutes()) === 0) {
|
||||
@@ -500,7 +504,7 @@ class Router
|
||||
$this->request->setHasPendingRewrite(false);
|
||||
|
||||
$this->fireEvents(EventHandler::EVENT_REWRITE, [
|
||||
'rewriteUrl' => $this->request->getRewriteUrl(),
|
||||
'rewriteUrl' => $this->request->getRewriteUrl(),
|
||||
'rewriteRoute' => $this->request->getRewriteRoute(),
|
||||
]);
|
||||
|
||||
@@ -521,7 +525,7 @@ class Router
|
||||
$this->debug('Starting exception handling for "%s"', get_class($e));
|
||||
|
||||
$this->fireEvents(EventHandler::EVENT_LOAD_EXCEPTIONS, [
|
||||
'exception' => $e,
|
||||
'exception' => $e,
|
||||
'exceptionHandlers' => $this->exceptionHandlers,
|
||||
]);
|
||||
|
||||
@@ -533,8 +537,8 @@ class Router
|
||||
}
|
||||
|
||||
$this->fireEvents(EventHandler::EVENT_RENDER_EXCEPTION, [
|
||||
'exception' => $e,
|
||||
'exceptionHandler' => $handler,
|
||||
'exception' => $e,
|
||||
'exceptionHandler' => $handler,
|
||||
'exceptionHandlers' => $this->exceptionHandlers,
|
||||
]);
|
||||
|
||||
@@ -556,7 +560,7 @@ class Router
|
||||
$this->debug('Exception handler contains rewrite, reloading routes');
|
||||
|
||||
$this->fireEvents(EventHandler::EVENT_REWRITE, [
|
||||
'rewriteUrl' => $this->request->getRewriteUrl(),
|
||||
'rewriteUrl' => $this->request->getRewriteUrl(),
|
||||
'rewriteRoute' => $this->request->getRewriteRoute(),
|
||||
]);
|
||||
|
||||
@@ -667,9 +671,9 @@ class Router
|
||||
$this->debug('Finding url', func_get_args());
|
||||
|
||||
$this->fireEvents(EventHandler::EVENT_GET_URL, [
|
||||
'name' => $name,
|
||||
'name' => $name,
|
||||
'parameters' => $parameters,
|
||||
'getParams' => $getParams,
|
||||
'getParams' => $getParams,
|
||||
]);
|
||||
|
||||
if ($name === '' && $parameters === '') {
|
||||
@@ -913,8 +917,8 @@ class Router
|
||||
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
|
||||
$this->debugList[] = [
|
||||
'message' => vsprintf($message, $args),
|
||||
'time' => number_format(microtime(true) - $this->debugStartTime, 10),
|
||||
'trace' => end($trace),
|
||||
'time' => number_format(microtime(true) - $this->debugStartTime, 10),
|
||||
'trace' => end($trace),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -940,7 +944,7 @@ class Router
|
||||
{
|
||||
return $this->debugList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current processing route details.
|
||||
*
|
||||
|
||||
@@ -41,9 +41,9 @@ class SimpleRouter
|
||||
|
||||
/**
|
||||
* The response object
|
||||
* @var Response
|
||||
* @var Response|null
|
||||
*/
|
||||
protected static Response $response;
|
||||
protected static ?Response $response = null;
|
||||
|
||||
/**
|
||||
* Router instance
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
class DummyCsrfVerifier extends \Pecee\Http\Middleware\BaseCsrfVerifier {
|
||||
|
||||
protected ?array $except = [
|
||||
protected array $except = [
|
||||
'/exclude-page',
|
||||
'/exclude-all/*',
|
||||
];
|
||||
|
||||
protected ?array $include = [
|
||||
protected array $include = [
|
||||
'/exclude-all/include-page',
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user