From 115bdb7e1052d6e2c8fdcfdd2b6b2b7dbdf01b5f Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 3 Jun 2019 10:44:10 +0300 Subject: [PATCH] Processor cleanup, moved logRequest() and debuggerRequest() into Debugger class --- system/src/Grav/Common/Debugger.php | 50 ++++++++ .../Common/Processors/AssetsProcessor.php | 2 +- .../Common/Processors/BackupsProcessor.php | 2 +- .../Processors/DebuggerAssetsProcessor.php | 2 +- .../Common/Processors/InitializeProcessor.php | 116 ++++-------------- .../Grav/Common/Processors/PagesProcessor.php | 2 +- .../Common/Processors/PluginsProcessor.php | 2 +- .../Grav/Common/Processors/ProcessorBase.php | 6 +- .../Common/Processors/RenderProcessor.php | 2 +- .../Common/Processors/RequestProcessor.php | 2 +- .../Common/Processors/SchedulerProcessor.php | 2 +- .../Grav/Common/Processors/TasksProcessor.php | 2 +- .../Common/Processors/ThemesProcessor.php | 2 +- .../Grav/Common/Processors/TwigProcessor.php | 2 +- 14 files changed, 87 insertions(+), 107 deletions(-) diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php index d89b68c01..9f1db08d6 100644 --- a/system/src/Grav/Common/Debugger.php +++ b/system/src/Grav/Common/Debugger.php @@ -30,7 +30,9 @@ use DebugBar\JavascriptRenderer; use DebugBar\StandardDebugBar; use Grav\Common\Config\Config; use Grav\Common\Processors\ProcessorInterface; +use Grav\Framework\Psr7\Response; use Monolog\Logger; +use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use RocketTheme\Toolbox\Event\Event; @@ -249,6 +251,54 @@ class Debugger } + public function debuggerRequest(RequestInterface $request): Response + { + $clockwork = $this->clockwork; + + $headers = [ + 'Content-Type' => 'application/json', + 'Grav-Internal-SkipShutdown' => 1 + ]; + + $path = $request->getUri()->getPath(); + $clockworkDataUri = '#/__clockwork(?:/(?[0-9-]+))?(?:/(?(?:previous|next)))?(?:/(?\d+))?#'; + if (preg_match($clockworkDataUri, $path, $matches) === false) { + $response = ['message' => 'Bad Input']; + + return new Response(400, $headers, json_encode($response)); + } + + $id = $matches['id'] ?? null; + $direction = $matches['direction'] ?? null; + $count = $matches['count'] ?? null; + + $storage = $clockwork->getStorage(); + + if ($direction === 'previous') { + $data = $storage->previous($id, $count); + } elseif ($direction === 'next') { + $data = $storage->next($id, $count); + } elseif ($id === 'latest') { + $data = $storage->latest(); + } else { + $data = $storage->find($id); + } + + if (preg_match('#(?[0-9-]+|latest)/extended#', $path)) { + $clockwork->extendRequest($data); + } + + if (!$data) { + $response = ['message' => 'Not Found']; + + return new Response(404, $headers, json_encode($response)); + } + + $data = is_array($data) ? array_map(function ($item) { return $item->toArray(); }, $data) : $data->toArray(); + + return new Response(200, $headers, json_encode($data)); + } + protected function addMeasures() { if (!$this->enabled) { diff --git a/system/src/Grav/Common/Processors/AssetsProcessor.php b/system/src/Grav/Common/Processors/AssetsProcessor.php index 8b4640138..5de4cb7d7 100644 --- a/system/src/Grav/Common/Processors/AssetsProcessor.php +++ b/system/src/Grav/Common/Processors/AssetsProcessor.php @@ -18,7 +18,7 @@ class AssetsProcessor extends ProcessorBase public $id = '_assets'; public $title = 'Assets'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); $this->container['assets']->init(); diff --git a/system/src/Grav/Common/Processors/BackupsProcessor.php b/system/src/Grav/Common/Processors/BackupsProcessor.php index d2a822c91..29418b204 100644 --- a/system/src/Grav/Common/Processors/BackupsProcessor.php +++ b/system/src/Grav/Common/Processors/BackupsProcessor.php @@ -18,7 +18,7 @@ class BackupsProcessor extends ProcessorBase public $id = '_backups'; public $title = 'Backups'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); $backups = $this->container['backups']; diff --git a/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php b/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php index 11a39e894..49ed05546 100644 --- a/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php +++ b/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php @@ -19,7 +19,7 @@ class DebuggerAssetsProcessor extends ProcessorBase public $id = 'debugger_assets'; public $title = 'Debugger Assets'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); $this->container['debugger']->addAssets(); diff --git a/system/src/Grav/Common/Processors/InitializeProcessor.php b/system/src/Grav/Common/Processors/InitializeProcessor.php index 965fdf320..331087e28 100644 --- a/system/src/Grav/Common/Processors/InitializeProcessor.php +++ b/system/src/Grav/Common/Processors/InitializeProcessor.php @@ -9,9 +9,6 @@ namespace Grav\Common\Processors; -use Clockwork\Clockwork; -use Clockwork\DataSource\PsrMessageDataSource; -use Clockwork\Helpers\ServerTiming; use Grav\Common\Config\Config; use Grav\Common\Debugger; use Grav\Common\Uri; @@ -20,7 +17,6 @@ use Grav\Framework\Psr7\Response; use Grav\Framework\Session\Exceptions\SessionException; use Monolog\Formatter\LineFormatter; use Monolog\Handler\SyslogHandler; -use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -30,23 +26,16 @@ class InitializeProcessor extends ProcessorBase public $id = '_init'; public $title = 'Initialize'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $this->startTimer('_config', 'Configuration'); $config = $this->initializeConfig(); - $this->stopTimer('_config'); - - $this->startTimer('_logger', 'Logger'); $this->initializeLogger($config); - $this->stopTimer('_logger'); - - $this->startTimer('_errors', 'Error Handlers Reset'); $this->initializeErrors(); - $this->stopTimer('_errors'); $this->startTimer('_debugger', 'Init Debugger'); /** @var Debugger $debugger */ $debugger = $this->container['debugger']->init(); + // Clockwork integration. $clockwork = $debugger->getClockwork(); if ($clockwork) { $server = $request->getServerParams(); @@ -63,17 +52,14 @@ class InitializeProcessor extends ProcessorBase // Handle clockwork API calls. $uri = $request->getUri(); if (mb_strpos($uri->getPath(), $baseUri . '/__clockwork/') === 0) { - return $this->debuggerRequest($request, $clockwork); + return $debugger->debuggerRequest($request); } $this->container['clockwork'] = $clockwork; } $this->stopTimer('_debugger'); - $this->startTimer('_init', 'Initialize'); $this->initialize($config); - $this->stopTimer('_init'); - $this->initializeSession($config); // Wrap call to next handler so that debugger can profile it. @@ -85,80 +71,10 @@ class InitializeProcessor extends ProcessorBase return $debugger->logRequest($request, $response); } - protected function logRequest(ServerRequestInterface $request, ResponseInterface $response, Clockwork $clockwork = null) - { - if (!$clockwork) { - return $response; - } - - $clockwork->getTimeline()->finalize($request->getAttribute('request_time')); - $clockwork->addDataSource(new PsrMessageDataSource($request, $response)); - - $clockwork->resolveRequest(); - $clockwork->storeRequest(); - - $clockworkRequest = $clockwork->getRequest(); - - $response = $response - ->withHeader('X-Clockwork-Id', $clockworkRequest->id) - ->withHeader('X-Clockwork-Version', $clockwork::VERSION); - - $basePath = $request->getAttribute('base_uri'); - if ($basePath) { - $response = $response->withHeader('X-Clockwork-Path', $basePath . '/__clockwork/'); - } - - return $response->withHeader('Server-Timing', ServerTiming::fromRequest($clockworkRequest)->value()); - } - - protected function debuggerRequest(RequestInterface $request, Clockwork $clockwork): Response - { - $headers = [ - 'Content-Type' => 'application/json', - 'Grav-Internal-SkipShutdown' => 1 - ]; - - $path = $request->getUri()->getPath(); - $clockworkDataUri = '#/__clockwork(?:/(?[0-9-]+))?(?:/(?(?:previous|next)))?(?:/(?\d+))?#'; - if (preg_match($clockworkDataUri, $path, $matches) === false) { - $response = ['message' => 'Bad Input']; - - return new Response(400, $headers, json_encode($response)); - } - - $id = $matches['id'] ?? null; - $direction = $matches['direction'] ?? null; - $count = $matches['count'] ?? null; - - $storage = $clockwork->getStorage(); - - if ($direction === 'previous') { - $data = $storage->previous($id, $count); - } elseif ($direction === 'next') { - $data = $storage->next($id, $count); - } elseif ($id === 'latest') { - $data = $storage->latest(); - } else { - $data = $storage->find($id); - } - - if (preg_match('#(?[0-9-]+|latest)/extended#', $path)) { - $clockwork->extendRequest($data); - } - - if (!$data) { - $response = ['message' => 'Not Found']; - - return new Response(404, $headers, json_encode($response)); - } - - $data = is_array($data) ? array_map(function ($item) { return $item->toArray(); }, $data) : $data->toArray(); - - return new Response(200, $headers, json_encode($data)); - } - protected function initializeConfig(): Config { + $this->startTimer('_config', 'Configuration'); + // Initialize Configuration $grav = $this->container; /** @var Config $config */ @@ -166,11 +82,15 @@ class InitializeProcessor extends ProcessorBase $config->init(); $grav['plugins']->setup(); + $this->stopTimer('_config'); + return $config; } - protected function initializeLogger(Config $config) + protected function initializeLogger(Config $config): void { + $this->startTimer('_logger', 'Logger'); + // Initialize Logging $grav = $this->container; @@ -187,16 +107,24 @@ class InitializeProcessor extends ProcessorBase $log->pushHandler($logHandler); break; } + + $this->stopTimer('_logger'); } - protected function initializeErrors() + protected function initializeErrors(): void { + $this->startTimer('_errors', 'Error Handlers Reset'); + // Initialize Error Handlers $this->container['errors']->resetHandlers(); + + $this->stopTimer('_errors'); } - protected function initialize(Config $config) + protected function initialize(Config $config): void { + $this->startTimer('_init', 'Initialize'); + // Use output buffering to prevent headers from being sent too early. ob_start(); if ($config->get('system.cache.gzip') && !@ob_start('ob_gzhandler')) { @@ -225,9 +153,11 @@ class InitializeProcessor extends ProcessorBase } $this->container->setLocale(); + + $this->stopTimer('_init'); } - protected function initializeSession(Config $config) + protected function initializeSession(Config $config): void { // FIXME: Initialize session should happen later after plugins have been loaded. This is a workaround to fix session issues in AWS. if (isset($this->container['session']) && $config->get('system.session.initialize', true)) { diff --git a/system/src/Grav/Common/Processors/PagesProcessor.php b/system/src/Grav/Common/Processors/PagesProcessor.php index ede22e5c4..eaed61993 100644 --- a/system/src/Grav/Common/Processors/PagesProcessor.php +++ b/system/src/Grav/Common/Processors/PagesProcessor.php @@ -20,7 +20,7 @@ class PagesProcessor extends ProcessorBase public $id = 'pages'; public $title = 'Pages'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); diff --git a/system/src/Grav/Common/Processors/PluginsProcessor.php b/system/src/Grav/Common/Processors/PluginsProcessor.php index 9d2943b67..52ee4ea1c 100644 --- a/system/src/Grav/Common/Processors/PluginsProcessor.php +++ b/system/src/Grav/Common/Processors/PluginsProcessor.php @@ -18,7 +18,7 @@ class PluginsProcessor extends ProcessorBase public $id = 'plugins'; public $title = 'Plugins'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); // TODO: remove in 2.0. diff --git a/system/src/Grav/Common/Processors/ProcessorBase.php b/system/src/Grav/Common/Processors/ProcessorBase.php index 5ce7bfd29..fe015f4e4 100644 --- a/system/src/Grav/Common/Processors/ProcessorBase.php +++ b/system/src/Grav/Common/Processors/ProcessorBase.php @@ -25,21 +25,21 @@ abstract class ProcessorBase implements ProcessorInterface $this->container = $container; } - protected function startTimer($id = null, $title = null) + protected function startTimer($id = null, $title = null): void { /** @var Debugger $debugger */ $debugger = $this->container['debugger']; $debugger->startTimer($id ?? $this->id, $title ?? $this->title); } - protected function stopTimer($id = null) + protected function stopTimer($id = null): void { /** @var Debugger $debugger */ $debugger = $this->container['debugger']; $debugger->stopTimer($id ?? $this->id); } - protected function addMessage($message, $label = 'info', $isString = true) + protected function addMessage($message, $label = 'info', $isString = true): void { /** @var Debugger $debugger */ $debugger = $this->container['debugger']; diff --git a/system/src/Grav/Common/Processors/RenderProcessor.php b/system/src/Grav/Common/Processors/RenderProcessor.php index 06a6c79f3..334a4de3b 100644 --- a/system/src/Grav/Common/Processors/RenderProcessor.php +++ b/system/src/Grav/Common/Processors/RenderProcessor.php @@ -20,7 +20,7 @@ class RenderProcessor extends ProcessorBase public $id = 'render'; public $title = 'Render'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); diff --git a/system/src/Grav/Common/Processors/RequestProcessor.php b/system/src/Grav/Common/Processors/RequestProcessor.php index 97564e69b..0e164170a 100644 --- a/system/src/Grav/Common/Processors/RequestProcessor.php +++ b/system/src/Grav/Common/Processors/RequestProcessor.php @@ -20,7 +20,7 @@ class RequestProcessor extends ProcessorBase public $id = 'request'; public $title = 'Request'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); diff --git a/system/src/Grav/Common/Processors/SchedulerProcessor.php b/system/src/Grav/Common/Processors/SchedulerProcessor.php index 64f3fba8f..fb57f982a 100644 --- a/system/src/Grav/Common/Processors/SchedulerProcessor.php +++ b/system/src/Grav/Common/Processors/SchedulerProcessor.php @@ -19,7 +19,7 @@ class SchedulerProcessor extends ProcessorBase public $id = '_scheduler'; public $title = 'Scheduler'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); $scheduler = $this->container['scheduler']; diff --git a/system/src/Grav/Common/Processors/TasksProcessor.php b/system/src/Grav/Common/Processors/TasksProcessor.php index aaf5cdf33..a7d2b0431 100644 --- a/system/src/Grav/Common/Processors/TasksProcessor.php +++ b/system/src/Grav/Common/Processors/TasksProcessor.php @@ -19,7 +19,7 @@ class TasksProcessor extends ProcessorBase public $id = 'tasks'; public $title = 'Tasks'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); diff --git a/system/src/Grav/Common/Processors/ThemesProcessor.php b/system/src/Grav/Common/Processors/ThemesProcessor.php index d1c6ae564..da523dd05 100644 --- a/system/src/Grav/Common/Processors/ThemesProcessor.php +++ b/system/src/Grav/Common/Processors/ThemesProcessor.php @@ -18,7 +18,7 @@ class ThemesProcessor extends ProcessorBase public $id = 'themes'; public $title = 'Themes'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); $this->container['themes']->init(); diff --git a/system/src/Grav/Common/Processors/TwigProcessor.php b/system/src/Grav/Common/Processors/TwigProcessor.php index 4ed247d01..9cf7e4eaf 100644 --- a/system/src/Grav/Common/Processors/TwigProcessor.php +++ b/system/src/Grav/Common/Processors/TwigProcessor.php @@ -18,7 +18,7 @@ class TwigProcessor extends ProcessorBase public $id = 'twig'; public $title = 'Twig'; - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); $this->container['twig']->init();