From 4811fa7d499f29aee597d7d8d1382237e827c3ac Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 23 Oct 2018 18:04:21 +0300 Subject: [PATCH] Allow new task controllers to run --- .../Grav/Common/Processors/ProcessorBase.php | 15 ++- .../Grav/Common/Processors/TasksProcessor.php | 14 +++ system/src/Grav/Framework/DI/Container.php | 7 ++ .../Exception/InvalidArgumentException.php | 7 ++ .../Exception/NotFoundException.php | 31 ++++++ .../Exception/PageExpiredException.php | 27 ++++++ .../Exception/RequestException.php | 97 +++++++++++++++++++ .../RequestHandler/Middlewares/Exceptions.php | 7 ++ .../RequestHandler/RequestHandler.php | 7 ++ 9 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php create mode 100644 system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php create mode 100644 system/src/Grav/Framework/RequestHandler/Exception/RequestException.php diff --git a/system/src/Grav/Common/Processors/ProcessorBase.php b/system/src/Grav/Common/Processors/ProcessorBase.php index 6632c9b04..e8d029424 100644 --- a/system/src/Grav/Common/Processors/ProcessorBase.php +++ b/system/src/Grav/Common/Processors/ProcessorBase.php @@ -22,17 +22,24 @@ abstract class ProcessorBase implements ProcessorInterface $this->container = $container; } - protected function startTimer() + protected function startTimer($id = null, $title = null) { /** @var Debugger $debugger */ $debugger = $this->container['debugger']; - $debugger->startTimer($this->id, $this->title); + $debugger->startTimer($id ?? $this->id, $title ?? $this->title); } - protected function stopTimer() + protected function stopTimer($id = null) { /** @var Debugger $debugger */ $debugger = $this->container['debugger']; - $debugger->stopTimer($this->id); + $debugger->stopTimer($id ?? $this->id); + } + + protected function addMessage($message, $label = 'info', $isString = true) + { + /** @var Debugger $debugger */ + $debugger = $this->container['debugger']; + $debugger->addMessage($message, $label, $isString); } } diff --git a/system/src/Grav/Common/Processors/TasksProcessor.php b/system/src/Grav/Common/Processors/TasksProcessor.php index 9ad8a4084..91be554bd 100644 --- a/system/src/Grav/Common/Processors/TasksProcessor.php +++ b/system/src/Grav/Common/Processors/TasksProcessor.php @@ -9,6 +9,7 @@ namespace Grav\Common\Processors; +use Grav\Framework\RequestHandler\Exception\NotFoundException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -21,8 +22,21 @@ class TasksProcessor extends ProcessorBase public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface { $this->startTimer(); + $task = $this->container['task']; if ($task) { + $params = $request->getAttribute('controller'); + $controllerClass = $params['class'] ?? null; + if ($controllerClass) { + /** @var RequestHandlerInterface $controller */ + $controller = new $controllerClass($params); + try { + return $controller->handle($request); + } catch (NotFoundException $e) { + // Task not found: Let it pass through. + } + } + $this->container->fireEvent('onTask.' . $task); } $this->stopTimer(); diff --git a/system/src/Grav/Framework/DI/Container.php b/system/src/Grav/Framework/DI/Container.php index ca187e1af..ef71a3bb6 100644 --- a/system/src/Grav/Framework/DI/Container.php +++ b/system/src/Grav/Framework/DI/Container.php @@ -1,5 +1,12 @@ getMethod()), ['PUT', 'PATCH', 'DELETE'])) { + parent::__construct($request, 'Method Not Allowed', 405, $previous); + } else { + parent::__construct($request, 'Not Found', 404, $previous); + } + } +} diff --git a/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php b/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php new file mode 100644 index 000000000..aa82b53bf --- /dev/null +++ b/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php @@ -0,0 +1,27 @@ + 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 419 => 'Page Expired', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required', + ]; + + /** @var ServerRequestInterface */ + private $request; + + /** + * @param ServerRequestInterface $request + * @param string $message + * @param int $code + * @param \Throwable|null $previous + */ + public function __construct(ServerRequestInterface $request, string $message, int $code = 500, \Throwable $previous = null) + { + $this->request = $request; + + parent::__construct($message, $code, $previous); + } + + /** + * @return ServerRequestInterface + */ + public function getRequest() : ServerRequestInterface + { + return $this->request; + } + + public function getHttpCode() : int + { + $code = $this->getCode(); + + return isset(self::$phrases[$code]) ? $code : 500; + } + + public function getHttpReason() : ?string + { + return self::$phrases[$this->getCode()] ?? self::$phrases[500]; + } +} diff --git a/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php b/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php index ae117db90..da105ddd9 100644 --- a/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php +++ b/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php @@ -1,5 +1,12 @@