1<?php 2/** 3 * webtrees: online genealogy 4 * Copyright (C) 2019 webtrees development team 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16declare(strict_types=1); 17 18namespace Fisharebest\Webtrees\Http\Middleware; 19 20use Fisharebest\Webtrees\Http\Controllers\ErrorController; 21use Psr\Http\Message\ResponseInterface; 22use Psr\Http\Message\ServerRequestInterface; 23use Psr\Http\Server\MiddlewareInterface; 24use Psr\Http\Server\RequestHandlerInterface; 25use Symfony\Component\HttpKernel\Exception\HttpException; 26use Throwable; 27 28/** 29 * Middleware to handle and render errors. 30 */ 31class HandleExceptions implements MiddlewareInterface 32{ 33 /** @var ErrorController */ 34 private $error_controller; 35 36 /** 37 * ExceptionHandler constructor. 38 * 39 * @param ErrorController $error_controller 40 */ 41 public function __construct(ErrorController $error_controller) 42 { 43 $this->error_controller = $error_controller; 44 } 45 46 /** 47 * @param ServerRequestInterface $request 48 * @param RequestHandlerInterface $handler 49 * 50 * @return ResponseInterface 51 */ 52 public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface 53 { 54 try { 55 return $handler->handle($request); 56 } catch (HttpException $exception) { 57 if ($request->getHeaderLine('X-Requested-With') !== '') { 58 return $this->error_controller->ajaxErrorResponse($exception); 59 } 60 61 return $this->error_controller->errorResponse($exception); 62 } catch (Throwable $exception) { 63 return $this->error_controller->unhandledExceptionResponse($request, $exception); 64 } 65 } 66} 67