Les scripts CGI

par Thierry Boudet 101355.2112@compuserve.com


Qu'est-ce que c'est ?

CGI est l'acronyme de Common Gateway Interface, terme que j'ai beaucoup de mal à traduire. Interface Commune de Chemin de Porte, c'est du mot-à-mot. Vraimentpas terrible. Disons plutôt qu'il s'agit d'une interface de communication dont les spécifications sont publiques. C'est la partie d'un serveur Ouebe qui va communiquer avec des programmes extérieurs dont l'exécution et les entrées/sorties sont contrôlées par le serveur.

La technique CGI permet de construire des pages Web dynamiques. C'est-à-dire que le contenu de la page (dans la plupart des cas, c'est du HTML ou du texte) est construit ``à la volée'' au moment ou le butineur envoie la requête.

Quand vous demandez une page a un serveur, vous utilisez un(e) URL pour identifier cette page. En fonction de la configuration du serveur et des caractéristiques du nom du fichier réclamé (répertoire et/ou extension), le serveur va savoir qu'il ne doit pas renvoyer un fichier stocké, mais plutôt exécuter le programme contenu dans le fichier, en lui passant des paramètres divers, et surtout en utilisant la sortie standard (STDOUT) de ce programme pour renvoyer la réponse au butineur.

Un exemple, vite.

Comme exemple, j'ai choisi de vous montrer comment faire un mini-moteur de recherche. Le logiciel serveur que j'utilise est NCSA HTTPD 1.4 et la machine tourne sous UnixWare. Désolé, c'est pas du Linux, il y a des choses trop difficiles à faire passer dans une boite de gestion. Mais j'essaye !!!

Ce système ne va pas explorer le ouebe pour construire sa base de données. C'est plutôt vous, utilisateur, qui allez la fabriquer manuellement, avec le processeur que vous avez entre les oreilles et un éditeur de texte (vi). Vous allez donc faire un fichier texte contenant, sur chaque ligne, deux champs sépares par un ou plusieurs espaces. Le premier champ est un mot-clé, et le second l'adresse d'une page. Supposons que ce fichier contienne:

        linux  http://www.linux.org/
        Bsd  http://www.freebsd.org/
        220  http://www.edf.fr/

Et tout ce que va faire notre programme, c'est parcourir séquenciellement ce fichier, et comparer le mot recherche au premier mot de la ligne. Si la comparaison est positive, il va le manifester dans la page construite à la volée. Si vous avez cherche Bsd, le HTML renvoyé sera en gros ceci:

 ...<a href="http://www.freebsd.org/">Bsd</a>...

Et vous n'aurez plus qu'a cliqueter pour vous trouver propulse a Berkeley !

Image CGI

Pour saisir le mot à rechercher, je vais utiliser une possibilité peu connue du HTML, pourtant présente depuis sa naissance. C'est le 'tag' <ISINDEX> qui demande au butineur d'ouvrir un champ de saisie texte au sein de la page. Vous pouvez alors taper un texte puis valider par le moyen approprié. Le texte sera lors renvoyé par votre butineur au serveur, puis au programme CGI.

Contrairement aux formulaires de saisie classiques, il n'y a pas de 'tag' <FORM ... ACTION="foobar.pl"> qui indique explicitement l'adresse du script à exécuter. C'est le script lui même qui va générer sa propre page d'appel. C'est donc l'adresse du script qu'il faudra donner au browser pour lancer le programme, par exemple: http://foobar.fr/cgi-bin/quux.pl.

Pour avoir une idée de ce dont il s'agit, copiez ceci dans un fichier texte et chargez-le en local dans votre butineur favori:

        <html>
           <body>
           Hello, World <ISINDEX>
           </body>
        </html>

Voila, vous voyez de quoi je parle ? Maintenant, comment le mot tape dans le champ de saisie est-il envoyé vers le serveur ? Il va être concaténé à le fin de l'adresse de la page courante et utilisé comme un morceau de la requête. Ce qui nous donne: http://foobar.fr/cgi-bin/quux.pl?Bsd.

