vendor/debril/rss-atom-bundle/Debril/RssAtomBundle/Controller/StreamController.php line 31

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Debril\RssAtomBundle\Controller;
  3. use FeedIo\FeedIo;
  4. use FeedIo\FeedInterface;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  8. use Debril\RssAtomBundle\Provider\FeedContentProviderInterface;
  9. use Debril\RssAtomBundle\Exception\FeedException\FeedNotFoundException;
  10. /**
  11.  * Class StreamController.
  12.  */
  13. class StreamController extends Controller
  14. {
  15.     /**
  16.      * @var \DateTime
  17.      */
  18.     protected $since;
  19.     /**
  20.      * @param Request $request
  21.      * @param FeedContentProviderInterface $provider
  22.      * @param FeedIo $feedIo
  23.      * @return Response
  24.      * @throws \Exception
  25.      */
  26.     public function indexAction(Request $requestFeedContentProviderInterface $providerFeedIo $feedIo) : Response
  27.     {
  28.         $options $request->attributes->get('_route_params');
  29.         $this->setModifiedSince($request);
  30.         $options['Since'] = $this->getModifiedSince();
  31.         return $this->createStreamResponse(
  32.             $options,
  33.             $request->get('format''rss'),
  34.             $provider,
  35.             $feedIo
  36.         );
  37.     }
  38.     /**
  39.      * Extract the 'If-Modified-Since' value from the headers.
  40.      *
  41.      * @return \DateTime
  42.      */
  43.     protected function getModifiedSince() : \DateTime
  44.     {
  45.         if (is_null($this->since)) {
  46.             $this->since = new \DateTime('@0');
  47.         }
  48.         return $this->since;
  49.     }
  50.     /**
  51.      * @param Request $request
  52.      *
  53.      * @return $this
  54.      */
  55.     protected function setModifiedSince(Request $request) : self
  56.     {
  57.         $this->since = new \DateTime();
  58.         if ($request->headers->has('If-Modified-Since')) {
  59.             $string $request->headers->get('If-Modified-Since');
  60.             $this->since = \DateTime::createFromFormat(\DateTime::RSS$string);
  61.         } else {
  62.             $this->since->setTimestamp(1);
  63.         }
  64.         return $this;
  65.     }
  66.     /**
  67.      * Generate the HTTP response
  68.      * 200 : a full body containing the stream
  69.      * 304 : Not modified.
  70.      *
  71.      * @param array $options
  72.      * @param $format
  73.      * @param FeedContentProviderInterface $provider
  74.      * @param FeedIo $feedIo
  75.      *
  76.      * @return Response
  77.      *
  78.      * @throws \Exception
  79.      */
  80.     protected function createStreamResponse(array $optionsstring $formatFeedContentProviderInterface $providerFeedIo $feedIo) : Response
  81.     {
  82.         $content $this->getContent($options$provider);
  83.         if ($this->mustForceRefresh() || $content->getLastModified() > $this->getModifiedSince()) {
  84.             $response = new Response($feedIo->format($content$format));
  85.             $this->setFeedHeaders($response$content$format);
  86.         } else {
  87.             $response = new Response();
  88.             $response->setNotModified();
  89.         }
  90.         return $response;
  91.     }
  92.     /**
  93.      * @param Response $response
  94.      * @param FeedInterface $feed
  95.      * @param string $format
  96.      * @return $this
  97.      */
  98.     protected function setFeedHeaders(Response $responseFeedInterface $feedstring $format) : self
  99.     {
  100.         $contentType =
  101.             'json' == $format ?
  102.                 $this->getParameter('debril_rss_atom.content_type_json') :
  103.                 $this->getParameter('debril_rss_atom.content_type_xml')
  104.             ;
  105.         $response->headers->set('Content-Type'$contentType);
  106.         if (! $this->isPrivate() ) {
  107.             $response->setPublic();
  108.         }
  109.         $response->setMaxAge(3600);
  110.         $response->setLastModified($feed->getLastModified());
  111.         return $this;
  112.     }
  113.     /**
  114.      * Get the Stream's content using a FeedContentProviderInterface
  115.      * The FeedContentProviderInterface instance is provided as a service
  116.      * default : debril.provider.service.
  117.      *
  118.      * @param array  $options
  119.      * @param FeedContentProviderInterface $provider
  120.      *
  121.      * @return FeedInterface
  122.      *
  123.      * @throws \Exception
  124.      */
  125.     protected function getContent(array $optionsFeedContentProviderInterface $provider) : FeedInterface
  126.     {
  127.         try {
  128.             return $provider->getFeedContent($options);
  129.         } catch (FeedNotFoundException $e) {
  130.             throw $this->createNotFoundException('feed not found');
  131.         }
  132.     }
  133.     /**
  134.      * Returns true if the controller must ignore the last modified date.
  135.      *
  136.      * @return bool
  137.      */
  138.     protected function mustForceRefresh() : bool
  139.     {
  140.         return $this->container->getParameter('debril_rss_atom.force_refresh');
  141.     }
  142.     /**
  143.      * @return boolean true if the feed must be private
  144.      */
  145.     protected function isPrivate() : bool
  146.     {
  147.         return $this->container->getParameter('debril_rss_atom.private_feeds');
  148.     }
  149. }