setSharedMaxAge() public method

This methods sets the Cache-Control s-maxage directive.
public setSharedMaxAge ( integer $value ) : Response
$value integer Number of seconds
return Response
Example #1
0
 public function testDisableCache()
 {
     // disable cache
     $this->structure->getCacheLifeTime()->willReturn(0);
     $this->response->setPublic()->shouldNotBeCalled();
     $this->response->setMaxAge($this->maxAge)->shouldNotBeCalled();
     $this->response->setSharedMaxAge($this->sharedMaxAge)->shouldNotBeCalled();
     $this->handler->updateResponse($this->response->reveal(), $this->structure->reveal());
 }
    /**
     * 
     *
     * @param Event $event An Event instance
     */
    public function filter(Event $event, Response $response)
    {
        if (!$configuration = $event->get('request')->attributes->get('_cache')) {
            return $response;
        }

        if (!$response->isSuccessful()) {
            return $response;
        }

        if (null !== $configuration->getSMaxAge()) {
            $response->setSharedMaxAge($configuration->getSMaxAge());
        }

        if (null !== $configuration->getMaxAge()) {
            $response->setMaxAge($configuration->getMaxAge());
        }

        if (null !== $configuration->getExpires()) {
            $date = \DateTime::create(\DateTime::createFromFormat('U', $configuration->getExpires(), new \DateTimeZone('UTC')));

            $response->setLastModified($date);
        }

        return $response;
    }
 /**
  * @Template()
  * @Route("/packages.json", name="packages", defaults={"_format" = "json"})
  */
 public function packagesAction(Request $req)
 {
     // fallback if any of the dumped files exist
     $rootJson = $this->container->getParameter('kernel.root_dir') . '/../web/packages_root.json';
     if (file_exists($rootJson)) {
         return new Response(file_get_contents($rootJson));
     }
     $rootJson = $this->container->getParameter('kernel.root_dir') . '/../web/packages.json';
     if (file_exists($rootJson)) {
         return new Response(file_get_contents($rootJson));
     }
     if ($req->getHost() === 'packagist.org') {
         $this->get('logger')->alert('packages.json is missing and the fallback controller is being hit');
         return new Response('Horrible misconfiguration or the dumper script messed up', 404);
     }
     $em = $this->get('doctrine')->getManager();
     gc_enable();
     $packages = $em->getRepository('Packagist\\WebBundle\\Entity\\Package')->getFullPackages();
     $notifyUrl = $this->generateUrl('track_download', array('name' => 'VND/PKG'));
     $data = array('notify' => str_replace('VND/PKG', '%package%', $notifyUrl), 'packages' => array());
     foreach ($packages as $package) {
         $versions = array();
         foreach ($package->getVersions() as $version) {
             $versions[$version->getVersion()] = $version->toArray();
             $em->detach($version);
         }
         $data['packages'][$package->getName()] = $versions;
         $em->detach($package);
     }
     unset($versions, $package, $packages);
     $response = new Response(json_encode($data), 200);
     $response->setSharedMaxAge(120);
     return $response;
 }
