Les CGI

Créer et utiliser les CGI en shell UNIX

Les CGI permettent l'interfaçage entre le web et le serveur. Cela permet de tariter des formulaires, générer des pages dynamiquement, ajouter de l'intelligence. Les CGI peuvent être fait avec n'importe quel langage : PHP, perl... et le shell, bien entendu.

Mon choix personnel s'est porté sur le shell car je connais bien ce langage et je ne me voyais pas ajouter un langage supplémentaire sur mon serveur. Etant très mobile, cela me permet de créer mes CGI n'importe où, à partir du moment où je dispose d'un UNIX.

D'autre part, cela permet de transposer aisément des shells réalisés en local vers une utilisation délocalisée sans avoir à transcrire dans un autre langage.

Pré-requis

Pour réaliser des CGI en shell, il ne faut rien d'autre qu'un UNIX ou équivalent (Linux/MacOS X) et un serveur http. J'évite le plus possible les programmes exotiques, j'ai donc opté pour Apache.

Mise en place

Les CGI ne sont rien d'autre que des programmes placés dans un répertoire spécial (par défaut sous Apache le répertoire cgi-bin) dont la fonction est de rediriger automatiquement tout affichage non pas sur la sortie standard du serveur mais sur le navigateur distant.

Une fois que le serveur http est installé, il ne reste plus qu'à développer le site. Pour les CGI je conseille de commencer par le formulaire (ou la requête) à traiter car les informations sont envoyées dans un ordre et un format spécial et développer les CGI en premier nécessiterait des modifications par la suite. Autant ne pas perdre trop de temps.

Le formulaire

Je prends ici l'exemple d'un formulaire. Mais un CGI peut être appelé sans utiliser de formulaire, en cliquant directement sur un lien.

D'autre part, en ce qui concerne les affichages des CGI j'ai opté directement pour le XML. Cela me permet ainsi de ne me concentrer que sur les données, l'affichage et la mise en page n'étant traités que par l'intermédiaire de XSLT et CSS, à la charge du navigateur. Le code à générer est plus condensé et plus souple dans son utilisation. Mais ce choix est personnel. Les CGI retournent toute forme d'affichage. C'est au développeur de choisir son format.

Le script shell pour CGI

Tout d'abord, lorsqu'on envoie une requête HTTP à un CGI, il y a deux méthodes. La méthode GET et la méthode POST. Ces deux méthodes sont diffusées de deux manières différentes et donc doivent être récupérées de deux manières différents. Mais, vous verrez bien vite qu'il est aisé de traiter l'une et l'autre.

Les scripts que nous utiliseront seront compatibles avec ces deux méthodes pour plus de commodité. Mais il peut arriver que l'on veuille forcer l'utilisation d'une méthode et en bannir une autre.

La méthode GET

La méthode GET est celle qui est utilisée par défaut lorsqu'on utilise un lien. C'est aussi la méthode par défaut utilisée lorsqu'on exécute le script en local, en ligne de commande (comme n'importe script UNIX). Cette méthode utilise une variable QUERY_STRING qui stocke la requête dans une chaîne de caractère ayant un format spécial. Pour utiliser cette méthode dans un shell, il suffira donc tout simplement d'utiliser la variable ${QUERY_STRING} et de décoder son contenu.

La méthode POST

La méthode POST envoie directement les données au serveur sur l'entrée standard, sans passer par une variable. cependant, le codage de la chaîne est identique à celui de la méthode GET, ce qui signifie que le décodage sera identique dans les deux cas.

Pour récupérer la chaîne de la méthode POST, il suffira simplement de faire une lecture de l'entrée standard grâce à la commande read et de la rediriger dans une variable que nous nommerons QUERY_STRING pour des raisons de commodité et de compatibilité avec la méthode GET.

Exemples

Lorsqu'on développe un script CGI, comme pour tout autre programme, il peut être utile d'avoir des outils d'aide au développement. Le script suivant est un script générique qui permet de récupérer ce qui lui est envoyé et de l'afficher dans une page web afin d'indiquer exactement ce qui s'est passé. Il suffit simplement de le placer dans le répertoire cgi-bin (sans oublier de le rendre exécutable) et de l'appeler soit par l'intermédiaire d'un lien soit par un formulaire, en fonction de ce qu'on veut faire.

Premier exemple

Cet exemple récupère simplement la chaîne envoyée par le formulaire. Il faudra le placer dans le répertoire des cgi d'apache (cgi-bin) puis appeler ce shell depuis une page web grâce à la balise form.

Exemple

<form method="POST" action="http://{votre domaine ou adresse ip}/cgi-bin/TestForm.sh">

Testons

Votre pseudo :

Votre message :


Version plus élaborée

Dans la version de base, vous noterez que la chaîne renvoyée peut avoir un format étrange. En effet, tous les caractères accentués et spéciaux sont remplacées par un %{code du caractère}. Il convient alors de placer dans le shell un filtre qui permettra de convertir les codes en caractères "humains".

Dans l'exemple, le filtre est appliqué grâce à sed qui contient toutes les transformations à effectuer.

Attention

Dans le cas inverse, c'est à dire la génération d'un lien dans une page html, il conviendra d'appliquer le filtre inverse pour obtenir un affichage conforme. dans le cas contraire, les caractères accentués ou spéciaux peuvent générer une erreur 404 (page non trouvée).

Testons

Votre pseudo :

Votre message :


Améliorons encore !

vous remarquerez que si nous avons résolu le problème des caractères accetués, nous avons en revanche tout récupéré sur une seule ligne, de la forme champ=valeur et comme séparateur &. Il convient donc d'améliorer le script de façon à présenter les choses de façon plus utilisable.

Testons

Votre pseudo :

Votre message :


Dans cet exemple, nous avons ajouté le traitement des retours à la ligne. Chaque ligne est composée du nom de la variable et de sa valeur, séparés par un signe '='. Rien de plus simple ensuite de de récupérer chaque valeur dans une variable à l'aide de cut -d"=" -f2.

Pour poursuivre

Une fois que vous avez testé avec succès votre formulaire, la réception et le traitement des informations, il ne vous reste plus qu'à tout mettre en page, en générant du HTML, c'est à dire en ajoutant à l'affichage des balises HTML, du XML ou tout ce qui vous plaira. Rien ne vous empêche non plus d'exécuter des requêtes SQL et de manipuler les données d'une base (MySQL, PostGreSQL, etc.).

Testons

Votre pseudo :

Votre message :