Le serveur va ensuite décoder cette requête, lancer l'exécution du programme ' quux.pl' en lui transmettant le paramètre 'Bsd'. Si mes explications sont assez claires (;-), vous avez pu vous rendre compte qu'il y a déjà eu deux exécutions du programme. La première a affiché le champ de saisie et la seconde a, théoriquement, affiché le résultat. Si vous avez déjà quelques notions sur les CGI, je connais la question que vous allez poser : ``méthode GET ou méthode POST ?'' et la réponse est ``aucune des deux !'' la partie de l'url après le '?' est transmise au programme exécuté comme un argument ligne-de-commande classique (argv[1] pour C ou $1 pour le shell)

Le programme lui-même

J'ai utilise le langage Perl. Soyez indulgent, je suis très débutant en Perl. Mais vous pouvez prendre un autre langage si vous voulez. J'ai également essaye de faire le plus petit possible, pour me concentrer sur l'essentiel.

#!/perl5/bin/perl

#----------------------------------------
#--- fichier des mot-clef/URL
$fichier = "mot-clef.url"; 

&entete;
if ( @ARGV == 0 )
        {
        &explique;
        &termine;
        exit 0;
        }

foreach $mot (@ARGV)
        {
        &recherche ($mot);
        }

# et hop, permettre une autre saisie
print "<ISINDEX>";

&termine;
exit;

#----------------------------------------
sub recherche
{

#les comparaisons se feront en 
#majuscules, donc on va convertir le
#mot que l'on cherche 
#variable globale: $mot

$r_mot = $mot;   $r_mot =~ tr/a-z/A-Z/;

print "<hr>";

open (FILE, "<" . $fichier)
or erreur_grave("erreur sur\
fichier (open) " . $fichier);

$compte = 0;
while (<FILE>)
{
 chop $_;
 ($f_mot, $f_url) = split(/ +/, $_);

 # de meme le mot cle lu dans le fichier
 # passe aussi en majuscules

 $f_mot =~ tr/a-z/A-Z/;
 if ( $r_mot eq $f_mot )
  {
  if ( $compte == 0 )
   {
   print "<h3>recherche de $mot</h3>";
   # commencer une liste
   print "<OL>\n";
   }
   # generation du lien
  print "<li> <b>
  <a href=".$f_url.">$f_url</a></b>\n";
  $compte++;
   }
        }
close (FILE);

if ($compte == 0)
        {
print "<h4>Je n'ai rien trouve 
       a propos de [$mot]</h4>\n";
        }
else    {
        #  termine la liste
        print "</OL>\n";
        }
}
#--------------------------------------------
#
#       GENERATION DU DEBUT DE LA PAGE OUEBE
#
sub entete
{
print "Content-type: text/html\n";
print "\n";              # une ligne vide ...

print <<EOT;
<html><head>
<title>Recherche par mot-clef</title>
</head> <body>
EOT
}
#--------------------------------------------
#
#       GENERATION DE LA FIN DE LA PAGE OUEBE
#
sub termine
{
print <<EOT;
<hr>

</body> </html>
EOT
}
#--------------------------------------------
#
#  PARTIE DE PAGE CONFECTIONNE QUAND IL N'Y A
#  PAS D'ARGUMENTS. ON MET LE TAG <ISINDEX>
#  POUR OBTENIR LE CHAMP DE SAISIE
#
sub explique
{
print <<EOT;
<h1 align="center">
Systeme de recherche par mot-clef</h1>
Entrez un (ou plusieurs) <b>mot-clef</b> dans
le champ de saisie du browser,
puis <b>validez</b> pour lancer la recherche.
<b><i>
N'utilisez PAS de caracteres accentues !
</i></b></p>
<ISINDEX>
<hr>
EOT
}
#---------------------------------------------
#
#       GROSSE GAUFFRE
#
sub erreur_grave
{

print "<h3>ERREUR FATALE</h3>\n";
print "<h3>Raison: @_ </h3></hr>\n";
print "</body></html>\n";
exit;
}
#----------------------------------------------

Bibliographie

Bien entendu, pour les habitants de la région, je vous conseille la librairie du Capitole, dans la rue des Lois. http://www.mipnet.fr/libcap.