Example #4
0
 /**
  * Renders page header links with cache control.
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function userLinksAction()
 {
     $response = new Response();
     $response->setSharedMaxAge(3600);
     $response->setVary('Cookie');
     return $this->render('eZDemoBundle::page_header_links.html.twig', array(), $response);
 }
 public function sitemapAction()
 {
     $ttl = 3600 * 6;
     $response = new Response();
     $response->headers->set('Content-Type', 'text/xml');
     $response->setPublic();
     $response->setSharedMaxAge($ttl);
     $siteaccessName = $this->container->get('ezpublish.siteaccess')->name;
     $cacheFile = $this->container->getParameter('kernel.cache_dir') . '/sitemap_' . $siteaccessName . '.xml';
     $cacheFileMtime = 0;
     if (file_exists($cacheFile)) {
         $cacheFileMtime = stat($cacheFile)['mtime'];
     }
     if ($cacheFileMtime < time() - $ttl) {
         $urls = array();
         $hostname = $this->getRequest()->getHost();
         $publishToolsService = $this->get('cjw_publishtools.service.functions');
         $rootLocationId = $this->getConfigResolver()->getParameter('content.tree_root.location_id');
         $listLocations = $publishToolsService->fetchLocationListArr(array($rootLocationId), array('depth' => 10, 'limit' => 25000, 'main_location_only' => true, 'datamap' => false));
         foreach ($listLocations[$rootLocationId]['children'] as $location) {
             $loc = $this->generateUrl($location);
             $lastmod = date('c', $location->contentInfo->modificationDate->getTimestamp());
             $urls[] = array('loc' => $loc, 'lastmod' => $lastmod);
         }
         $sitemapXmlResponse = $this->render('CjwPublishToolsBundle::sitemap.xml.twig', array('urls' => $urls, 'hostname' => 'https://' . $hostname), $response);
         file_put_contents($cacheFile, $sitemapXmlResponse->getContent());
     } else {
         $sitemapXmlResponse = $response->setContent(file_get_contents($cacheFile));
     }
     return $sitemapXmlResponse;
 }
Example #6
0
 /**
  * Displays the list of blog_post
  * Note: This is a fully customized controller action, it will generate the response and call
  *       the view. Since it is not calling the ViewControler we don't need to match a specific
  *       method signature.
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Location $location containing blog posts
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function listBlogPostsAction(Location $location, Request $request)
 {
     $response = new Response();
     // Setting default cache configuration (you can override it in you siteaccess config)
     $response->setSharedMaxAge($this->getConfigResolver()->getParameter('content.default_ttl'));
     // Make the response location cache aware for the reverse proxy
     $response->headers->set('X-Location-Id', $location->id);
     $response->setVary('X-User-Hash');
     $viewParameters = $request->attributes->get('viewParameters');
     // Getting location and content from ezpublish dedicated services
     $repository = $this->getRepository();
     if ($location->invisible) {
         throw new NotFoundHttpException("Location #{$location->id} cannot be displayed as it is flagged as invisible.");
     }
     $content = $repository->getContentService()->loadContentByContentInfo($location->getContentInfo());
     // Getting language for the current siteaccess
     $languages = $this->getConfigResolver()->getParameter('languages');
     // Using the criteria helper (a demobundle custom service) to generate our query's criteria.
     // This is a good practice in order to have less code in your controller.
     $criteria = $this->get('ezdemo.criteria_helper')->generateListBlogPostCriterion($location, $viewParameters, $languages);
     // Generating query
     $query = new Query();
     $query->query = $criteria;
     $query->sortClauses = array(new SortClause\Field('blog_post', 'publication_date', Query::SORT_DESC, $languages[0]));
     // Initialize pagination.
     $pager = new Pagerfanta(new ContentSearchAdapter($query, $this->getRepository()->getSearchService()));
     $pager->setMaxPerPage($this->container->getParameter('ezdemo.blog.blog_post_list.limit'));
     $pager->setCurrentPage($request->get('page', 1));
     return $this->render('eZDemoBundle:full:blog.html.twig', array('location' => $location, 'content' => $content, 'pagerBlog' => $pager), $response);
 }
Example #7
0
 public function indexAction(Request $request)
 {
     //mini formulaire d'abonnement
     $news = new Newsletter();
     $form = $this->createFormBuilder($news)->add('news', 'email')->add('Envoyer', 'submit')->getForm();
     $form->handleRequest($request);
     if ($form->isValid()) {
         $email = $news->getNews();
         $message = \Swift_Message::newInstance()->setSubject('Bonjour')->setFrom($email)->setTo('*****@*****.**')->setBody('Bonjour Fabrice cet email : ' . $email . ' souhaite un abonnement à votre newsletter, cordialement');
         $this->get('mailer')->send($message);
         return $this->redirect($this->generateUrl('front_homepage'));
     }
     $essais = $this->getCat('essais');
     $arr = $this->get('front.base.service')->recupInfo();
     $arr['essais'] = $essais;
     $arr['nav_accueil'] = ' ';
     $arr['nav_xix'] = ' ';
     $arr['nav_essais'] = 'active';
     $arr['nav_litt'] = ' ';
     $arr['nav_audio'] = ' ';
     $arr['nav_video'] = ' ';
     $arr['nav_info'] = ' ';
     $arr['newsletter'] = $form->createView();
     $response = new Response();
     if ($this->getRequest()->isMethod('GET')) {
         $response->setPublic();
         $response->setSharedMaxAge(1);
         $response->setVary(array('Accept-Encoding', 'User-Agent'));
     }
     return $this->render('FrontBundle:Essais:index.html.twig', $arr, $response);
 }
Example #8
0
 /**
  * @Template()
  * @Route("/packages.json", name="packages", defaults={"_format" = "json"})
  */
 public function packagesAction()
 {
     // fallback if any of the dumped files exist
     $rootJson = $this->container->getParameter('kernel.root_dir') . '/../web/packages_root.json';
     if (file_exists($rootJson)) {
         return new Response(file_get_contents($rootJson));
     }
     $rootJson = $this->container->getParameter('kernel.root_dir') . '/../web/packages.json';
     if (file_exists($rootJson)) {
         return new Response(file_get_contents($rootJson));
     }
     $em = $this->get('doctrine')->getEntityManager();
     gc_enable();
     $packages = $em->getRepository('Packagist\\WebBundle\\Entity\\Package')->getFullPackages();
     $notifyUrl = $this->generateUrl('track_download', array('name' => 'VND/PKG'));
     $data = array('notify' => str_replace('VND/PKG', '%package%', $notifyUrl), 'packages' => array());
     foreach ($packages as $package) {
         $versions = array();
         foreach ($package->getVersions() as $version) {
             $versions[$version->getVersion()] = $version->toArray();
             $em->detach($version);
         }
         $data['packages'][$package->getName()] = $versions;
         $em->detach($package);
     }
     unset($versions, $package, $packages);
     $response = new Response(json_encode($data), 200);
     $response->setSharedMaxAge(120);
     return $response;
 }
