LinkHeaderMiddleware should use the same URL as ViewFactory

This way the X-Forwarded-Path header is used to generate the Link header
This commit is contained in:
Pierre Rudloff 2022-02-20 13:55:44 +01:00
parent bfaea0e381
commit 9410d4b49b
3 changed files with 31 additions and 30 deletions

View file

@ -62,7 +62,7 @@ class App extends \Slim\App
// Middlewares. // Middlewares.
$this->add(new LocaleMiddleware($container)); $this->add(new LocaleMiddleware($container));
$this->add(new CspMiddleware($container)); $this->add(new CspMiddleware($container));
$this->add(new LinkHeaderMiddleware($container)); $this->add(new LinkHeaderMiddleware());
$this->add(new RouterPathMiddleware($container)); $this->add(new RouterPathMiddleware($container));
// Controllers. // Controllers.

View file

@ -57,22 +57,13 @@ class ViewFactory
} }
/** /**
* Create Smarty view object. * Create a URI suitable for templates.
* *
* @param ContainerInterface $container Slim dependency container * @param Request $request
* @param Request|null $request PSR-7 request * @return Uri
*
* @return Smarty
* @throws SmartyException
*/ */
public static function create(ContainerInterface $container, Request $request = null): Smarty public static function prepareUri(Request $request): Uri
{ {
if (!isset($request)) {
$request = $container->get('request');
}
$view = new Smarty($container->get('root_path') . '/templates/');
/** @var Uri $uri */ /** @var Uri $uri */
$uri = $request->getUri(); $uri = $request->getUri();
if (in_array('https', $request->getHeader('X-Forwarded-Proto'))) { if (in_array('https', $request->getHeader('X-Forwarded-Proto'))) {
@ -92,11 +83,31 @@ class ViewFactory
$uri = $uri->withBasePath($path); $uri = $uri->withBasePath($path);
} }
return self::cleanBasePath($uri);
}
/**
* Create Smarty view object.
*
* @param ContainerInterface $container Slim dependency container
* @param Request|null $request PSR-7 request
*
* @return Smarty
* @throws SmartyException
*/
public static function create(ContainerInterface $container, Request $request = null): Smarty
{
if (!isset($request)) {
$request = $container->get('request');
}
$view = new Smarty($container->get('root_path') . '/templates/');
$uri = self::prepareUri($request);
/** @var LocaleManager $localeManager */ /** @var LocaleManager $localeManager */
$localeManager = $container->get('locale'); $localeManager = $container->get('locale');
$uri = self::cleanBasePath($uri);
$smartyPlugins = new SmartyPlugins($container->get('router'), $uri->withUserInfo('')); $smartyPlugins = new SmartyPlugins($container->get('router'), $uri->withUserInfo(''));
$view->registerPlugin('function', 'path_for', [$smartyPlugins, 'pathFor']); $view->registerPlugin('function', 'path_for', [$smartyPlugins, 'pathFor']);
$view->registerPlugin('function', 'base_url', [$smartyPlugins, 'baseUrl']); $view->registerPlugin('function', 'base_url', [$smartyPlugins, 'baseUrl']);

View file

@ -2,6 +2,7 @@
namespace Alltube\Middleware; namespace Alltube\Middleware;
use Alltube\Factory\ViewFactory;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
@ -13,19 +14,6 @@ use Slim\Router;
*/ */
class LinkHeaderMiddleware class LinkHeaderMiddleware
{ {
/**
* @var Router
*/
private $router;
/**
* LinkHeaderMiddleware constructor.
* @param ContainerInterface $container
*/
public function __construct(ContainerInterface $container)
{
$this->router = $container->get('router');
}
/** /**
* @param Request $request * @param Request $request
@ -35,12 +23,14 @@ class LinkHeaderMiddleware
*/ */
public function __invoke(Request $request, Response $response, callable $next) public function __invoke(Request $request, Response $response, callable $next)
{ {
$uri = ViewFactory::prepareUri($request);
$response = $response->withHeader( $response = $response->withHeader(
'Link', 'Link',
implode( implode(
'; ', '; ',
[ [
'<' . $this->router->getBasePath() . '/css/style.css>', '<' . $uri->getBasePath() . '/css/style.css>',
'rel=preload', 'as=style' 'rel=preload', 'as=style'
] ]
) )