Le CGI en Perl
1. Principe Général
Entre Unix et Windows, le problème est différent, ce qu'il est important de savoir est que les scripts
CGI sont interprétés par le serveur. Cela signifie que l'utilisateur voit s'afficher uniquement la
partie correspondant à une sortie d'écran ou à une erreur. Il est donc nécessaire, pour les serveurs
tournant sous un Unix, que les scripts CGI (Perl ou non) soit avec les droits d'execution (+x).
Un script CGI en Perl est un petit programme perl qui sera lancé depuis un navigateur web. Il est
important de noter que la majorité des scripts peut être malgré tout lancée en ligne de commande,
ce qui permet parfois de mieux débugger les problèmes.
Voici un exemple de fichier perl fonctionnant dans un script appelé par un navigateur sur un serveur
Unix :
#!/usr/bin/perl
print "content-type: text/html\n\n";
print "<html><head><title>exemple en perl</title></head>\n";
print "<body>\n";
print "les cgi s'exécutent bien sur votre serveur !\n";
print "</body></html>\n";
Dans ce programme, on retrouve 3 partie :
- #!/usr/bin/perl : permet de définir le chemin d'accès vers le programme d'éxecution.
Nécessaire sous Unix pour la bonne execution du programme.
- print "content-type: text/html\n\n"; : Ligne
permettant au serveur et au browser d'interpréter correctement le reste du text. Cette ligne est
essentielle. Si vous ne l'avez pas, vous obtiendrez une erreur 500.
- print "<body>\n"; : les 4 dernières lignes qui ne
sont que de l'affichage HTML.
Mais évidemment, l'intérêt du script est en général de traiter des informations, que ce soit des formulaires
saisis par l'utilisateur, ou autre... Donc, fréquemment, vous aurez besoin du package "CGI.pm" qui apporte
de nombreuses fonctionnalités, comme on va le voir maintenant dans les exemples suivants.
2. Traitement de Formulaire
2. 1. Code du formulaire HTML
Voici le code du formulaire HTML utilisé dans les exemples suivants.
<html>
<head>
<title>formulaire hobbesworld pour traitement perl</title>
</head>
<body>
<form action="/cgi-bin/formperl.pl" method="get">
entrer votre nom : <input name="nom" size=25><br>
entrer votre prenom : <input name="prenom" size=25><br>
entrer votre mois de naissance : <select name="moisnaissance">
<option>janvier
<option>fevrier
<option>mars
<option>avril
<option>mai
<option>juin
<option>juillet
<option>aout
<option>septembre
<option>octobre
<option>novembre
<option>decembre
</select><br>
quel est votre sexe (et pas entrer votre sexe, attention...) :
<input type=radio name="sexe" value="homme">homme
<input type=radio name="sexe" value="femme">femme
<input type=radio name="sexe" value="autre">autre<br>
<input type=checkbox name="majeur"> je suis majeur<br>
<textarea name="commentaire">[commentaire]</textarea><br>
<input type=submit value="valider">
<input type=reset value="reinitialiser">
</form>
</body>
</html>
2. 2. Sans le module CGI.pm
2.2.1. Code de traitement
Le code de traitement associé est :
#!/usr/bin/perl
print "content-type: text/html\n\n";
%httpform = &read_query_string;
print "nom : ".$httpform{'nom'}."<br>\n";
print "prenom : ".$httpform{'prenom'}."<br>\n";
print "mois : ".$httpform{'moisnaissance'}."<br>\n";
print "sexe : ".$httpform{'sexe'}."<br>\n";
if ($httpform{'majeur'} =~ /on/) {
print "je suis majeur<br>\n";
}
else {
print "je ne suis pas majeur<br>\n";
}
print "mes commentaires : <ul><pre>".$httpform{'commentaire'}."</pre></ul>\n";
print "contenu html\n";
sub read_query_string
{
local ($buffer, @pairs, $pair, $name, $value, %form);
$buffer = $env{'query_string'};
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("c", hex($1))/eg;
$form{$name} = $value;
}
%form;
}
}
Pour l'instant, ce code ne fonctionne qu'avec la méthode 'GET'. Pour la méthode 'POST', je verrais ensuite.
2.2.2. Explication du code
Il y a 3 parties importantes dans ce programme :
- L'initialisation du programme : définition du "content-type" et récupérationd des variables
- L'utilisation des variables dans le code HTML : les $httpform{'nomChamps'}
- La fonction "read_query_string" : fonction qui interprète les informations renvoyées par le formulaire
Comme nous l'avons vu précédemment, la ligne "
print "content-type: text/html\n\n";" est primordiale pour le bon
fonctionnement du script. Ensuite, grâce à l'appel de la fonction "read_query_string", on recopie le contenu de chaque champs du
formulaire dans l'objet "httpform" (vous pouvez mettre n'importe quel nom).
Pour utiliser le résultat d'une variable, il vous suffit alors de mettre le nom du champs entre guillemets :
"$httpform{'prenom'}" renvoit le contenu du champs "prenom".
Comme vous pouvez le voir pour le champs "majeur" (correspondant à la case à cocher), on peut également faire des opérations sur
le résultat comme sur toutes chaines de caractères.
Enfin, la fonction "read_query_string". Par définition, elle ne fonctionne qu'avec le GET puisqu'elle interprète la variable
d'environnement QUERY_STRING (dans laquelle sont renvoyés tous les champs du formulaire). En voici le principe :
- Récupération de la variable d'environnement 'query_string' en utilisant le tableau "$env"
- Découpage de cette ligne en un tableau (@pairs) en fonction du caractère "&" (séparation des champs dans une requête GET)
- Découpage de chaque cellule du tableau "@pairs" en 2 parties séparée par un "=" (format : "nomduchamps=valeur)
- Remplacement tous les "+" par des espaces
- Remplacement des valeurs HEXA par leur valeur alphanumérique
- Construction du tableau indexé sur le nom du champs
2. 3. Avec le module CGI.pm
2.3.1. Code de traitement
#!/usr/bin/perl
use CGI;
$query = new CGI;
print "content-type: text/html\n\n";
print "nom : ".$query->param(nom)."<br>\n";
print "prenom : ".$query->param(prenom)."<br>\n";
print "mois : ".$query->param(moisnaissance)."<br>\n";
print "sexe : ".$query->param(sexe)."<br>\n";
if ($query->param(majeur) =~ /on/) {
print "je suis majeur<br>\n";
}
else {
print "je ne suis pas majeur<br>\n";
}
print "mes commentaires : <ul><pre>".$query->param(commentaire)."</pre></ul>\n";
print "contenu html\n";
Ce code fonctionne aussi bien avec le 'GET' que le 'POST' (défini dans le formulaire).
2.3.2. Explication du code
Il y a 2 parties dans ce programme :
- L'initialisation du programme : définition du "content-type" et récupérationd des variables
- L'utilisation des variables dans le code HTML : les $httpform{'nomChamps'}
Comme nous l'avons vu précédemment, la ligne "
print "content-type: text/html\n\n";" est primordiale pour le bon
fonctionnement du script. Ensuite, en initialisant la variable "$query" (new CGI), on récupère automatiquement les champs du formulaire.
Pour utiliser le résultat d'une variable, il vous suffit alors de respecter le format :
$query->param(nom_du_champs)
Les opérations sont possibles sur ces champs comme avec l'autre méthode.
3. Traitement de Cookie avec le module CGI.pm
3. 1. Ecriture des cookies
Avec un seul cookie :
#!/usr/bin/perl
use CGI qw(:standard :html3);
$the_cookie = cookie(-name=>'nom',
-value=>'hobbesworld');
print header(-cookie=>$the_cookie);
print "content-type: text/html\n\n";
print "votre cookie 'nom' est : créé";
Avec plusieurs cookies :
#!/usr/bin/perl
use CGI qw(:standard :html3);
$the_cookie = cookie((-name=>'nom',
-value=>'hobbesworld',
-path=>'/',
-domain=>'.hobbesworld.com',
-expires=>'+1d'),
(-name=>'prenom',
-value=>'laurent',
-path=>'/',
-domain=>'.hobbesworld.com'));
print header(-cookie=>$the_cookie);
print "content-type: text/html\n\n";
print "votre cookie 'nom' est : créé";
L'écriture d'un cookie se fait donc en 2 parties :
- Définition du coookie avec l'affectation 'cookie' : $the_cookie = cookie(-name=>'nom', -value=>'hobbesworld', -expires=>'+0d');
- L'ajout du cookie avec l'ajout dans le header : print header(-cookie=>$the_cookie);
L'object 'cookie' contient 3 paramètres :
- name : le nom du cookie
- value : sa valeur
- expires : durée de vie (+60s - 60 secondes, +60m - 60 minutes, +2h - 2 heures, +1M - 1 mois, +2y - 2 ans, now - maintenant)
Ensuite, le "print header" permet d'ajouter le cookie dans le header de la page. Il est a note que dans ce
cas, au moment du chargement de la page, le cookie est ajouté et donc pas encore accessible, il ne le
sera qu'au prochain chargement de page. Par conséquent, pour pouvoir utiliser un cookie que vous venez de
fixer, vous devez définir la variable associée qui vous intéresse, comme dans l'exemple complet en bas de page.
3. 2. Lecture des cookies
#!/usr/bin/perl
use CGI qw(:standard :html3);
print "content-type: text/html\n\n";
$nom = cookie('nom');
print "cookie : <br>votre cookie 'nom' est : $nom";
Comme nous l'avons vu précédemment (en fait, 10 lignes au dessus), vous ne pouvez pas directement lire un cookie
que vous venez de fixer. Pour ceci, voir l'exemple complet en bas de page.
3. 3. Effacer des cookies
#!/usr/bin/perl
use CGI qw(:standard :html3);
$the_cookie = cookie(-name=>'nom',
-value=>'hobbesworld',
-path=>'/',
-domain=>'.hobbesworld.com',
-expires=>'now');
print header(-cookie=>$the_cookie);
print "content-type: text/html\n\n";
print "cookie : <br>votre cookie 'nom' est : effacé";
Effacer un cookie consiste en fait à l'ajouter, mais avec une duree de vie nulle. Ainsi, il se re-crée et s'efface immédiatement.
D'où le "now" du "expires".
3. 4. Exemples complets
3.4.1. Fixer un cookie et l'utiliser directement
#!/usr/bin/perl
use CGI qw(:standard :html3);
$the_cookie = cookie(-name=>'nom',
-value=>'hobbesworld',
-path=>'/',
-domain=>'.hobbesworld.com',
-expires=>'+2d');
print header(-cookie=>$the_cookie);
print "content-type: text/html\n\n";
$nom = cookie('nom');
print "cookie : <br>votre cookie 'nom' est : $nom";
A_venir...
3.4.2. Tester l'existence d'un cookie puis redirection
A_venir...
Page modifiée le : 02/10/2024