Ejemplo n.º 1
0
 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];
 }