public function testResponseDateIsNotModifiedByCacheListener() { $now = \DateTime::createFromFormat('D, d M Y H:i:s T', 'Fri, 12 Dec 2014 12:46:14 GMT'); $this->cacheStrategy->setCanUseResponseFromCache(true); $request = Request::create('/'); $response = new Response('"ok"'); $response->setDate($now); $this->storage->save($request, $response); $event = new ProxyRequestEvent($request, null, $this->proxy); $event->setLogger(new LoggerProxy()); $this->proxyCacheListener->onProxyRequest($event); $this->assertEquals('Fri, 12 Dec 2014 12:46:14 GMT', $response->getHeader('date')[0]); $this->assertEquals('HIT', $response->getHeader('X-Cache')[0]); }
/** * * @priority normal * @param ProxyRequestEvent $event * * @throws \Exception */ public function onProxyRequest(ProxyRequestEvent $event) { if (!$event->isCancelled() && !$event->hasResponse()) { $response = $this->storage->fetch($event->getRequest()); $request = $event->getRequest(); if ($this->cacheStrategy->canUseResponseFromCache($request, $response)) { /** * The "Date" header field represents the date and time at which the message was originated * http://tools.ietf.org/html/rfc7231#section-7.1.1.2 */ $event->getLogger()->debug('Response was read from cache'); $response->addHeader('X-Cache', 'HIT'); $response->addHeader('X-Cache-Hits', 1); $now = new \DateTime('now'); $oldAge = $response->getHeader('Age', 0); $oldAge = $oldAge[0]; $response->setHeader('Age', $oldAge + ($now->getTimestamp() - $response->getDate()->getTimestamp())); $event->setResponse($response); } } }
/** * Filter and mark incoming requests * * @priority high * * @param ProxyRequestEvent $event */ public function onProxyRequest(ProxyRequestEvent $event) { if (!$event->isCancelled() && !$event->hasResponse()) { $response = null; $request = $event->getRequest(); $config = $event->getProxy()->getConfig(); if ($this->isSelfRequest($request, $config)) { $event->setIsCancelled(); $event->getLogger()->warning(sprintf('Proxy server made a call to itself that cannot be handled, request will be cancelled')); } elseif (in_array($request->getHost(), $config->getHostsOnPort($request->getPort()))) { // display proxy welcome page as it is a direct hit $response = new Response($this->getResource('home.html', $event->getProxy()), 200); } elseif (!$this->firewall->isAllowed($request)) { $event->setIsCancelled(); $event->getLogger()->debug(sprintf('Request was cancelled as it was not allowed by a firewall')); } if ($response) { $event->setResponse($response); } } }