Example #1
0
 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;
 }
Example #2
0
 private function sendPreAppOptionsResponse(Request $request, Response $response)
 {
     $response->setStatus(HTTP_STATUS["OK"]);
     $response->setHeader("Allow", implode(",", $this->options->allowedMethods));
     $response->end(null);
 }
Example #3
0
 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();
 }
Example #4
0
 /**
  * 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];
 }