/** * @param Oxygen_Http_Request $request * * @return null|Oxygen_Http_Response|Oxygen_Util_HookedClosure */ public function handle(Oxygen_Http_Request $request) { $dispatcher = $this->container->getDispatcher(); if (!$request->accepts('application/oxygen')) { // Public request. $publicRequestEvent = new Oxygen_Event_PublicRequestEvent($request); $dispatcher->dispatch(Oxygen_Event_Events::PUBLIC_REQUEST, $publicRequestEvent); if ($publicRequestEvent->hasDeferredResponse()) { return $publicRequestEvent->getDeferredResponse(); } return $publicRequestEvent->getResponse(); } try { // Master request. $requestData = json_decode($request->getContent(), true); if (!is_array($requestData)) { throw new RuntimeException('The request does not contain valid JSON.'); } /** @var Oxygen_Util_RequestData $requestData */ $requestData = (object) $requestData; $masterRequestEvent = new Oxygen_Event_MasterRequestEvent($request, $requestData); $dispatcher->dispatch(Oxygen_Event_Events::MASTER_REQUEST, $masterRequestEvent); $result = $this->container->getActionKernel()->handle($request, $requestData); if ($result instanceof Oxygen_Http_Response) { return $this->notifyResponse($request, $requestData, $result); } else { $callback = new Oxygen_Util_Closure(array($this, 'wrapResponse'), $request, $requestData, $result->getCallable()); return new Oxygen_Util_HookedClosure($result->getHookName(), $callback->getCallable()); } } catch (Exception $e) { return $this->handleException($request, isset($requestData) ? $requestData : null, $e); } }