diff --git a/build/api/core/Loader.php b/build/api/core/Loader.php new file mode 100644 index 0000000..166db62 --- /dev/null +++ b/build/api/core/Loader.php @@ -0,0 +1,96 @@ + URI + * + * @return outName outDesc + * + ---------------------------------------------------------*/ + public static function remote($uri){ + + /* (1) Fetch HttpRequest correct data + ---------------------------------------------------------*/ + /* (1) Parse HttpRequest data because php doesn't parse it for non-POST HTTP method */ + $httprequest = new HttpRequest(); + + /* (2) For later use -> replace default @_POST global */ + $_POST = $httprequest->POST(); + + /* (3) Get @data from @_POST values */ + $data = $_POST; + + + /* (2) Check if @path var is set + ---------------------------------------------------------*/ + /* (1) If is in @uri */ + $pathInUrl = is_string($uri) && preg_match('#^/?([\w_-]+/[\w_-]+)(?:/?|/((?:\w+/)*(?:\w+/?)))$#', $uri, $uriMatches); + + /* (2) Get @path from @uri + @uri arguments if there is */ + if( $pathInUrl ){ + + // {1} Add @path as data // + $data['path'] = $uriMatches[1]; + + // {2} Add $uri arguments as data 'URL_@i' (@i is the order beginnint at 0) // + if( count($uriMatches) > 2 ){ + + $uriParams = explode('/', trim($uriMatches[2], '/')); + + foreach($uriParams as $k=>$v) + $data["URL_$k"] = $v; + + } + + } + + /* (3) If @path haven't been found -> error */ + if( !isset($data['path']) ) + return new Request(); + + + + /* (3) Parse arguments from JSON + ---------------------------------------------------------*/ + /* (1) Init. arguments */ + $params = []; + + /* (2) Parse each arg (except @path) */ + foreach($data as $name=>$value){ + + if( $name === 'path' ) + continue; + + // {1} Json parse // + $json = json_decode( $value, true ); + + // {2} if valid -> set the parsed value // + if( !is_null($json) ) + $params[$name] = $json; + + // {3} else -> leave it like it was // + else + $params[$name] = $value; + } + + + /* (4) Build an API Request object + ---------------------------------------------------------*/ + return new Request($data['path'], $params); + } + + + + + } \ No newline at end of file diff --git a/build/api/core/Request.php b/build/api/core/Request.php index f652c5c..5daf940 100644 --- a/build/api/core/Request.php +++ b/build/api/core/Request.php @@ -6,7 +6,6 @@ use \api\core\ModuleFactory; use \error\core\Error; use \error\core\Err; - use \http\core\HttpRequest; class Request{ @@ -335,88 +334,6 @@ } - /* DESERIALISATION A PARTIR DE L'URL ET DES DONNEES POST (OPT) - * - * @url Contenu de l'url formatté (commence à "/module/methode") - * - * @return instance Retourne un objet de type - * - * @note - * 1. `path` peut être dans l'url : /method/module - * `path` peut être dans les données $_POST - * 2. les données peuvent être dans l'url : /module/method/data1/data2/... - * les données peuvent être dans les données $_POST - * - */ - public static function remote($url){ - - /* [1] Fetch HttpRequest correct data - =========================================================*/ - /* (1) Parse HttpRequest data because php doesn't parse it for non-POST HTTP method */ - $httprequest = new HttpRequest(); - $_POST = $httprequest->POST(); - - $data = $_POST; - - /* [2] On verifie que le @path est renseigne - =========================================================*/ - /* (1) Si le path est dans @url */ - $pathInUrl = is_string($url) && preg_match('#^/?([\w_-]+/[\w_-]+)(?:/?|/((?:\w+/)*(?:\w+/?)))$#', $url, $urlMatches); - - /* (2) On récupère le @path + les arguments dans l'URL */ - if( $pathInUrl ){ - // {1} On ajoute le @path aux données // - $data['path'] = $urlMatches[1]; - - // {2} On ajoute les arguments d'URL aux données // - if( count($urlMatches) > 2 ){ - - $urlParams = explode('/', trim($urlMatches[2], '/')); - foreach($urlParams as $k=>$v) - $data["URL_$k"] = $v; - - } - - } - - - /* (2) On vérifie dans tous les cas si le path existe */ - if( !isset($data['path']) ) - return new Request(); - - - - /* [3] On met les paramètres en JSON - =========================================================*/ - /* (1) On initialise les paramètres*/ - $params = []; - - /* (2) On met tous les paramètres en json (sauf @path) */ - foreach($data as $name=>$value){ - if( $name === 'path' ) - continue; - - // {1} On met en JSON // - $json = json_decode( $value, true ); - - // {2} Si ok -> on remplace // - if( !is_null($json) ) - $params[$name] = $json; - - // {3} Sinon, on laisse tel quel // - else - $params[$name] = $value; - } - - /* [4] On retourne une instance de - =========================================================*/ - return new Request($data['path'], $params); - } - - - - - /* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE * * @path String correspondant au chemin de delegation ("module/methode") diff --git a/public_html/index.php b/public_html/index.php index 58c3ffd..1423c47 100755 --- a/public_html/index.php +++ b/public_html/index.php @@ -3,6 +3,7 @@ require_once '../vendor/autoload.php'; use \router\core\Router; + use \api\core\Loader; use \api\core\Request; use \api\core\Response; use \database\core\DatabaseDriver; @@ -203,7 +204,7 @@ if( !$GLOBALS['session_guard']->init_child() ) die(json_encode([ 'error' => 100, 'ErrorDescription' => 'session_guard.child error' ])); - $request = Request::remote($url[0]); + $request = Loader::remote($url[0]); $answer = $request->dispatch(); // Si c'est une réponse (et non un download)