public function testJsonpCacheHit() { $_SERVER['HTTP_HOST'] = 'example.com'; $_SERVER['REQUEST_METHOD'] = 'GET'; $_SERVER['REQUEST_URI'] = '/path?foo=aaa&bar=bbb&callback=testcallback&_=123456'; $_GET = array('_url' => '/path', 'foo' => 'aaa', 'bar' => 'bbb', 'callback' => 'testcallback', '_' => '123456'); $request = new Request(); $this->di->set('request', $request); $this->di->getViewCache()->flush(); $this->di->getViewCache()->save('d6bd338ec8eb8666f3d054566f335039_b', '{"foo":"bar"}'); $this->di->getViewCache()->save('d6bd338ec8eb8666f3d054566f335039_h', '{"Content-Type":"application\\/json;+charset=utf-8","X-EvaEngine-Interceptor-Cache":"2014-12-09T06:45:42+0100"}'); $interceptor = new DispatchInterceptor(); /** * @var Dispatcher $dispatcher */ $dispatcher = $this->di->getDispatcher(); $dispatcher->setParams(array('_dispatch_cache' => 'lifetime=100&format=jsonp')); $this->assertEquals(false, $interceptor->injectInterceptor($dispatcher)); $this->assertEquals('testcallback({"foo":"bar"})', $this->di->getResponse()->getContent()); }
/** * @param DispatcherInterface $dispatcher * @return bool true if cache missed(intercepter injected), false if cache hit(intercepter not injected) */ public function injectInterceptor(DispatcherInterface $dispatcher) { /** * @var \Phalcon\DI $di */ $di = $dispatcher->getDI(); $config = $di->getConfig(); // cache is disable if (!$config->cache->enable) { return true; } $params = $this->getInterceptorParams($dispatcher); if (!$params) { return true; } $methodsAllow = $params['methods']; /** * @var \Phalcon\Http\Request $request */ $request = $di->getRequest(); $requestMethod = strtolower($request->getMethod()); if (false === in_array($requestMethod, $methodsAllow)) { return true; } /** * @var \Phalcon\Cache\Backend $cache */ $cache = $di->getViewCache(); $interceptResult = $this->intercept($request, $params, $cache); //cache key matched, response already prepared if (true === $interceptResult) { $di->getResponse()->send(); return false; } $self = $this; //Cache missed /** * @var \Phalcon\Events\Manager $eventsManager */ $eventsManager = $di->getEventsManager(); $eventsManager->attach('application:beforeSendResponse', function ($event, $application) use($self, $params) { $bodyKey = $self->getCacheBodyKey(); $headersKey = $self->getCacheHeadersKey(); if (!$bodyKey || !$headersKey) { return true; } /** * @var \Phalcon\Http\ResponseInterface $response */ $response = $application->getDI()->getResponse(); $body = $response->getContent(); $headers = $response->getHeaders()->toArray(); $headersCache = array(); if ($headers) { //Filter allowed headers $headersCache = array_intersect_key($headers, array_flip($self->getCachableHeaderKeys())); } $headersCache[Dispatch::CACHE_HEADER_FLAG] = date(DATE_ISO8601); $cache = $application->getDI()->getViewCache(); $request = $application->getDI()->getRequest(); $callbackKey = $params['jsonp_callback_key']; //Jsonp change to json if ($params['format'] == 'jsonp' && $callbackKey && ($callbackValue = $request->getQuery($callbackKey))) { $body = Dispatch::changeJsonpToJson($body, $callbackValue); } $cache->save($bodyKey, $body, $params['lifetime']); //$cache->save($headersKey, serialize($headersCache), $params['lifetime']); $cache->save($headersKey, json_encode($headersCache), $params['lifetime']); return true; }); return true; }
public function testTextCacheHitWithCorsEnabled() { $this->di->getViewCache()->save('d6bd338ec8eb8666f3d054566f335039_h', '{"foo":"header"}'); $this->di->getViewCache()->save('d6bd338ec8eb8666f3d054566f335039_b', 'bar'); $_SERVER['HTTP_ORIGIN'] = 'https://api.bar.com'; $interceptor = new DispatchInterceptor(); /** * @var Dispatcher $dispatcher */ $dispatcher = $this->di->getDispatcher(); $dispatcher->setParams(array('_dispatch_cache' => 'lifetime=100&cors_enabled=true')); /* * Cors enabled when function injectInterceptor was called. * So before calling function injectInterceptor, there will be no Access-Control-Allow-Origin header. */ $this->assertEquals(false, $this->di->getResponse()->getHeaders()->get('Access-Control-Allow-Origin')); $this->assertEquals(false, $interceptor->injectInterceptor($dispatcher)); $this->assertEquals('bar', $this->di->getResponse()->getContent()); $this->assertEquals($_SERVER['HTTP_ORIGIN'], $this->di->getResponse()->getHeaders()->get('Access-Control-Allow-Origin')); }