. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Middleware; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use function explode; use function parse_url; use function rtrim; use const PHP_URL_HOST; use const PHP_URL_PATH; use const PHP_URL_PORT; use const PHP_URL_SCHEME; /** * Middleware to set the base URL. */ class BaseUrl implements MiddlewareInterface { /** * @param ServerRequestInterface $request * @param RequestHandlerInterface $handler * * @return ResponseInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // The request URL, as auto-detected from the environment. $request_url = $request->getUri(); // The base URL, as specified in the configuration file. $base_url = Validator::attributes($request)->string('base_url'); if ($base_url === '') { // Guess the base URL from the request URL. $base_url = rtrim(explode('index.php', (string) $request_url)[0], '/'); $request = $request->withAttribute('base_url', $base_url); $base_path = parse_url($base_url, PHP_URL_PATH) ?? ''; $request_url = $request_url->withPath($base_path); $request = $request->withUri($request_url); } else { // Update the request URL from the base URL. $base_scheme = parse_url($base_url, PHP_URL_SCHEME) ?? 'http'; $base_host = parse_url($base_url, PHP_URL_HOST) ?? 'localhost'; $base_port = parse_url($base_url, PHP_URL_PORT); $request_url = $request_url ->withScheme($base_scheme) ->withHost($base_host) ->withPort($base_port); $request = $request->withUri($request_url); } return $handler->handle($request); } }