Subversion Repositories Applications.framework

Rev

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

Rev 416 Rev 421
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 416 2012-05-15 09:23:45Z jpm $
38
 * @version		$Id: RestServeur.php 421 2013-04-11 14:43:49Z 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 184... Line 184...
184
		self::HTTP_CODE_CONTENU_REQUIS => 'Length Required',
184
		self::HTTP_CODE_CONTENU_REQUIS => 'Length Required',
185
		self::HTTP_CODE_ERREUR => 'Internal Server Error'
185
		self::HTTP_CODE_ERREUR => 'Internal Server Error'
186
	);
186
	);
Line 187... Line 187...
187
 
187
 
188
	/** Tableau des noms des paramètres à définir dans le fichier de config car obligatoirement nécessaire à cette classe.*/
188
	/** Tableau des noms des paramètres à définir dans le fichier de config car obligatoirement nécessaire à cette classe.*/
Line 189... Line 189...
189
	private $parametres_obligatoires = array('debogage', 'debogage_mode', 'serveur.baseURL', 'chemin_modules');
189
	private $parametres_obligatoires = array('debogage', 'debogage_mode', 'serveur.baseURL', 'chemin_services');
190
 
190
 
191
	/**
191
	/**
192
	 * Analyse les données envoyées au serveur, enregistre la méthode HTTP utilisée pour appeler le serveur et parse
192
	 * Analyse les données envoyées au serveur, enregistre la méthode HTTP utilisée pour appeler le serveur et parse
Line 265... Line 265...
265
 
265
 
266
	private function initialiserApiVersion($apiVersion) {
266
	private function initialiserApiVersion($apiVersion) {
267
		if ($this->verifierApiVersion($apiVersion)) {
267
		if ($this->verifierApiVersion($apiVersion)) {
268
			$this->apiVersion = $apiVersion;
268
			$this->apiVersion = $apiVersion;
-
 
269
			self::$config['chemins']['api'] = Config::get('chemin_modules').$this->apiVersion.DS;
269
			self::$config['chemins']['api'] = Config::get('chemin_modules').$this->apiVersion.DS;
270
			self::$config['chemins']['api_bibliotheque'] = self::$config['chemins']['api'].Config::get('dossier_bibliotheque').DS;
270
		} else {
271
		} else {
271
			self::envoyerEnteteStatutHttp(self::HTTP_CODE_MAUVAISE_REQUETE);
272
			self::envoyerEnteteStatutHttp(self::HTTP_CODE_MAUVAISE_REQUETE);
272
			$e = "Aucune version d'API n'a été spécifiée.\n".
273
			$e = "Aucune version d'API n'a été spécifiée.\n".
273
				"La version doit respecter l'expression régulière suivante : ".self::MOTIF_API_VERSION.".\n".
274
				"La version doit respecter l'expression régulière suivante : ".self::MOTIF_API_VERSION.".\n".
Line 368... Line 369...
368
	*/
369
	*/
