Subversion Repositories Applications.framework

Rev

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

Rev 360 Rev 366
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 360 2011-09-01 13:30:16Z jpm $
38
 * @version		$Id: RestServeur.php 366 2011-09-30 08:20:45Z 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 351... Line 351...
351
	
351
	
352
	/**
352
	/**
353
	 * Execute la requête.
353
	 * Execute la requête.
354
	 */
354
	 */
-
 
355
	public function executer() {
355
	public function executer() {
356
		$retour = '';
356
		switch ($this->methode) {
357
		switch ($this->methode) {
357
			case 'GET':
358
			case 'GET':
358
				$this->get();
359
				$retour = $this->get();
359
				break;
360
				break;
360
			case 'POST':
361
			case 'POST':
361
				$this->post();
362
				$this->post();
362
				break;
363
				break;
363
			case 'DELETE':
364
			case 'DELETE':
364
				$this->delete();
365
				$this->delete();
365
				break;
366
				break;
366
			case 'PUT':
367
			case 'PUT':
367
				$this->put();
368
				$retour = $this->put();
368
				break;
369
				break;
369
			default :
370
			default :
370
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_METHODE_NON_AUTORISE);
371
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_METHODE_NON_AUTORISE);
371
				header('Allow: GET, POST, DELETE, PUT');
372
				header('Allow: GET, POST, DELETE, PUT');
372
				$e = "La méthode HTTP '{$this->methode}' n'est pas prise en compte par ce serveur REST.\n".
373
				$e = "La méthode HTTP '{$this->methode}' n'est pas prise en compte par ce serveur REST.\n".
373
					"Consulter l'entête Allow pour connaître les méthodes autorisées.";
374
					"Consulter l'entête Allow pour connaître les méthodes autorisées.";
374
				self::ajouterMessage($e);
375
				self::ajouterMessage($e);
375
		}
376
		}
376
		$this->cloreAccesServeur();
377
		$this->cloreAccesServeur($retour);
Line 377... Line 378...
377
	}
378
	}
378
 
379
 
379
	/**
380
	/**
380
	 * Execute a GET request. A GET request fetches a list of resource when no resource name is given, a list of element
381
	 * Execute a GET request. A GET request fetches a list of resource when no resource name is given, a list of element
381
	 * when a resource name is given, or a resource element when a resource and resource unique identifier are given. It does not change the
382
	 * when a resource name is given, or a resource element when a resource and resource unique identifier are given. It does not change the
382
	 * database contents.
383
	 * database contents.
-
 
384
	 */
383
	 */
385
	private function get() {
384
	private function get() {
386
		$retour = '';
385
		if ($this->service != null) {
387
		if ($this->service != null) {
386
			$Service = new $this->service(self::$config);
388
			$Service = new $this->service(self::$config);
387
			if (method_exists($Service, self::METHODE_GET)) {
389
			if (method_exists($Service, self::METHODE_GET)) {
388
				$methodeGet = self::METHODE_GET;
390
				$methodeGet = self::METHODE_GET;
389
				$Service->$methodeGet($this->ressources, $this->parametres);
391
				$retour = $Service->$methodeGet($this->ressources, $this->parametres);
390
			} else {
392
			} else {
391
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
393
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
392
				$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_GET."' nécessaire ".
394
				$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_GET."' nécessaire ".
393
					"lors de l'appel du service via la méthode HTTP GET.";
395
					"lors de l'appel du service via la méthode HTTP GET.";
394
				self::ajouterMessage($e);
396
				self::ajouterMessage($e);
-
 
397
			}
395
			}
398
		}
Line 396... Line 399...
396
		}
399
		return $retour;
397
	}
400
	}
398
 
401
 
