function dispatch($request_uri, $options) { /* parse request uri start * ----------------------------------- */ $p = strpos($request_uri, '?'); $request_uri = $p !== false ? substr($request_uri, 0, $p) : $request_uri; /* security request uri filter. */ if (preg_match('/(\\.\\.|\\"|\'|<|>)/', $request_uri)) { return array('errno' => 403, 'data' => "permission denied."); } /* get display format. */ if (($p = strrpos($request_uri, '.')) !== false) { $tail = substr($request_uri, $p + 1); if (preg_match('/^[a-zA-Z0-9]+$/', $tail)) { $display = $tail; //'json' $request_uri = substr($request_uri, 0, $p); } } /* get version, module, id, method. */ $requests = array_pad(explode('/', $request_uri, 5), 5, NULL); list(, $module, $id, $method) = $requests; /* default format: json */ empty($display) && ($display = 'json'); empty($method) && ($method = 'get'); if (isset($_GET['id'])) { $id = $_GET['id']; } $_ENV['module'] = $module; $_ENV['id'] = $id; $_ENV['method'] = $method; $_ENV['display'] = $display; //$_ENV['version']= $version; /*------------------------------------- * parse request uri end */ if (empty($module)) { $dt = array('errno' => CYE_PARAM_ERROR, 'code' => 404, 'data' => 'Not found.'); goto end; } if ($module == 'static') { $file = CY_HOME . '/app' . $request_uri . '.' . $display; if (is_file($file)) { $content = file_get_contents($file); return ['errno' => 0, 'code' => 200, 'data' => $content]; } } $classname = 'CA_Entry_' . $module; if (!method_exists($classname, $method) && !method_exists($classname, '__call')) { $classname .= '_' . $method; $run = isset($_GET['a']) ? $_GET['a'] : 'run'; if (!method_exists($classname, $run)) { $errno = CYE_PARAM_ERROR; $error = "method is not exists {$classname}:{$method}"; $dt = array('errno' => $errno, 'code' => 404, 'data' => 'unkown request.', 'error' => $error); goto end; } $eny = new $classname(); $dt = $eny->{$method}($id, $_REQUEST, $_ENV); } else { $eny = new $classname(); $dt = $eny->{$method}($id, $_REQUEST, $_ENV); } unset($eny); if ($dt['errno'] !== 0) { cy_log(CYE_ERROR, json_encode($dt)); if ($dt['errno'] != CYE_PARAM_ERROR) { $dt['code'] = 500; } else { $dt['code'] = 200; } if (empty($dt['error'])) { $dt['data'] = 'Internal error.'; } else { $dt['data'] = $dt['error']; } } else { $dt['code'] = 200; } end: if ($display === 'html' || $display === 'php') { if ($dt['errno'] == 0) { $files = array(); $files[] = CY_HOME . '/app/html/' . $module . '/' . $method . '.' . $display; $files[] = CY_HOME . '/app/html/' . $module . '.' . $display; $files[] = CY_HOME . '/app/html/default.' . $display; foreach ($files as $i => $file) { if (is_file($file)) { break; } if ($i === 1 && $display === 'html') { $_ENV['display'] = $display = 'php'; goto end; } } } else { $file = CY_HOME . '/app/html/error.' . $display; } } else { $file = NULL; } $t = new CY_Util_Output(); $t->assign(['errno' => $dt['errno'], 'data' => $dt['data']]); $data = $t->get($file); return ['errno' => 0, 'code' => $dt['code'], 'data' => $data]; }