Example #9
0
 /**
  * Cache the response 1 year (31536000 sec)
  */
 protected function cacheResponse(Response $response)
 {
     $response->setSharedMaxAge(31536000);
     $response->setMaxAge(31536000);
     $response->setExpires(new \DateTime('+1 year'));
     return $response;
 }
 /**
  * Renders page header links with cache control
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function userLinksAction()
 {
     $response = new Response();
     $response->setSharedMaxAge(3600);
     $response->setVary('Cookie');
     return $this->render("BCPageLayoutOverrideTestBundle::page_header_links.html.twig", array(), $response);
 }
Example #11
0
 /**
  * @Route("/catalog/fulltree", name="spb_shop_catalog_fulltree")
  */
 public function fullTreeAction()
 {
     $em = $this->getDoctrine()->getManager();
     $repo = $em->getRepository('SpbShopBundle:Category');
     $controller = $this;
     $options = array('decorate' => true, 'rootOpen' => '<ul class="dropdown-menu">', 'rootClose' => '</ul>', 'childOpen' => function ($child) {
         if ($child['rgt'] - $child['lft'] == 1) {
             return '<li>';
         } else {
             return '<li class="dropdown-submenu">';
         }
     }, 'childClose' => '</li>', 'nodeDecorator' => function ($node) use(&$controller) {
         return '<a href="' . $controller->generateUrl('spb_shop_catalog_category', array('slug' => $node['slug'], 'tag' => $node['tag'])) . '">' . $node['title'] . '</a>';
     });
     $htmlTree = $repo->childrenHierarchy(null, false, $options);
     $response = new Response($htmlTree);
     // пометить ответ как public или private
     $response->setPublic();
     //$response->setPrivate();
     //
     // установить max age для private и shared ответов
     $response->setMaxAge(6000);
     $response->setSharedMaxAge(6000);
     // установить специальную директиву Cache-Control
     $response->headers->addCacheControlDirective('must-revalidate', true);
     return $response;
 }
 /**
  * Controller  for top menu
  * @param int $currentLocationId
  *
  * @return Response
  */
 public function topMenuAction($currentLocationId)
 {
     $rootLocationId = $this->getConfigResolver()->getParameter('content.tree_root.location_id');
     $response = new Response();
     $parameters = array();
     $helper = $this->get('bananamanu_simple_design.subelement_helper');
     $menu = $helper->getSubElementLocation($rootLocationId);
     // Get current master
     try {
         $currentLocation = $this->getRepository()->getLocationService()->loadLocation($currentLocationId);
         $pathString = explode('/', $currentLocation->pathString);
         if ((int) $pathString[3] > 0) {
             $currentMasterLocationId = $pathString[3];
         } else {
             $currentMasterLocationId = $rootLocationId;
         }
     } catch (\Exception $e) {
         $currentMasterLocationId = $rootLocationId;
     }
     // Get current user
     $user = $this->getRepository()->getCurrentUser();
     // Cache control
     $response->setSharedMaxAge(84600);
     $response->setVary('X-User-Hash');
     $response->setPublic();
     $parameters['menu'] = $menu;
     $parameters['user'] = $user;
     $parameters['currentMasterLocationId'] = $currentMasterLocationId;
     return $this->render('BananamanuSimpleDesignBundle::page_topmenu.html.twig', $parameters, $response);
 }
