Subversion Repositories eFlore/Applications.del

Rev

Blame | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Contexte permet d'encapsuler les super globales et de définir le contexte du web service courrant.
 *
 * @category  DEL
 * @package   Services
 * @package   Bibliotheque
 * @version   0.1
 * @author    Mathias CHOUET <mathias@tela-botanica.org>
 * @author    Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author    Aurelien PERONNET <aurelien@tela-botanica.org>
 * @license   GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Contexte {

        private $conteneur;
        private $get;
        private $getBrut;
        private $post;
        private $session;
        private $cookie;
        private $server;
        private $urlRessource;

        private $mapping = array('getPhp' => 'get',
                'getQS' => 'getBrut',
                'getPost' => 'post',
                'getServer' => 'server',
                'getSession' => 'session',
                'getCookie' => 'cookie',
                'getRessource' => 'urlRessource',
                'setCookie' => 'cookie');

        public function __construct($conteneur, &$server, &$get, &$post, &$session, &$cookie) {
                $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
                $this->server = $server;
                $this->get = $this->nettoyerParametres($get);
                $this->getBrut = $this->recupererParametresBruts();
                $this->post = $post;
                $this->session = $session;
                $this->cookie = $cookie;
                $this->urlRessource = $this->decouperUrlChemin();
        }

        public function __call($nom, $arguments) {
                if (!isset($this->mapping[$nom])) {
                        $msg = "La méthode $nom n'existe pas dans l'objet {get_class()}";
                        throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
                }
                $attributNom = $this->mapping[$nom];
                $data = $this->$attributNom;

                if (substr($nom, 0, 3) == 'get') {
                        $cle = isset($arguments[0]) ? $arguments[0] : null;
                        return $this->getGenerique($data, $cle);
                } else if (substr($nom, 0, 3) == 'set') {
                        $cle = isset($arguments[0]) ? $arguments[0] : null;
                        $valeur = isset($arguments[1]) ? $arguments[1] : null;
                        return $this->setGenerique($data, $cle, $valeur);
                }
        }

        private function getGenerique($data, $cle) {
                $retour = null;
                if ($cle === null) {
                        $retour = $data;
                } else if (isset($data[$cle])) {
                        $retour = $data[$cle];
                }
                return $retour;
        }

        private function setGenerique($data, $cle, $valeur) {
                if ($valeur === null) {
                        unset($data[$cle]);
                } else {
                        $data[$cle] = $valeur;
                }
        }

        private function nettoyerParametres(Array $parametres) {
                // Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
                if (isset($parametres) && count($parametres) > 0) {
                        foreach ($parametres as $cle => $valeur) {
                                // les quotes, guillements et points-virgules ont été retirés des caractères à vérifier car
                                //ça n'a plus lieu d'être maintenant que l'on utilise protéger à peu près partout
                                $verifier = array('NULL', "\\", "\x00", "\x1a");
                                $parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
                        }
                }
                return $parametres;
        }

        private function recupererParametresBruts() {
                $parametres_bruts = array();
                if (isset($this->server['QUERY_STRING']) && !empty($this->server['QUERY_STRING'])) {
                        $paires = explode('&', $this->server['QUERY_STRING']);
                        foreach ($paires as $paire) {
                                if ($paire != '' && substr_count($paire, '=') == 1) {
                                        $nv = explode('=', $paire);
                                        $nom = urldecode($nv[0]);
                                        $valeur = urldecode($nv[1]);
                                        $parametres_bruts[$nom] = $valeur;
                                }
                        }
                        $parametres_bruts = $this->nettoyerParametres($parametres_bruts);
                }
                return $parametres_bruts;
        }

        private function decouperUrlChemin() {
                if (isset($this->server['REDIRECT_URL']) && $this->server['REDIRECT_URL'] != '') {
                        if (isset($this->server['REDIRECT_QUERY_STRING']) && !empty($this->server['REDIRECT_QUERY_STRING'])) {
                                $url = $this->server['REDIRECT_URL'].'?'.$this->server['REDIRECT_QUERY_STRING'];
                        } else {
                                $url = $this->server['REDIRECT_URL'];
                        }
                } else {
                        $url = $this->server['REQUEST_URI'];
                }

                $tailleQueryString = strlen($this->server['QUERY_STRING']);
                $tailleURL = ($tailleQueryString == 0) ?  strlen($url) : -($tailleQueryString + 1);

                $urlChaine = '';
                if (strpos($url, $this->conteneur->getParametre('serveur.baseURL')) !== false) {
                        $urlChaine = substr($url, strlen($this->conteneur->getParametre('serveur.baseURL')), $tailleURL);
                } else if (strpos($url, $this->conteneur->getParametre('serveur.baseAlternativeURL')) !== false) {
                        $urlChaine = substr($url, strlen($this->conteneur->getParametre('serveur.baseAlternativeURL')), $tailleURL);
                }
                return explode('/', $urlChaine);
        }
}