vendor/can/rest/src/Can/RestBundle/EventListener/DigestHeaderListener.php line 43

Open in your IDE?
  1. <?php
  2. namespace Can\RestBundle\EventListener;
  3. use Can\RestBundle\CanRestBundle;
  4. use Can\RestBundle\Http\ResponseDigester;
  5. use Can\RestBundle\Negotiation\NegotiationConfiguration;
  6. use Can\RestBundle\Negotiation\NegotiationHeader;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  9. /**
  10.  * Computes and adds the response Digest header, if necessary.
  11.  *
  12.  * @group negotiation
  13.  *
  14.  * @package can/rest-bundle
  15.  * @author lechecacharro <lechecacharro@gmail.com>
  16.  */
  17. class DigestHeaderListener
  18. {
  19.     /**
  20.      * @var NegotiationConfiguration
  21.      */
  22.     private $configuration;
  23.     /**
  24.      * ContentHeadersListener constructor.
  25.      *
  26.      * @param NegotiationConfiguration $configuration
  27.      */
  28.     public function __construct(NegotiationConfiguration $configuration)
  29.     {
  30.         $this->configuration $configuration;
  31.     }
  32.     /**
  33.      * @param ResponseEvent $event
  34.      */
  35.     public function onResponse(ResponseEvent $event): void
  36.     {
  37.         if (! $this->configuration->isAcceptInstanceDigests()) {
  38.             return;
  39.         }
  40.         if (! $event->isMasterRequest()) {
  41.             return;
  42.         }
  43.         $request $event->getRequest();
  44.         if (! $request->attributes->get(CanRestBundle::ATTR_SERVICE_ZONE)) {
  45.             return;
  46.         }
  47.         $digest $request->attributes->get(CanRestBundle::ATTR_NEGOTIATION_DIGEST);
  48.         if (! $digest) {
  49.             return;
  50.         }
  51.         $response $event->getResponse();
  52.         // Don't add content headers to empty responses
  53.         if ($response->isEmpty() || empty($response->getContent())) {
  54.             return;
  55.         }
  56.         $response->headers->set(NegotiationHeader::DIGEST$this->computeDigest($digest$response));
  57.     }
  58.     /**
  59.      * Computes the response entity digest.
  60.      *
  61.      * @param string  $digest
  62.      * @param Response $response
  63.      *
  64.      * @return string
  65.      */
  66.     protected function computeDigest(string $digestResponse $response): string
  67.     {
  68.         $responseDigester = new ResponseDigester($digest);
  69.         return sprintf('%s=%s'$digest$responseDigester->entityDigest($response));
  70.     }
  71. }