Example #13
0
 public function testSetSharedMaxAge()
 {
     $response = new Response();
     $response->setSharedMaxAge(20);
     $cacheControl = $response->headers->get('Cache-Control');
     $this->assertEquals('public, s-maxage=20', $cacheControl);
 }
Example #14
0
 /**
  * Renders the tag.
  *
  * @param \Netgen\TagsBundle\API\Repository\Values\Tags\Tag $tag
  * @param \Symfony\Component\HttpFoundation\Request $request
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 protected function renderTag(Tag $tag, Request $request)
 {
     $configResolver = $this->getConfigResolver();
     if ($this->adapter instanceof TagAdapterInterface) {
         $this->adapter->setTag($tag);
     }
     $pager = new Pagerfanta($this->adapter);
     $pager->setMaxPerPage($configResolver->getParameter('tag_view.related_content_list.limit', 'eztags'));
     $pager->setCurrentPage($request->get('page', 1));
     $response = new Response();
     $response->headers->set('X-Tag-Id', $tag->id);
     if ($configResolver->getParameter('tag_view.cache', 'eztags') === true) {
         $response->setPublic();
         if ($configResolver->getParameter('tag_view.ttl_cache', 'eztags') === true) {
             $response->setSharedMaxAge($configResolver->getParameter('tag_view.default_ttl', 'eztags'));
         }
         // Make the response vary against X-User-Hash header ensures that an HTTP
         // reverse proxy caches the different possible variations of the
         // response as it can depend on user role for instance.
         if ($request->headers->has('X-User-Hash')) {
             $response->setVary('X-User-Hash');
         }
         $response->setLastModified($tag->modificationDate);
     }
     return $this->render($configResolver->getParameter('tag_view.template', 'eztags'), array('tag' => $tag, 'pager' => $pager), $response);
 }
 /**
  * {@inheritdoc}
  */
 public function update(Response $response)
 {
     // if we have no embedded Response, do nothing
     if (0 === $this->embeddedResponses) {
         return;
     }
     // Remove validation related headers in order to avoid browsers using
     // their own cache, because some of the response content comes from
     // at least one embedded response (which likely has a different caching strategy).
     if ($response->isValidateable()) {
         $response->setEtag(null);
         $response->setLastModified(null);
         $this->cacheable = false;
     }
     if (!$this->cacheable) {
         $response->headers->set('Cache-Control', 'no-cache, must-revalidate');
         return;
     }
     $this->ttls[] = $response->getTtl();
     $this->maxAges[] = $response->getMaxAge();
     if (null !== ($maxAge = min($this->maxAges))) {
         $response->setSharedMaxAge($maxAge);
         $response->headers->set('Age', $maxAge - min($this->ttls));
     }
     $response->setMaxAge(0);
 }
Example #16
0
 /**
  * @Route("/{_locale}", name="donate_front_home", defaults={"_locale"="fr"}, requirements = {"_locale" = "fr|en"})
  */
 public function indexAction(Request $request, $_locale)
 {
     //cache validation tjrs public, c'est l'ESI qui gère la sidebar
     $response = new Response();
     $response->setPublic();
     $response->setSharedMaxAge(3600);
     $data = new Customer();
     $layoutMgr = $this->get('donate_core.layout.manager');
     $layout = $layoutMgr->getDefault($_locale);
     $form = $this->createForm(new DonationType($this->get('translator')), $data, array('civilities' => $this->getParameter('donate_front.form.civility'), 'equivalences' => $this->get('donate_core.equivalence.factory')->getAll(), 'payment_methods' => $this->get('donate_core.payment_method_discovery')->getEnabledMethods(), 'affectations' => $layout->getAffectations()));
     $form->handleRequest($request);
     if ($form->isValid()) {
         $intentMgr = $this->get('donate_core.intent_manager');
         $paymentMethods = $this->get('donate_core.payment_method_discovery')->getEnabledMethods();
         foreach ($paymentMethods as $pm) {
             if ($form->get('payment_method')->get($pm->getId())->isClicked()) {
                 $amount = $form->get('tunnels')->get($pm->getTunnel())->getData();
                 $intent = $intentMgr->newIntent($amount, $pm->getId());
                 $intent->setFiscalReceipt($form['erf']->getData());
                 //add affectation if any
                 $intent->setAffectationCode($form['affectations']->getData());
                 $data->addIntent($intent);
                 $em = $this->getDoctrine()->getManager();
                 $em->persist($data);
                 $em->flush();
                 $response = $intentMgr->handle($intent);
                 return $response;
             }
         }
     }
     return $this->render('DonateFrontBundle:Form:index.html.twig', array('form' => $form->createView()), $response);
 }
