From 469d2a72e38e18cab94f5492a897dea7bfc56fa1 Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 30 Jul 2021 12:56:38 +0300 Subject: [PATCH] feat(handlers): add basic Shutdown and HttpError handlers #199 --- .../Foundation/Handlers/HttpErrorHandler.php | 76 +++++++++++++++++ .../Foundation/Handlers/ShutdownHandler.php | 83 +++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 src/flextype/Foundation/Handlers/HttpErrorHandler.php create mode 100644 src/flextype/Foundation/Handlers/ShutdownHandler.php diff --git a/src/flextype/Foundation/Handlers/HttpErrorHandler.php b/src/flextype/Foundation/Handlers/HttpErrorHandler.php new file mode 100644 index 000000000..2a687e267 --- /dev/null +++ b/src/flextype/Foundation/Handlers/HttpErrorHandler.php @@ -0,0 +1,76 @@ +exception; + $statusCode = 500; + $type = self::SERVER_ERROR; + $description = 'An internal error has occurred while processing your request.'; + + if ($exception instanceof HttpException) { + $statusCode = $exception->getCode(); + $description = $exception->getMessage(); + + if ($exception instanceof HttpNotFoundException) { + $type = self::RESOURCE_NOT_FOUND; + } elseif ($exception instanceof HttpMethodNotAllowedException) { + $type = self::NOT_ALLOWED; + } elseif ($exception instanceof HttpUnauthorizedException) { + $type = self::UNAUTHENTICATED; + } elseif ($exception instanceof HttpForbiddenException) { + $type = self::UNAUTHENTICATED; + } elseif ($exception instanceof HttpBadRequestException) { + $type = self::BAD_REQUEST; + } elseif ($exception instanceof HttpNotImplementedException) { + $type = self::NOT_IMPLEMENTED; + } + } + + if ( + !($exception instanceof HttpException) + && ($exception instanceof Exception || $exception instanceof Throwable) + && $this->displayErrorDetails + ) { + $description = $exception->getMessage(); + } + + $error = [ + 'statusCode' => $statusCode, + 'error' => [ + 'type' => $type, + 'description' => $description, + ], + ]; + + $payload = json_encode($error, JSON_PRETTY_PRINT); + + $response = $this->responseFactory->createResponse($statusCode); + $response->getBody()->write($payload); + + return $response; + } +} \ No newline at end of file diff --git a/src/flextype/Foundation/Handlers/ShutdownHandler.php b/src/flextype/Foundation/Handlers/ShutdownHandler.php new file mode 100644 index 000000000..184f19dbd --- /dev/null +++ b/src/flextype/Foundation/Handlers/ShutdownHandler.php @@ -0,0 +1,83 @@ +request = $request; + $this->errorHandler = $errorHandler; + $this->displayErrorDetails = $displayErrorDetails; + } + + public function __invoke() + { + $error = error_get_last(); + if ($error) { + $errorFile = $error['file']; + $errorLine = $error['line']; + $errorMessage = $error['message']; + $errorType = $error['type']; + $message = 'An error while processing your request. Please try again later.'; + + if ($this->displayErrorDetails) { + switch ($errorType) { + case E_USER_ERROR: + $message = "FATAL ERROR: {$errorMessage}. "; + $message .= " on line {$errorLine} in file {$errorFile}."; + break; + + case E_USER_WARNING: + $message = "WARNING: {$errorMessage}"; + break; + + case E_USER_NOTICE: + $message = "NOTICE: {$errorMessage}"; + break; + + default: + $message = "ERROR: {$errorMessage}"; + $message .= " on line {$errorLine} in file {$errorFile}."; + break; + } + } + + $exception = new HttpInternalServerErrorException($this->request, $message); + $response = $this->errorHandler->__invoke($this->request, $exception, $this->displayErrorDetails, false, false); + + if (ob_get_length()) { + ob_clean(); + } + + $responseEmitter = new ResponseEmitter(); + $responseEmitter->emit($response); + } + } +} \ No newline at end of file