/**
  * Handle an incoming request.
  *
  * @param Request $request
  * @param Response $response
  * @param callable $next
  * @return mixed
  */
 public function __invoke(Request $request, Response $response, callable $next = null)
 {
     $this->discoverer->start();
     return $this->discoverer->getResponse();
 }
Ejemplo n.º 2
0
 /**
  *
  * @param ServerRequestInterface|null $request
  * @param ResponseInterface|null $response
  * @param CacheProvider|null $cache
  * @return array
  */
 public function route(ServerRequestInterface $request = null, ResponseInterface $response = null, CacheProvider $cache = null)
 {
     $cacheDir = $this->config->getCacheDirectory();
     $cacheKey = $this->config->getApiProperty('id');
     $cacheLifetime = $this->config->getCacheLifetime();
     $request = $request ?: ServerRequestFactory::fromGlobals();
     $response = $response ?: new Response();
     $cache = $cache ?: new FilesystemCache($cacheDir);
     if (count($request->getHeader('Ext-Direct-Token1')) == 0) {
         throw new \InvalidArgumentException('The Token1 is invalid');
     }
     if (count($request->getHeader('Ext-Direct-Token2')) == 0) {
         throw new \InvalidArgumentException('The Token2 is invalid');
     }
     $token1 = $request->getHeader('Ext-Direct-Token1')[0];
     $token2 = $request->getHeader('Ext-Direct-Token2')[0];
     session_id($token1);
     session_start();
     if (!$_SESSION['Ext-Direct-Token2']) {
         throw new \InvalidArgumentException('The session data is invalid');
     }
     if (strcmp($_SESSION['Ext-Direct-Token2'], $token2) != 0) {
         throw new \InvalidArgumentException('Token2 verification failed');
     }
     if ($cache->contains($cacheKey)) {
         $classMap = $cache->fetch($cacheKey);
     } else {
         $discoverer = new Discoverer($this->config);
         $classMap = $discoverer->mapClasses();
         $cache->save($cacheKey, $classMap, $cacheLifetime);
     }
     $actionsResults = [];
     $actions = $this->getActions($request, $classMap);
     $upload = false;
     foreach ($actions as $action) {
         $actionsResults[] = $action->run();
         if ($action->isUpload()) {
             $upload = true;
         }
     }
     if ($upload) {
         $result = sprintf('<html><body><textarea>%s</textarea></body></html>', preg_replace('/&quot;/', '\\&quot;', json_encode($actionsResults[0], \JSON_UNESCAPED_UNICODE)));
         $response->getBody()->write($result);
         $this->response = $response->withHeader('Content-Type', 'text/html');
     } else {
         if (count($actionsResults) == 1) {
             $response->getBody()->write(json_encode($actionsResults[0], \JSON_UNESCAPED_UNICODE));
         } else {
             $response->getBody()->write(json_encode($actionsResults, \JSON_UNESCAPED_UNICODE));
         }
         $this->response = $response->withHeader('Content-Type', 'application/json');
     }
 }