Example #17
0
 private function getResponse(Request $request, $name, array $files, $content_type)
 {
     if (!isset($files[$name])) {
         return new Response('Not Found', 404, array('Content-Type' => 'text/plain'));
     }
     $file = $files[$name];
     $response = new Response();
     $response->setPublic();
     $response->setMaxAge(self::EXPIRED_TIME);
     $response->setSharedMaxAge(self::EXPIRED_TIME);
     $response->headers->set('Content-Type', $content_type);
     // set a custom Cache-Control directive
     $response->headers->addCacheControlDirective('must-revalidate', true);
     $date = new \DateTime();
     $date->setTimestamp(strtotime($this->container->getParameter('sf.version')));
     $response->setETag($date->getTimestamp());
     $response->setLastModified($date);
     if ($response->isNotModified($request)) {
         return $response;
     }
     if (!file_exists($file)) {
         throw new \Exception(sprintf("file `%s`, `%s` not exists", $name, $file));
     }
     $response->setContent(file_get_contents($file));
     return $response;
 }
 /**
  * Update a valid non cacheable Response with http cache headers
  *
  * @see http://symfony.com/fr/doc/current/book/http_cache.html
  */
 public function handleResponse(Response $response)
 {
     // do not handle invalid response
     if (!$response->isOk()) {
         return $response;
     }
     // do not handle response with http cache headers
     if ($response->isCacheable()) {
         return $response;
     }
     // seek for optional configuration
     $this->readRoutingConfiguration();
     // mark the response as private
     $response->setPrivate();
     // set the private or shared max age
     $response->setMaxAge($this->duration);
     $response->setSharedMaxAge($this->duration);
     // set expires
     $date = new \DateTime();
     $date->modify(sprintf('+%d seconds', $this->duration));
     $response->setExpires($date);
     // set a custom Cache-Control directive
     $response->headers->addCacheControlDirective('must-revalidate', true);
     return $response;
 }
 /**
  * @return Response
  */
 private function getEmptyXmlResponse()
 {
     $response = new Response(null, Response::HTTP_OK, ['Content-type' => 'text/xml', 'X-Robots-Tag' => 'noindex']);
     $sharedMaxAge = $this->getServiceContainer()->getParameter('werkspot.sitemap.cache.shared_max_age');
     $response->setSharedMaxAge($sharedMaxAge);
     return $response;
 }
 /**
  * Index Action
  *
  * @return Response
  */
 public function indexAction()
 {
     $response = new Response();
     $response->setPublic();
     $response->setSharedMaxAge(86400);
     // 1 day
     return $this->render('UnifikSystemBundle:Frontend/Home:index.html.twig', [], $response);
 }
Example #21
0
 /**
  * Creates a Symfony response, and apply appropriate caching headers
  * @param $config array
  * @param $image string
  * @return Response
  */
 protected function generateResponse($config, $image)
 {
     $response = new Response($image, 200, array('Content-Type' => 'image/png'));
     $response->setPublic();
     $response->setMaxAge($config['time']);
     $response->setSharedMaxAge($config['time']);
     return $response;
 }
 /**
  * @Route("/news/latest", name="latest")
  * @param $maxPerPage
  * @return Response
  */
 public function latestAction($maxPerPage)
 {
     $response = new Response();
     // mark the response as either public
     $response->setPublic();
     // ...
     $response->setSharedMaxAge(60);
     return $response;
 }
 /**
  * @Method("GET")
  * @Route("/", name="homepage", options={"sitemap" = true})
  */
 public function defaultAction()
 {
     $response = new Response();
     $response->setPublic();
     $response->setMaxAge(60);
     $response->setSharedMaxAge(60);
     $response->setContent($this->renderView('page/homepage.html.twig'));
     return $response;
 }