399
	private function post() {
402
	private function post() {
400
		$paires = $this->parserDonneesRequete();
403
		$paires = $this->parserDonneesRequete();
401
		if (count($paires) != 0) {
404
		if (count($paires) != 0) {
402
			if (isset($paires['action']) && $paires['action'] == 'DELETE') {// Altnative à l'utilisation de DELETE
405
			if (isset($paires['action']) && $paires['action'] == 'DELETE') {// Altnative à l'utilisation de DELETE
403
				$this->delete();
406
				$retour = $this->delete();
404
			} else if (count($this->ressources) == 0) {// Altnative à l'utilisation de PUT
407
			} else if (count($this->ressources) == 0) {// Altnative à l'utilisation de PUT
405
				$this->put();
408
				$retour = $this->put();
406
			} else {
409
			} else {
407
				if ($this->service != null) {
410
				if ($this->service != null) {
Line 518... Line 521...
518
	}
521
	}
Line 519... Line 522...
519
	
522
	
520
	/**
523
	/**
521
	 * Termine l'accès au serveur après envoir envoyer les messages.
524
	 * Termine l'accès au serveur après envoir envoyer les messages.
522
	 */
525
	 */
523
	private static function cloreAccesServeur() {
526
	private static function cloreAccesServeur($retour) {
524
		// 	Gestion des exceptions et erreurs générées par les services
527
		// 	Gestion des exceptions et erreurs générées par les services
-
 
528
		$retour .= self::gererErreurs();
525
		self::gererErreurs();
529
		
526
		// Envoie des messages d'erreur et d'avertissement du serveur
530
		// Envoie des messages d'erreur et d'avertissement du serveur
-
 
531
		$retour .= self::envoyerMessages();
-
 
532
		
-
 
533
		// Envoie sur la sortie standard le contenu de la réponse HTTP
-
 
534
		print $retour;
527
		self::envoyerMessages();
535
		
528
		// Nous terminons le script
536
		// Nous terminons le script
529
		exit(0);
537
		exit(0);
Line 530... Line 538...
530
	}
538
	}
Line 541... Line 549...
541
	 *  - Debug::MODE_ENTETE_HTTP : les message sont stockés par le gestionnaire d'exception sous forme d'erreur de type 
549
	 *  - Debug::MODE_ENTETE_HTTP : les message sont stockés par le gestionnaire d'exception sous forme d'erreur de type 
542
	 *  E_USER_NOTICE et sont renvoyés dans un entête HTTP (X_REST_DEBOGAGE_MESSAGES) à la fin de l'execution du programme.
550
	 *  E_USER_NOTICE et sont renvoyés dans un entête HTTP (X_REST_DEBOGAGE_MESSAGES) à la fin de l'execution du programme.
543
	 *  - Autre valeur : les messages sont formatés puis retournés par la fonction de débogage (à vous de les afficher).
551
	 *  - Autre valeur : les messages sont formatés puis retournés par la fonction de débogage (à vous de les afficher).
544
	 */
552
	 */
545
	public static function gererErreurs() {
553
	public static function gererErreurs() {
-
 
554
		$retour = '';
546
		if (self::$debogageActivation && GestionnaireException::getExceptionsNbre() > 0) {
555
		if (self::$debogageActivation && GestionnaireException::getExceptionsNbre() > 0) {
-
 
556
			
547
			$exceptionsTriees = GestionnaireException::getExceptionsTriees();
557
			$exceptionsTriees = GestionnaireException::getExceptionsTriees();
548
			reset($exceptionsTriees);
558
			reset($exceptionsTriees);
549
			$debogageSeulement = true;
559
			$debogageSeulement = true;
550
			if (array_key_exists(E_USER_ERROR, $exceptionsTriees)) {
560
			if (array_key_exists(E_USER_ERROR, $exceptionsTriees)) {
551
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_ERREUR);
561
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_ERREUR);
Line 554... Line 564...
554
			
564
			
555
			$exceptionsFormatees = array();
565
			$exceptionsFormatees = array();
556
			foreach ($exceptionsTriees as $exceptions) {
566
			foreach ($exceptionsTriees as $exceptions) {
557
				foreach ($exceptions as $e) {
567
				foreach ($exceptions as $e) {
558
					if ($debogageSeulement && self::$debogageMode == Debug::MODE_ENTETE_HTTP) {
568
					if ($debogageSeulement && self::$debogageMode == Debug::MODE_ENTETE_HTTP) {
559
						$exceptionsFormatees[] = GestionnaireException::formaterExceptionTxt($e);
569
						$exceptionsFormatees[] = GestionnaireException::formaterExceptionDebug($e);
560
					} else {
570
					} else {
561
						echo GestionnaireException::formaterExceptionXhtml($e);
571
						$retour = GestionnaireException::formaterExceptionXhtml($e);
562
					}
572
					}
563
				}
573
				}
Line 564... Line 574...
564
			}
574
			}
565
			
575
			
566
			if ($debogageSeulement && self::$debogageMode == Debug::MODE_ENTETE_HTTP) {
576
			if ($debogageSeulement && self::$debogageMode == Debug::MODE_ENTETE_HTTP) {
567
				header('X_REST_DEBOGAGE_MESSAGES: '.json_encode($exceptionsFormatees));
577
				header('X_REST_DEBOGAGE_MESSAGES: '.json_encode($exceptionsFormatees));
-
 
578
			}
568
			}
579
		}
Line 569... Line 580...
569
		}
580
		return $retour;
570
	}
581
	}
Line 586... Line 597...
586
	 * Le format d'envoie est text/plain encodé en UTF-8.
597
	 * Le format d'envoie est text/plain encodé en UTF-8.
587
	 */
598
	 */
588
	private static function envoyerMessages() {
599
	private static function envoyerMessages() {
589
		if (count(self::$messages) > 0) {
600
		if (count(self::$messages) > 0) {
590
			header("Content-Type: text/plain; charset=utf-8");
601
			header("Content-Type: text/plain; charset=utf-8");
591
			print implode("\n", self::$messages);
602
			return implode("\n", self::$messages);
592
		}
603
		}
593
	}
604
	}
594
}
605
}
595
?>
606
?>
596
607