<?php
// On définit la clef d'authentification qui doit être identique à celle
// présente sur le serveur Web.
define('REQUEST_AUTHENTICATE', '657c080af2561edfea164e9f0c6af7bde673a3a310d78');
// Préfixe et suffixe pour le script contenant la fonction
define('REMOTE_SCRIPT_PREFIX', 'remote_');
define('REMOTE_SCRIPT_SUFFIX', '.php');

// on définit le tableau qui sera linéarisé à la fin du script
$result = array();
if (empty($_SERVER['HTTP_X_AUTH']) or $_SERVER['HTTP_X_AUTH'] != REQUEST_AUTHENTICATE) {
   // Pas de clef authentification ou clef incorrecte.
   $result['exception'] = 'L\'authentification a échoué';
} else {
   if (empty($_SERVER['HTTP_X_SERVICE_NAME'])) {
      // S'il n'y a pas de nom de fonction, on lève une erreur
      $result['exception'] = 'Nom de la fonction absente';
   } else {
      // Le nom de la fonction ne doit contenir que des lettres, chiffres, "_"
      // et ":". La chaîne "::" servant à séparer le nom du script de la
      // fonction
      $functionName = preg_replace('`[^\w:]`', '', $_SERVER['HTTP_X_SERVICE_NAME']);
      // on sépare le nom du script, du nom de la fonction
      list($script, $functionName) = explode('::', $functionName);
      // S'il n'y a pas de nom de fonction, par défaut, le nom du script porte
      // le nom de la fonction.
      if (empty($functionName)) $functionName = $script;
      // Le script est préfixé de "remote" et porte l'extention ".php"
      $scriptName = REMOTE_SCRIPT_PREFIX . $script . REMOTE_SCRIPT_SUFFIX;

      if (file_exists($scriptName)) {
         // Si le script existe, on le "charge"
         require $scriptName;

         if (function_exists($functionName)) {
            // Si la fonction existe, on prépare l'appel.
            // Si "args" n'existe pas, on considère qu'il n'y a pas d'arguments
            // Sinon, on la délinéarise
            if (empty($_POST['args'])) $args = array();
            else $args = unserialize($_POST['args']);
            // On attrape des exceptions levées dans la fonction
            try {
               // On appelle la fonction et on place le résultat dans la
               // variable de résultat
               $result['return'] = call_user_func_array($functionName, $args);
            } catch(Exception $e) {
               // En cas d'exception, on remonte le message dans le résultat.
               $result['exception'] = $e->getMessage();
            }
         } else {
            // La fonction n'existe pas dans le script appelé
            $result['exception'] = 'Fonction ' . $functionName . ' inexistante';
         }
      } else {
         // Le script n'existe pas.
         $result['exception'] = 'Script ' . $scriptName . ' introuvable';
      }
   }
}
// On linéarise le résultat pour l'envoyer à l'appelant.
echo serialize($result);

?>