369
	public static function chargerClasse($classe) {
370
	public static function chargerClasse($classe) {
370
		if (class_exists($classe)) {
371
		if (class_exists($classe)) {
371
			return null;
372
			return null;
372
		}
373
		}
373
		$chemins = array('', self::$config['chemins']['api']);
374
		$chemins = array('', self::$config['chemins']['api'], self::$config['chemins']['api_bibliotheque']);
374
		foreach ($chemins as $chemin) {
375
		foreach ($chemins as $chemin) {
375
			$chemin = $chemin.$classe.'.php';
376
			$chemin = $chemin.$classe.'.php';
376
			if (file_exists($chemin)) {
377
			if (file_exists($chemin)) {
377
				require_once $chemin;
378
				require_once $chemin;
378
			}
379
			}
Line 395... Line 396...
395
				$this->delete();
396
				$this->delete();
396
				break;
397
				break;
397
			case 'PUT':
398
			case 'PUT':
398
				$retour = $this->put();
399
				$retour = $this->put();
399
				break;
400
				break;
-
 
401
			// Autorise l'accès depuis des serveurs tiers
-
 
402
			/*
-
 
403
			case 'OPTIONS':
-
 
404
				header('Access-Control-Allow-Origin: *');
-
 
405
				header('Access-Control-Allow-Headers:origin, content-type');
-
 
406
				header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
-
 
407
				header('Access-Control-Allow-Content-Type: application/json');
-
 
408
				header('Access-Control-Max-Age: 3628800');
-
 
409
				header('Access-Control-Allow-Credentials: false');
-
 
410
				break;
-
 
411
			*/
400
			default :
412
			default :
401
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_METHODE_NON_AUTORISE);
413
				self::envoyerEnteteStatutHttp(self::HTTP_CODE_METHODE_NON_AUTORISE);
402
				header('Allow: GET, POST, DELETE, PUT');
414
				header('Allow: GET, POST, DELETE, PUT');
403
				$e = "La méthode HTTP '{$this->methode}' n'est pas prise en compte par ce serveur REST.\n".
415
				$e = "La méthode HTTP '{$this->methode}' n'est pas prise en compte par ce serveur REST.\n".
404
					"Consulter l'entête Allow pour connaître les méthodes autorisées.";
416
					"Consulter l'entête Allow pour connaître les méthodes autorisées.";
Line 470... Line 482...
470
		if (count($paires) != 0) {
482
		if (count($paires) != 0) {
471
			if ($this->service != null) {
483
			if ($this->service != null) {
472
				$Service = new $this->service(self::$config);
484
				$Service = new $this->service(self::$config);
473
				if (method_exists($Service, self::METHODE_PUT)) {
485
				if (method_exists($Service, self::METHODE_PUT)) {
474
					$methodePut = self::METHODE_PUT;
486
					$methodePut = self::METHODE_PUT;
475
					$retour = $Service->$methodePut($this->ressources, $paires);
487
					$retour = $Service->$methodePut($this->ressources, $paires);
476
					if ($retour !== false) {
488
					if ($retour !== false) {
477
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK);
489
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK);
478
					}
490
					}
479
				} else {
491
				} else {
480
					self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
492
					self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
481
					$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_PUT."' nécessaire ".
493
					$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_PUT."' nécessaire ".
482
						"lors de l'appel du service via la méthode HTTP GET.";
494
						"lors de l'appel du service via la méthode HTTP GET.";
Line 491... Line 503...
491
		return $retour;
503
		return $retour;
492
	}
504
	}
Line 493... Line 505...
493
 
505
 
494
	private function delete() {
506
	private function delete() {
-
 
507
		if (count($this->ressources) != 0) {
495
		if (count($this->ressources) != 0) {
508
			$paires = $this->parserDonneesRequete();
496
			if ($this->service != null) {
509
			if ($this->service != null) {
497
				$Service = new $this->service(self::$config);
510
				$Service = new $this->service(self::$config);
498
				if (method_exists($Service, self::METHODE_DELETE)) {
511
				if (method_exists($Service, self::METHODE_DELETE)) {
499
					$methodeDelete = self::METHODE_DELETE;
512
					$methodeDelete = self::METHODE_DELETE;
500
					$info = $Service->$methodeDelete($this->ressources);
513
					$info = $Service->$methodeDelete($this->ressources, $paires);
501
					if ($info === true) {
514
					if ($info === true) {
502
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_SUPPRESSION_OK);
515
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_SUPPRESSION_OK);
503
					} else if ($info === false) {
516
					} else if ($info === false) {
504
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
517
						$this->envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE);
Line 529... Line 542...
529
	private function parserDonneesRequete() {
542
	private function parserDonneesRequete() {
530
		$donnees = array();
543
		$donnees = array();
531
		if ($this->requeteDonneesParsees != null) {
544
		if ($this->requeteDonneesParsees != null) {
532
			$donnees = $this->requeteDonneesParsees;
545
			$donnees = $this->requeteDonneesParsees;
533
		} else if ($this->requeteDonnees != null) {
546
		} else if ($this->requeteDonnees != null) {
-
 
547
			if (preg_match('/application\/json/', $_SERVER['CONTENT_TYPE'])) {
-
 
548
				$donnees = json_decode($this->requeteDonnees, true);
-
 
549
			} else {
534
			$paires = explode('&', $this->requeteDonnees);
550
				$paires = explode('&', $this->requeteDonnees);
535
			foreach ($paires as $paire) {
551
				foreach ($paires as $paire) {
536
				list($cle, $valeur) = explode('=', $paire);
552
					list($cle, $valeur) = explode('=', $paire);
537
				$cle = (isset($cle)) ? trim(urldecode($cle)) : '';
553
					$cle = (isset($cle)) ? trim(urldecode($cle)) : '';
538
				$valeur = (isset($valeur)) ? trim(urldecode($valeur)) : '';
554
					$valeur = (isset($valeur)) ? trim(urldecode($valeur)) : '';
539
				$donnees[$cle] = $valeur;
555
					$donnees[$cle] = $valeur;
-
 
556
				}
540
			}
557
			}
541
			$this->requeteDonneesParsees = $donnees;
558
			$this->requeteDonneesParsees = $donnees;
542
		}
559
		}
543
		return $donnees;
560
		return $donnees;
544
	}
561
	}
Line 563... Line 580...
563
		$retour .= self::gererErreurs();
580
		$retour .= self::gererErreurs();
Line 564... Line 581...
564
 
581
 
565
		// Envoie des messages d'erreur et d'avertissement du serveur
582
		// Envoie des messages d'erreur et d'avertissement du serveur
Line -... Line 583...
-
 
583
		$retour .= self::envoyerMessages();
-
 
584
 
-
 
585
		// Autorise l'accès depuis des serveurs tiers
566
		$retour .= self::envoyerMessages();
586
		//header('Access-Control-Allow-Origin: *');
567
 
587
		
Line 568... Line 588...
568
		// Envoie sur la sortie standard le contenu de la réponse HTTP
588
		// Envoie sur la sortie standard le contenu de la réponse HTTP
569
		print $retour;
589
		print $retour;
Line 636... Line 656...
636
			header("Content-Type: text/plain; charset=utf-8");
656
			header("Content-Type: text/plain; charset=utf-8");
637
			return implode("\n", self::$messages);
657
			return implode("\n", self::$messages);
638
		}
658
		}
639
	}
659
	}
640
}
660
}
641
?>
-
 
642
661
?>
-
 
662