Example #1
0
 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());
 }
Example #2
0
 /**
  * @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;
 }
Example #3
0
 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'));
 }