Subversion Repositories Applications.framework

Rev

Rev 412 | Rev 422 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 412 Rev 417
Line 33... Line 33...
33
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
33
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
34
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
34
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
35
 * @license		GPL v3 <http://www.gnu.org/licenses/gpl.txt>
35
 * @license		GPL v3 <http://www.gnu.org/licenses/gpl.txt>
36
 * @license		CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
36
 * @license		CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
37
 * @since 		0.3
37
 * @since 		0.3
38
 * @version		$Id: RestServeur.php 359 2011-08-30 13:53:45Z delphine $
38
 * @version		$Id: RestServeur.php 413 2012-03-15 13:59:19Z jpm $
39
 * @link		/doc/framework/
39
 * @link		/doc/framework/
40
 */
40
 */
41
// TODO : gerer les retours : dans ce controleur : code retour et envoi ...
41
// TODO : gerer les retours : dans ce controleur : code retour et envoi ...
42
class RestServeur {
42
class RestServeur {
Line 138... Line 138...
138
	 * @var array
138
	 * @var array
139
	 */
139
	 */
140
	private $ressources = array();
140
	private $ressources = array();
Line 141... Line 141...
141
 
141
 
-
 
142
	/** Partie de l'url situé après le '?' servant à paramétrer le service demandé.
-
 
143
	 * Les données proviennent de $_GET où les caractères suivant ont été transformé en '_' undescrore dans les clés :
-
 
144
	 * - chr(32) ( ) (space)
-
 
145
	 * - chr(46) (.) (dot)
-
 
146
	 * - chr(91) ([) (open square bracket)
-
 
147
	 * - chr(128) - chr(159) (various)
142
	/** Partie de l'url situé après le '?' servant à paramétrer le service demandé.
148
	 * En outre nous appliquons la méthode nettoyerGet() qui effectue d'autres remplacement dans les valeurs.
-
 
149
	 * Ex. http://www.mondomaine.org/services/apiVersion/mon-service?monParametre1=maValeur1&monParametre2=maValeur2
143
	 * Ex. http://www.mondomaine.org/services/apiVersion/mon-service?monParametre1=maValeur1&monParametre2=maValeur2
150
	 * @see parametresBruts
144
	 * @var array
151
	 * @var array
145
	 */
152
	 */
Line -... Line 153...
-
 
153
	private $parametres = array();
-
 
154
 
-
 
155
	/** Partie de l'url situé après le '?' servant à paramétrer le service demandé.
-
 
156
	 * Les données proviennent de $_SERVER['QUERY_STRING'] et n'ont subies aucune transformation au niveau des clés.
-
 
157
	 * Cependant nous appliquons la méthode nettoyerGet() qui effectue d'autres remplacement dans les valeurs.
-
 
158
	 * Ex. http://www.mondomaine.org/services/apiVersion/mon-service?monParametre1=maValeur1&monParametre2=maValeur2
-
 
159
	 * @see parametres
-
 
160
	 * @var array
-
 
161
	 */
146
	private $parametres = array();
162
	private $parametresBruts = array();
147
 
163
 
148
	/** Tableau contenant les paramètres de configuration du serveur.
164
	/** Tableau contenant les paramètres de configuration du serveur.
149
	 * @var array
165
	 * @var array
Line 304... Line 320...
304
			}
320
			}
305
		}
321
		}
306
	}
322
	}
Line 307... Line 323...
307
 
323
 
308
	private function initialiserParametres() {
324
	private function initialiserParametres() {
309
		$this->nettoyerGet();
325
		$this->parametres = $this->recupererParametresGet();
310
		$this->parametres = $_GET;
326
		$this->parametresBruts = $this->recupererParametresBruts();
Line 311... Line 327...
311
	}
327
	}
-
 
328
 
-
 
329
	private function recupererParametresGet() {
-
 
330
		$_GET = $this->nettoyerParametres($_GET);
-
 
331
		return $_GET;
-
 
332
	}
312
 
333
 
313
	private function nettoyerGet() {
334
	private function nettoyerParametres(Array $parametres) {
314
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
335
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
-
 
336
		if (isset($parametres) && count($parametres) > 0) {
-
 
337
			foreach ($parametres as $cle => $valeur) {
315
		if (isset($_GET) && count($_GET) > 0) {
338
				// les quotes, guillements et points-virgules ont été retirés des caractères à vérifier car
316
			foreach ($_GET as $cle => $valeur) {
339
				//ça n'a plus lieu d'être maintenant que l'on utilise protéger à peu près partout
-
 
340
				$verifier = array('NULL', "\\", "\x00", "\x1a");
-
 
341
				$parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
-
 
342
			}
-
 
343
		}
-
 
344
		return $parametres;
-
 
345
	}
-
 
346
 
-
 
347
	private function recupererParametresBruts() {
-
 
348
		$parametres_bruts = array();
-
 
349
		if (!empty($_SERVER['QUERY_STRING'])) {
-
 
350
			$paires = explode('&', $_SERVER['QUERY_STRING']);
-
 
351
			foreach ($paires as $paire) {
-
 
352
				$nv = explode('=', $paire);
-
 
353
				$nom = urldecode($nv[0]);
317
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
354
				$valeur = urldecode($nv[1]);
-
 
355
				$parametres_bruts[$nom] = $valeur;
318
				$_GET[$cle] = strip_tags(str_replace($verifier, '', $valeur));
356
			}
-
 
357
			$parametres_bruts = $this->nettoyerParametres($parametres_bruts);
319
			}
358
		}
Line 320... Line 359...
320
		}
359
		return $parametres_bruts;
321
	}
360
	}
322
 
361
 
Line 377... Line 416...
377
		$retour = '';
416
		$retour = '';
378
		if ($this->service != null) {
417
		if ($this->service != null) {
379
			$Service = new $this->service(self::$config);
418
			$Service = new $this->service(self::$config);
380
			if (method_exists($Service, self::METHODE_GET)) {
419
			if (method_exists($Service, self::METHODE_GET)) {
381
				$methodeGet = self::METHODE_GET;
420
				$methodeGet = self::METHODE_GET;
-
 
421
				$parametres = $Service->utiliserParametresBruts() ? $this->parametresBruts : $this->parametres;
382
				$retour = $Service->$methodeGet($this->ressources, $this->parametres);
422
				$retour = $Service->$methodeGet($this->ressources, $parametres);
383
			} else {
423
			} else {
384
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
424
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
385
				$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_GET."' nécessaire ".
425
				$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_GET."' nécessaire ".
386
					"lors de l'appel du service via la méthode HTTP GET.";
426
					"lors de l'appel du service via la méthode HTTP GET.";
387
				self::ajouterMessage($e);
427
				self::ajouterMessage($e);
Line 392... Line 432...
392
 
432
 
393
	private function post() {
433
	private function post() {
394
		$retour = '';
434
		$retour = '';
395
		$paires = $this->parserDonneesRequete();
435
		$paires = $this->parserDonneesRequete();
396
		if (count($paires) != 0) {
436
		if (count($paires) != 0) {
397
			if (isset($paires['action']) && $paires['action'] == 'DELETE') {// Altnative à l'utilisation de DELETE
437
			if (isset($paires['action']) && $paires['action'] == 'DELETE') {// Alternative à l'utilisation de DELETE
398
				$this->delete();
438
				$this->delete();
399
			} else if (count($this->ressources) == 0) {// Altnative à l'utilisation de PUT
439
			} else if (count($this->ressources) == 0) {// Alternative à l'utilisation de PUT
400
				$retour = $this->put();
440
				$retour = $this->put();
401
			} else {
441
			} else {
402
				if ($this->service != null) {
442
				if ($this->service != null) {
403
					$Service = new $this->service(self::$config);
443
					$Service = new $this->service(self::$config);
Line 430... Line 470...
430
		if (count($paires) != 0) {
470
		if (count($paires) != 0) {
431
			if ($this->service != null) {
471
			if ($this->service != null) {
432
				$Service = new $this->service(self::$config);
472
				$Service = new $this->service(self::$config);
433
				if (method_exists($Service, self::METHODE_PUT)) {
473
				if (method_exists($Service, self::METHODE_PUT)) {
434
					$methodePut = self::METHODE_PUT;
474
					$methodePut = self::METHODE_PUT;
435
					$retour = $Service->$methodePut($this->ressources, $paires);
475
					$retour = $Service->$methodePut($this->ressources, $paires);
436
					if ($retour !== false) {
476
					if ($retour !== false) {
437
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK);
477
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK);
438
					}
478
					}
439
				} else {
479
				} else {
440
					self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
480
					self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
441
					$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_PUT."' nécessaire ".
481
					$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_PUT."' nécessaire ".
442
						"lors de l'appel du service via la méthode HTTP GET.";
482
						"lors de l'appel du service via la méthode HTTP GET.";