diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 02da3d5de..36bdf845d 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -103,10 +103,6 @@ class Handler extends ExceptionHandler $code = $e->status; } - if (method_exists($e, 'getStatus')) { - $code = $e->getStatus(); - } - $responseData['error']['code'] = $code; return new JsonResponse($responseData, $code, $headers); diff --git a/app/Exceptions/NotifyException.php b/app/Exceptions/NotifyException.php index 307916db7..67ef27a75 100644 --- a/app/Exceptions/NotifyException.php +++ b/app/Exceptions/NotifyException.php @@ -4,29 +4,61 @@ namespace BookStack\Exceptions; use Exception; use Illuminate\Contracts\Support\Responsable; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; -class NotifyException extends Exception implements Responsable +class NotifyException extends Exception implements Responsable, HttpExceptionInterface { public $message; public $redirectLocation; protected $status; + /** + * @var array + */ + protected array $headers = []; + public function __construct(string $message, string $redirectLocation = '/', int $status = 500) { $this->message = $message; $this->redirectLocation = $redirectLocation; $this->status = $status; + + if ($status >= 300 && $status < 400) { + // add redirect header only when a matching HTTP status is given + $this->headers = ['location' => $redirectLocation]; + } + parent::__construct(); } /** - * Get the desired status code for this exception. + * Get the desired HTTP status code for this exception. + * + * {@inheritdoc} */ - public function getStatus(): int + public function getStatusCode(): int { return $this->status; } + /** + * Get the desired HTTP headers for this exception. + * + * {@inheritdoc} + */ + public function getHeaders(): array + { + return $this->headers; + } + + /** + * @param array $headers + */ + public function setHeaders(array $headers): void + { + $this->headers = $headers; + } + /** * Send the response for this type of exception. * @@ -38,7 +70,7 @@ class NotifyException extends Exception implements Responsable // Front-end JSON handling. API-side handling managed via handler. if ($request->wantsJson()) { - return response()->json(['error' => $message], 403); + return response()->json(['error' => $message], $this->getStatusCode()); } if (!empty($message)) {