headless_cms-1.0.3/modules/headless_cms_preview/src/PreviewToken/PreviewTokenNegotiator.php
modules/headless_cms_preview/src/PreviewToken/PreviewTokenNegotiator.php
<?php
declare(strict_types=1);
namespace Drupal\headless_cms_preview\PreviewToken;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Negotiates a preview token from a request.
*/
class PreviewTokenNegotiator {
const HEADER_NAME = 'X-Headless-Preview-Token';
public function __construct(
protected RequestStack $requestStack,
protected PreviewTokenManagerInterface $previewTokenManager,
) {}
/**
* Check if the request has a preview token.
*
* This method is less expensive than `negotiateFromRequest()` because it
* does not decode the token. Use if you only need to check if the request
* has a preview token.
*/
public function requestHasPreviewToken(?Request $request = NULL): bool {
$request = $request ?? $this->requestStack->getCurrentRequest();
return $request?->headers->has(self::HEADER_NAME) ?? FALSE;
}
/**
* Negotiate preview token from passed or current http request.
*/
public function negotiateFromRequest(?Request $request = NULL): ?PreviewToken {
$request = $request ?? $this->requestStack->getCurrentRequest();
$previewToken = $this->doNegotiateFromRequest($request);
if ($previewToken) {
$request->attributes->set('headless_preview_token', $previewToken);
}
return $previewToken;
}
/**
* Negotiate preview token from http request.
*/
protected function doNegotiateFromRequest(Request $request): ?PreviewToken {
$tokenValue = $request->headers->get(self::HEADER_NAME);
if ($tokenValue) {
return $this->previewTokenManager->decode($tokenValue);
}
return NULL;
}
}
