/** * 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(); }
/** * * @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('/"/', '\\"', 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'); } }