Changeset 78576 in spip-zone


Ignore:
Timestamp:
Nov 17, 2013, 10:21:53 PM (5 years ago)
Author:
rastapopoulos@…
Message:

Début de nouvelle implémentation de l'abstraction HTTP. Ça ne fait pour l'instant rien de plus que la version précédente, mais ça le fait en utilisant la librairie HTTPFoundation de Symfony, avec un objet Request et un Response transportés un peu partout.

Les implémentations DOIVENT avoir une fonction "http_monimplémentation_erreur_dist($code, $requete, $reponse)" qui sait renvoyer une Response complète dans le format de cette implémentation.
En effet, on lève parfois des erreurs directement depuis le plugin "http", avant même d'être déjà rentré dans une fonction plus précise de l'implémentation.

Location:
_plugins_/http/trunk
Files:
201 added
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/http/trunk/action/api_http.php

    r70312 r78576  
    33// Sécurité
    44if (!defined('_ECRIRE_INC_VERSION')) return;
     5
     6include_once _DIR_PLUGIN_HTTP.'vendor/autoload.php';
     7use Symfony\Component\HttpFoundation\Request;
     8use Symfony\Component\HttpFoundation\Response;
    59
    610/*
     
    1115 * http://www.site.tld/http.api/atom/patates/1234 => entry, GET=lecture, PUT=mise à jour
    1216 */
    13 function action_api_http_dist(){       
     17function action_api_http_dist(){
     18        // On crée les informations sur la requête cliente
     19        $requete = Request::createFromGlobals();
     20        // On crée déjà la réponse, mais totalement vide, qui sera modifiée et remplie au fil du temps
     21        $reponse = new Response();
     22       
    1423        // Il faut au moins le format dans l'argument sinon rien
    15         if (!$arg = _request('arg')){
    16                 header('Status: 404 Not Found');
    17                 exit;
     24        if (!$arg = $requete->query->get('arg')){
     25                $reponse->setStatusCode('404');
    1826        }
    1927        else{
     28                // On récupère les trois informations possibles, seul $format est obligatoire :
     29                // http.api/json
     30                // http.api/json/patates
     31                // http.api/json/patates/1234
    2032                list($format, $collection, $ressource) = explode('/', $arg);
    2133                define('_SET_HTML_BASE', true);
    2234               
    23                 // Si le format n'a pas le bon format ou que le fichier avec l'implémentation n'existe pas, on arrête
     35                // Si le format n'a pas le bon format, on arrête
    2436                if (!preg_match('/^[\w]+$/', $format)){
    25                         header('Status: 404 Not Found');
    26                         exit;
     37                        $reponse->setStatusCode('404');
    2738                }
    28                
    29                 $methode = $_SERVER["REQUEST_METHOD"];
    30                
    31                 // Si on est dans une méthode où il FAUT poster quelque chose
    32                 if (in_array($methode, array('POST', 'PUT', 'PATCH'))){
    33                         // On récupère le contenu
    34                         $contenu = trim(file_get_contents("php://input"));
    35                 }
    36                
    37                 // On cherche ce qu'on est en train de demander avec cette URL
    38                 // S'il n'y a pas de collection c'est l'index
    39                 if (!$collection){
    40                         $type = 'index';
    41                 }
    42                 // Sinon s'il n'y a que la collection sans la ressource
    43                 elseif (!$ressource){
    44                         $type = 'collection';
    45                 }
    46                 // Sinon c'est une ressource
    4739                else{
    48                         $type = 'ressource';
    49                 }
    50 
    51                 // Le GET peut se faire sur : la racine du serveur, une collection, une ressource
    52                 if ($methode == 'GET'
    53                         and $fonction = charger_fonction("get_$type", "http/$format/", true) // http_atom_get_index()
    54                 ){
    55                         // On teste l'autorisation sinon 401
    56                         if (
    57                                 autoriser("get_$type", $collection, $ressource) // autoriser_patates_get_collection_dist()
     40                        // On garde en mémoire dans la requête les infos trouvées précédemment
     41                        $requete->attributes->add(array(
     42                                'format' => $format,
     43                                'collection' => $collection,
     44                                'ressource' => $ressource,
     45                        ));
     46                        $methode = $requete->getMethod();
     47                       
     48                        // Avec le format, on cherche une fonction d'erreur propre au format, qui est obligatoire
     49                        $fonction_erreur = charger_fonction('erreur', "http/$format/");
     50                       
     51                        // On cherche ce qu'on est en train de demander avec cette URL
     52                        // S'il n'y a pas de collection c'est l'index
     53                        if (!$collection){
     54                                $type_reponse = 'index';
     55                        }
     56                        // Sinon s'il n'y a que la collection sans la ressource
     57                        elseif (!$ressource){
     58                                $type_reponse = 'collection';
     59                        }
     60                        // Sinon c'est une ressource
     61                        else{
     62                                $type_reponse = 'ressource';
     63                        }
     64                       
     65                        // Le GET peut se faire sur : la racine du serveur, une collection, une ressource
     66                        if ($methode == 'GET'
     67                                and $fonction = charger_fonction("get_$type_reponse", "http/$format/", true) // http_atom_get_index()
    5868                        ){
    59                                 $fonction($collection, $ressource);
     69                                // Si on a l'autorisation, on lance la fonction trouvée
     70                                if (
     71                                        autoriser("get_$type_reponse", $collection, $ressource) // autoriser_patates_get_collection_dist()
     72                                ){
     73                                        $reponse = $fonction($requete, $reponse);
     74                                }
     75                                // Sinon on lève une 401
     76                                else{
     77                                        $reponse = $fonction_erreur(401,$requete, $reponse);
     78                                }
    6079                        }
     80                        // Si on a trouvé aucune fonction correspondant aux paramètres, ça n'existe pas
    6181                        else{
    62                                 header('Status: 401 Unauthorized');
    63                                 exit;
     82                                $reponse = $fonction_erreur(404, $requete, $reponse);
    6483                        }
    6584                }
    66                 // Si la fonction n'existe pas ça n'existe pas
    67                 else{
    68                         header('Status: 404 Not Found');
    69                         exit;
    70                 }
    7185        }
     86       
     87        //  Enfin, s'il n'y a pas eu d'exit en amont, on envoie la réponse
     88        $reponse->prepare($requete);
     89        $reponse->send();
    7290}
    73 
    74 ?>
  • _plugins_/http/trunk/paquet.xml

    r78545 r78576  
    22        prefix="http"
    33        categorie="outil"
    4         version="0.1.0"
     4        version="1.0.0"
    55        etat="dev"
    66        compatibilite="[3.0.0;3.0.*]"
    77        logo="http.png"
    8         documentation="http://www.spip-contrib.net/?articleXXXX"
    98>
    109        <nom>Serveur HTTP abstrait</nom>
    1110       
    1211        <auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
    13         <copyright>2011</copyright>
     12        <credit lien="http://symfony.com/fr/doc/current/components/http_foundation/introduction.html">Symfony pour HTTPFoundation</credit>
     13        <copyright>2013</copyright>
    1414        <licence>GPL v3</licence>
    1515       
Note: See TracChangeset for help on using the changeset viewer.