public function execute() { $sPath = Request::path(); foreach ($this->routes as $sKey => $sMethod) { if (preg_match('~' . $sKey . '~', $sPath)) { debug(get_class($this) . " -> {$sMethod}() [{$sPath} => {$sKey}]"); if ($sMethod[0] == '#') { $sMethod = substr($sMethod, 1); if (class_exists($sMethod)) { return Service::create($sMethod)->execute(); } else { debug('Service not found: ' . $sMethod); $this->error404(); } } else { if (method_exists($this, $sMethod)) { $this->catchAll(); $bReturn = $this->{$sMethod}(); P::mark(get_class($this) . '::' . $sMethod); Response::end(); return $bReturn; } else { debug('Method not found: ' . get_class($this) . '::' . $sMethod . '()'); $this->error404(); } } } } debug(get_class($this) . " -> NO MATCH"); return false; }
private function sendPreAppOptionsResponse(Request $request, Response $response) { $response->setStatus(HTTP_STATUS["OK"]); $response->setHeader("Allow", implode(",", $this->options->allowedMethods)); $response->end(null); }
public function __invoke(Request $request, Response $response, ...$args) { if ($request->getMethod() !== "GET") { $response->setStatus(HTTP_STATUS["METHOD_NOT_ALLOWED"]); $response->setHeader("Allow", "GET"); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } if ($request->getProtocolVersion() !== "1.1") { $response->setStatus(HTTP_STATUS["HTTP_VERSION_NOT_SUPPORTED"]); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } $body = $request->getBody(); if (!$body instanceof NullBody) { $response->setStatus(HTTP_STATUS["BAD_REQUEST"]); $response->setReason("Bad Request: Entity body disallowed for websocket endpoint"); $response->setHeader("Connection", "close"); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } $hasUpgradeWebsocket = false; foreach ($request->getHeaderArray("Upgrade") as $value) { if (strcasecmp($value, "websocket") === 0) { $hasUpgradeWebsocket = true; break; } } if (empty($hasUpgradeWebsocket)) { $response->setStatus(HTTP_STATUS["UPGRADE_REQUIRED"]); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } $hasConnectionUpgrade = false; foreach ($request->getHeaderArray("Connection") as $value) { $values = array_map("trim", explode(",", $value)); foreach ($values as $token) { if (strcasecmp($token, "Upgrade") === 0) { $hasConnectionUpgrade = true; break; } } } if (empty($hasConnectionUpgrade)) { $response->setStatus(HTTP_STATUS["UPGRADE_REQUIRED"]); $response->setReason("Bad Request: \"Connection: Upgrade\" header required"); $response->setHeader("Upgrade", "websocket"); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } if (!($acceptKey = $request->getHeader("Sec-Websocket-Key"))) { $response->setStatus(HTTP_STATUS["BAD_REQUEST"]); $response->setReason("Bad Request: \"Sec-Websocket-Key\" header required"); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } if (!in_array("13", $request->getHeaderArray("Sec-Websocket-Version"))) { $response->setStatus(HTTP_STATUS["BAD_REQUEST"]); $response->setReason("Bad Request: Requested Websocket version unavailable"); $response->setHeader("Sec-WebSocket-Version", "13"); $response->setHeader("Aerys-Generic-Response", "enable"); $response->end(); return; } $handshaker = new Handshake($response, $acceptKey); $onHandshakeResult = $this->application->onHandshake($request, $handshaker, ...$args); if ($onHandshakeResult instanceof \Generator) { $onHandshakeResult = (yield from $onHandshakeResult); } $request->setLocalVar("aerys.websocket", $onHandshakeResult); $handshaker->end(); }
/** * Run one of the mapped callbacks to a passed HTTP Method. * @param array $args The arguments to be passed to the callback * @param string $method The HTTP Method requested. * @return array The callback response. */ public function run(array $args, $method = 'get') { $method = strtolower($method); if (Request::method() !== $method) { return false; } // Call direct middlewares if ($this->middlewares) { // Reverse middlewares order foreach (array_reverse($this->middlewares) as $mw) { $mw_result = call_user_func($mw->bindTo($this)); if (false === $mw_result) { return ['']; } } } $callback = $this->callback; if (is_array($this->callback)) { if (array_key_exists($method, $this->callback)) { $callback = $this->callback[$method]; } } Event::trigger('core.route.before', $this); // Start capturing output Response::start(); $this->response = ''; $view_results = call_user_func_array($callback->bindTo($this), $args); // Render View if returned, else echo string or encode json response if (null !== $view_results) { if (is_a($view_results, 'View') || is_string($view_results)) { echo $this->response = (string) $view_results; } else { Response::json($view_results); } } Response::end(); // Apply afters if ($this->afters) { // Reverse middlewares order foreach (array_reverse($this->afters) as $cb) { call_user_func($cb->bindTo($this)); } } Event::trigger('core.route.after', $this); return [$this->response]; }