Example #24
0
 public static function createFromImage(Image $image, $status, $maxage = 3600, $smaxage = 3600)
 {
     $response = new Response((string) $image, $status);
     $response->headers->set('Content-Type', 'image/svg+xml;charset=utf-8');
     $contentDisposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $image->getOutputFileName());
     $response->headers->set('Content-Disposition', $contentDisposition);
     $response->setMaxAge($maxage);
     $response->setSharedMaxAge($smaxage);
     return $response;
 }
Example #25
0
 /**
  * Google Verification route
  *
  * @param string $key
  * @Route("/google{key}.html", requirements={ "key": "[a-zA-Z0-9]*" })
  * @Method("GET")
  * @throws NotFoundHttpException
  * @return Response
  */
 public function googleVerifAction($key)
 {
     if ($this->getConfigResolver()->getParameter('google_verification', 'novae_zseo') != $key) {
         throw new NotFoundHttpException("Google Verification Key not found");
     }
     $response = new Response();
     $response->setSharedMaxAge(24 * 3600);
     $response->setContent("google-site-verification: google{$key}.html");
     return $response;
 }
Example #26
0
 private function updateHeaders(Response $response, Response $subResponse)
 {
     if ($this->response->isCacheable() && $subResponse->isCacheable()) {
         $maxAge = (int) min($response->headers->getCacheControlDirective('max-age'), $subResponse->headers->getCacheControlDirective('max-age'));
         $sMaxAge = (int) min($response->headers->getCacheControlDirective('s-maxage'), $subResponse->headers->getCacheControlDirective('s-maxage'));
         $response->setSharedMaxAge($sMaxAge);
         $response->setMaxAge($maxAge);
     } else {
         $this->response->headers->set('Cache-Control', 'no-cache, must-revalidate');
     }
 }
 /**
  * @param Request $request
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function embedAction(Request $request)
 {
     $response = new Response();
     $response->setPrivate();
     $response->setMaxAge(0);
     $response->setSharedMaxAge(0);
     $response->headers->addCacheControlDirective('must-revalidate', true);
     $response->headers->addCacheControlDirective('no-store', true);
     $response->headers->set(HttpCache::HEADER_REVERSE_PROXY_TTL, 0);
     return $this->render($this->getTemplate(Configuration::TYPE_LOGIN, Configuration::TEMPLATE_FORM_EMBED), ['user' => $this->getUser()], $response);
 }
Example #28
0
 /**
  * @Template()
  * @Route("/packages.json", name="packages")
  */
 public function packagesAction()
 {
     $packages = $this->get('doctrine')->getRepository('Packagist\\WebBundle\\Entity\\Package')->getFullPackages();
     $data = array();
     foreach ($packages as $package) {
         $data[$package->getName()] = $package->toArray();
     }
     $response = new Response(json_encode($data), 200, array('Content-Type' => 'application/json'));
     $response->setSharedMaxAge(60);
     return $response;
 }
 /**
  * Updates the Response HTTP headers based on the embedded Responses.
  *
  * @param Response $response
  */
 public function update(Response $response)
 {
     if (!$this->cacheable) {
         $response->headers->set('Cache-Control', 'no-cache, must-revalidate');
         return;
     }
     $maxAge = min($this->maxAges);
     $response->setSharedMaxAge($maxAge);
     $response->setMaxAge(0);
     $response->headers->set('Age', $maxAge - min($this->ttls));
 }
 /**
  * Set response max age
  *
  * @param Response $response
  * @param string   $status
  * @param int      $maxAge
  * @param bool     $hasEsi
  */
 protected function setResponseMaxAge(Response $response, $status, $maxAge, $hasEsi)
 {
     if (-1 === $maxAge) {
         $maxAge = 2629743;
     }
     if (true === $hasEsi && CacheableInterface::CACHE_PUBLIC == $status) {
         $response->setSharedMaxAge($maxAge);
     } else {
         $response->setMaxAge($maxAge);
     }
 }