| 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 |
|