Les CGI en Perl. - Département Informatique et Interactions

Transcription

Les CGI en Perl. - Département Informatique et Interactions
C. Aperghis-Tramoni
Les CGI en Perl.
En Perl, les choses sont un peu différentes.
Le cgi Perl ne peut être qu'un programme qui génère des sorties.
Département d’Informatique
1
Université de la Méditerrannée
C. Aperghis-Tramoni
Une fois de plus.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print '<HTML>';
print '<HEAD>';
print '<TITLE> Table </TITLE>';
print '</HEAD>';
print '<BODY bgcolor = "#CCCCCC">';
print '<TABLE BORDER="2" WIDTH=80%>';
print '<TH COLSPAN=8> Titre de la table. </TH>';
for($i=0;$i<4;$i++){
print '<TR>';
for($j=0;$j<=7;$j+=1){
print ('<TD ALIGN=CENTER> Bonjour. </TD>');
}
print ('</TR>');
}
print ('</TABLE>');
print '</BODY>';
print '</HTML>';
Département d’Informatique
2
Université de la Méditerrannée
C. Aperghis-Tramoni
Commençons par un exemple.
Considérons le programme suivant : Son exécution produit :
#!/usr/bin/perl
print <<fin;
<HTML>
<HEAD>
<TITLE>essai de script CGI</TITLE>
</HEAD>
<BODY>
Voici le texte de ma page
</BODY>
<HTML>
<HEAD>
<TITLE>essai de script CGI</TITLE>
</HEAD>
<BODY>
Voici le texte de ma page
</BODY>
</HTML>
C'est à dire un source html.
</HTML>
fin
Le service cgi est un moyen de retransmettre ce résultat à un client html afin
qu'il soit interprète et fournisse un résultat.
Département d’Informatique
3
Université de la Méditerrannée
C. Aperghis-Tramoni
Les en têtes.
Le serveur doit avoir des informations supplémentaires afin de savoir
quoi faire de la sortie standard des scripts CGI.
Cette information est fournie par l'en-tête MIME.
Elle se présente immédiatement après la ligne shebang.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<fin;
<HTML>
<HEAD>
<TITLE>essai de script CGI</TITLE>
</HEAD>
Ce programme est stocké dans
un répertoire cgi-bin, qui possède
les droits d'accès appropriés, sous
le nom "premier.cgi".
<BODY>
Voici le texte de ma page
</BODY>
</HTML>
fin
Département d’Informatique
4
Université de la Méditerrannée
C. Aperghis-Tramoni
Appel du programme.
On ouvre un navigateur et on se place dans la barre de navigation.
Dans un navigateur et on fait référence à l'url qui contient le
programme en question :
http://nom_du_serveur/~mon_login/premier.cgi
Département d’Informatique
5
Université de la Méditerrannée
C. Aperghis-Tramoni
Les variables d'environnement d'un CGI.
CONTENT_LENGTH :
CONTENT_TYPE :
GATEWAY_INTERFACE :
HTTP_ACCEPT :
HTTP_FROM :
HTTP_USER_AGENT :
PATH_INFO :
PATH_TRANSLATED :
HTTP_USER_AGENT :
QUERRY_STRING :
REMOTE_ADDR :
REMOTE_HOST :
REMOTE_IDENT :
REMOTE_USER :
REQUEST_METHOD :
SCRIPT_NAME :
SERVER_NAME :
SERVER_PORT :
SERVER_PROTOCOL :
SERVER_SOFTWARE :
Département d’Informatique
Taille des données en entrée.
Type MIME des entrée ("text/html").
Version CGI mise en œuvre par le serveur.
Liste des types MIME reconnus par le client.
Adresse électronique de l'utilisateur.
Navigateur utilisé par le client.
Spécification d'un chemin d'accès.
Version décodée du contenu de PATH_INFO.
Navigateur utilisé par le client.
Contenu de la requête.
Adresse IP de l'utilisateur.
Nom de la machine de l'utilisateur.
Identification de lutilisateur.
Nom authentifié de l'utilisateur.
Méthode employée par l'utilisateur.
Chemin virtuel du script.
Nom ou adresse IP du serveur.
Numéro de port du client.
Nom et version du protocole.
Nom et version du serveur.
6
Université de la Méditerrannée
C. Aperghis-Tramoni
Formulaire.
Les CGI sont très utilisé pour transmettre des informations d'un client WWW
vers un service particulier, via un serveur HTTP.
Synoptique des échanges client, serveur et script CGI par un formulaire.
Le client WWW affiche un formulaire.
L'utilisateur complète les champs et valide le contenu qui est transmis.
L'information est transmise, méthode GET ou POST.
Le serveur HTTP qui réceptionne la requête initialise le CGI référencé
par le formulaire WWW ;
Le CGI effectue le traitement demandé et retransmet le résultat vers
le client WWW.
Département d’Informatique
7
Université de la Méditerrannée
C. Aperghis-Tramoni
Référence à un cgi.
Par l'intermédiaire d'un formulaire <FORM>
Les informations sont envoyées au le serveur à une adresse spécifiée
par son url.
Cette adresse est spécifiée par l'attribut action.
Le résultat généré par le serveur se présente dans la page courante
ou dans la fenêtre du navigateur spécifiée par l'attribut target.
La syntaxe est :
<FORM action="url" method="get" enctype="encodage" name="nom" target="cible">
<FORM action="url" method="post" enctype="encodage" name="nom" target="cible">
Département d’Informatique
8
Université de la Méditerrannée
C. Aperghis-Tramoni
Les méthodes.
Méthode GET :
L'information est transmise dans l'URL d'appel du
script CGI qui les récupère via la variable QUERY_STRING.
Méthode POST (fortement conseillée):
Les champs sont transmis dans un corps de document dont le
CONTENT_TYPE est "application/x-www-form-urlencoded".
Ils sont passés au script CGI via son entrée standard.
Ce type implique que les champs du formulaire sont séparés par le
caractère &, qu'ils sont précédés de leur nom, l'attribut NAME de
la balise HTML $<$FORM$>$ et du signe =.
Les caractères accentués et les espaces sont encodés comme spécifié
dans RFC1738.
Département d’Informatique
9
Université de la Méditerrannée
C. Aperghis-Tramoni
Notre toute première cgi.
#!/usr/locałbin/perl
# hello.cgi - My first CGI program
Ne pas oublier les
deux retours chariot.
print “Content-Type: text/html\n\n”;
print “<html> <head>\n”;
print “<title>C.G.I. qui dit bonjour!</title>”;
print “</head>\n”;
print “<body>\n”;
print “<h1>Salut christian... Comment tu vas ?</h1>\n”;
print “</body> </html>\n”;
Département d’Informatique
10
Université de la Méditerrannée
C. Aperghis-Tramoni
Explication.
Le programme perl #!/usr/locałbin/perl
# hello.cgi - My first CGI program
print “Content-Type: text/html\n\n”;
Content-Type décrit le
type d’information MIME.
print “<html> <head>\n”;
print “<title>C.G.I. qui dit bonjour!</title>”;
print “</head>\n”;
print “<body>\n”;
print “<h1>Salut christian... Comment tu vas ?</h1>\n”;
print “</body> </html>\n”;
A généré la sortie
Content-Type: text/html
suivante sur <stdout>
<html> <head>
<title>C.G.I. qui dit bonjour!</title></head>
<body>
<h1>Salut Christian... Comment tu vas ?</h1>
</body> </html>
Département d’Informatique
11
Université de la Méditerrannée
C. Aperghis-Tramoni
Type de programmation.
Il existe deux manières de programmer un CGI.
La programmation orienté objet la plus complète.
La programmation orienté fonction lorsqu'on n'a pas besoin des possibilités objet.
En programmation orientée objet, il est nécessaire de créer un ou plusieurs objets CGI.
Les méthodes qui leur sont associées seront alors utilisées pour créer les différents
éléments de la page.
Chaque objet CGI commence avec la liste des paramètres nommés tels qu'ils ont été
passés au programme CGI par le serveur.
En programmation orienté fonction, on utilise un objet CGI par défaut avec lequel
on interagit que très rarement.
On se contente d'appeler les fonctions pour toutes les opérations nécessaires :
Récupérer les paramètres du CGI.
Créer les balises HTML.
Gérer les cookies.
L'interface de programmation est propre mais limitée à un seul objet CGI à la fois
Département d’Informatique
12
Université de la Méditerrannée
C. Aperghis-Tramoni
Orientation objet.
# chargement du module CGI
use CGI;
# creation d'un nouvel objet CGI
$q = new CGI;
# creation de l'en-tete HTTP
print $q->header,
$q->start_html('Orientation Objet.'),
$q->h1('Bonjour tout le monde.'),
$q->end_html;
Département d’Informatique
13
Université de la Méditerrannée
C. Aperghis-Tramoni
Orientation fonction
# chargement des fonctions standard de CGI
use CGI qw/:standard/;
# creation de l'en-tete HTTP
print header,
start_html('Orientation fonction.'),
h1('Bonjour tout le monde.'),
end_html;
Département d’Informatique
14
Université de la Méditerrannée
C. Aperghis-Tramoni
Par exemple.
# Creation d'un formulaire et renvoie des valeurs.
use CGI qw/:standard/;
print header,
start_html('Un exemple simple'),
h1('Un exemple simple'),
start_form,
"Votre nom ? ",textfield('nom'),p,
"Vos gouts ?", p,
checkbox_group(-name=>'gouts',
-values=>['Television','Cinema','Lecture','Eclectiques'],
-defaults=>['Eclectiques']), p,
"Votre statut ? ",
popup_menu(-name=>'statut',
-values=>['Celibataire','Marie','Separe','Divorce']),p,
submit,
end_form,
hr;
if (param()) {
print "Vous vous appelez ",em(param('nom')),p,
"Vos gouts sont : ",em(join(", ",param('gouts'))),p,
"Vous etes ",em(param('statut')),
hr;
}
Département d’Informatique
15
Université de la Méditerrannée
C. Aperghis-Tramoni
Résultat.
Département d’Informatique
16
Université de la Méditerrannée
C. Aperghis-Tramoni
Autre exemple.
#!/usr/bin/perl
use CGI qw/:standard/;
my $page = new CGI;
print header;
print $page->start_html(-bgcolor=>"lightblue");
print
h2('Identite'),
start_form,
"Votre nom ..." ,textfield('nom'),p,
"Votre prenom ..." ,textfield('prenom'),p,
"Votre mail ..." ,textfield('mail'),p,
submit,
end_form;
print $page->hr;
print $page->end_html;
Et il est possible
de mélanger les
deux méthodes.
if (param()) {
print "Votre prenom est ",strong(param('nom')),p,
"Votre nom est ",em(join(", ",param('prenom'))),p,
"Votre adresse mail est ",param('mail'),
hr;
}
Département d’Informatique
17
Université de la Méditerrannée
C. Aperghis-Tramoni
Autre exemple.
Département d’Informatique
18
Université de la Méditerrannée
C. Aperghis-Tramoni
Le problème des erreurs.
De manière standard, les erreurs d'un cgi sont redirigées vers un fichier "error_log".
Nombre d'erreurs ne permettent pas de retrouver certaines informations indispensables.
Le script fautif.
La ligne en cause.
L'heure du problème.
Le type de l'erreur générée.
Toute mise au point devient alors particulièrement délicate.
Un module spécifique a été créé pour faciliter le travail, c'est "CGI::Carp".
Toute commande qui rajoute une ligne dans le fichier "error_log" sera prise en compte
par le module. Chaque ligne indiquera très précisément :
L'heure à laquelle s'est produit l'évènement.
L'origine de l'erreur.
Le fichier et ligne du fichier sur laquelle porte l'erreur.
L'erreur sera quand même écrite dans le fichier log.
Département d’Informatique
19
Université de la Méditerrannée
C. Aperghis-Tramoni
Utilisation de CGI::Carp.
Pour valider le module Carp, on rajoute la ligne suivante au début du cgi.
use CGI::Carp;
De plus, si la commande se présente sous la forme :
use CGI::Carp qw(fatalsToBrowser);
Les erreurs fatales apparaitront directement sur la page du navigateur mais
seront tout de même écrite dans le fichier error_log.
Département d’Informatique
20
Université de la Méditerrannée
C. Aperghis-Tramoni
Les types MIME.
MIME signifie : Multipurpose Internet Mail Extensions.
les types de base sont :
Type MIME
text/html
Description.
Hyper Text Markup Language (HTML).
text/plain
text/rtf
image/gif
Fichier texte ordinaire.
Texte en format Rich Text Format.
Image en format GIF.
image/jpeg
audiøbasic
audiøx-wav
Image en format JPEG.
Fichiers audio au format sun (*.au).
Fichiers audio au format Windows (*.wav).
videømpeg
videøquicktime
Vidéo compressé en format MPEG.
Vidéo en format Quick time.
Département d’Informatique
21
Université de la Méditerrannée
C. Aperghis-Tramoni
L'interface navigateur <-> CGI.
Le programme CGI reçoit un certain nombre d’informations.
En provenance du navigateur, du serveur et du programme lui même.
Du navigateur :
Son type.
Ce qu’il fait.
etc...
Du serveur : Son nom.
La version.
Le port sur lequel il s’exécute.
etc...
Du programme :
Son nom.
Son emplacement.
etc...
En provenance de l’utilisateur.
Soit par une variable d’environnement (méthode GET).
Soit par l’entrée standard <stdin> (méthode POST).
Département d’Informatique
22
Université de la Méditerrannée
C. Aperghis-Tramoni
Les variables d'environnement.
Variable
Signification.
REMOTE_ADR
L’adresse IP de la machine client.
REMOTE_HOST
Le nom de la machine client.
HTTP_ACCEPT
Liste des types MIME que le navigateur est capable d’interpréter.
HTTP_USER_AGENT
Information sur le navigateur (nom, numéro de version, système etc...).
REQUEST_METHOD
GET ou POST.
CONTENT_LENGTH
La taille de l’entrée si méthode POST, non utilisé si méthode GET.
QUERY_STRING
Information d’entrée pour la méthode GET.
PATH_INFO
Permet à l’usager de spécifier un chemin (http://nom/cgibin/prog/path).
PATH_TRANSLATED
Traduit le path relatif de PATH_INFO en path courant du système.
Département d’Informatique
23
Université de la Méditerrannée
C. Aperghis-Tramoni
Les variables d'environnement.
#!/usr/locałbin/perl
print “Content-type: text/html\n\n”;
print “<html> <head>\n”;
print “<title>Les variables d’environnement.</title>\n”; print “</head>\n”;
print “<body>\n”;
print “<h1>CGI Voici l’ensemble des variables d’environnement :</h1>\n”;
foreach $variable (keys(%ENV)) {
print “<B>$variable</B> = $ENV{$variable}<BR>\n”; }
print “</body> </html>\n”;
Département d’Informatique
24
Université de la Méditerrannée
C. Aperghis-Tramoni
Liste des variables d'environnement.
Département d’Informatique
25
Université de la Méditerrannée
C. Aperghis-Tramoni
Exemple de formulaire.
<html> <head>
<title>Etat civil.</title>
</head>
<body>
<form action=”/nometage.cgi” method=POST> Quel est votre nom : <input type=text name=”nom”><p> Quel est votre age : <input type=text name=”age”><p> <input type=submit>
</form>
</body> </html>
Département d’Informatique
26
Université de la Méditerrannée
C. Aperghis-Tramoni
Et le CGI qui va avec.
$info devient la référence à un hash
#!/usr/locałbin/perl
# nameage.cgi
$info ->start_htm(“Etat civil”)
va mettre la chaine Etat civil dans les balises ;
<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTMŁ/EN”>
<HTML><HEAD><TITLE>Etat civil</TITLE>
$info ->header contient la chaine :
Content-type: text/html \n\n
use CGI;
$info -> param(‘nom’) va permettre
d’accéder à la valeur d’indice “nom”
de la table de hash.
my $info = new CGI;
print $info->header, $info->start_html(“Etat civil”), “Bonjour : “, $info->param(‘nom’), “<BR>”, “Vous avez bien “, $info->param(‘age’), “ ans, n’est-ce pas ?<BR>”, $info->end_html;
$info -> end contient la chaine : </BODY></HTML>
Département d’Informatique
27
$info -> param(‘age’) va permettre d’accéder à la
valeur d’indice “age” de la table de hash.
Université de la Méditerrannée
C. Aperghis-Tramoni
Exécution.
Département d’Informatique
28
Université de la Méditerrannée
C. Aperghis-Tramoni
Résultat.
Département d’Informatique
29
Université de la Méditerrannée
C. Aperghis-Tramoni
Autre exemple.
Soit la page HTML suivante :
<HTML>
<!-- Page cr&eacute;e par C. Aperghis-Tramoni --><HEAD>
<TITLE> test de CGI </TITLE>
</HEAD>
<BODY BACKGROUND=”ppats/backblue.jpg” BGCOLOR=”#FFFFFF”
TEXT=”#000000” LINK=”#0000DD” ALINK=”#00DD00” VLINK=”#DD0000”>
<DIV ><H1>Appel de CGI.<BR></H1></DIV>
<BR><HR>
<H3>
<BR>
Appel d’un CGI “date.cgi” dont l’URL est :
<BR>
http://maccat.lim.univ-mrs.fr/date.cgi
<BR>
<BR>
<A HREF=”http://maccat.lim.univ-mrs.fr/date.cgi”> C.G.I.</A>
</H3>
<BR><HR>
</BODY>
</HTML>
Département d’Informatique
30
Université de la Méditerrannée
C. Aperghis-Tramoni
Appel de CGI.
Le texte html précédent produit le résultat suivant :
Département d’Informatique
31
Université de la Méditerrannée
C. Aperghis-Tramoni
Contenu du programme "date.cgi".
#!/usr/locałbin/perl
# date.cgi
# Impression Header CGI.
print “Content-Type: text/html\n\n”;
@jours = (“Dimanche”,”Lundi”,”Mardi”,”Mercredi”,
“Jeudi”,”Vendredi”,”Samedi”),
@mois = (“Janvier”,”Février”,”Mars”,”Avril”,”Mai”,”Juin”,”Juillet”,
“Aout”,”Septembre”,”Octobre”,”Novembre”,”Décembre”),
($ss,$mm,$hh,$jj,$mo,$aa,$js,$ja,$st) = localtime(time);
$annee = $aa + 1900;
print “<html> <head>\n”;
print “<title>La date et l’heure.</title>\n”; print “</head>\n”;
print “<body BACKGROUND=\”ppats/nuages.jpg\”>\n”;
print “<h1>Nous sommes le <br>”;
print (“$jours[$js] $jj $mois[$mo] $annee<br>”);
print (“Il est $hh heures, $mm minutes, $ss secondes<br>”);
print (“Ce jour est le $ja &egrave;me de l’ann&eacute;e<br>”);
print (“Nous sommes en heure d’hiver.<br>”) if ($st =1);
print “</h1>”;
print “</body>\n</html>\n”;
Département d’Informatique
32
Université de la Méditerrannée
C. Aperghis-Tramoni
Résultat obtenu.
Département d’Informatique
33
Université de la Méditerrannée
C. Aperghis-Tramoni
Un formulaire client.
<HTML>
<HEAD>
<!-- Auteur : C.A.T. - Date = 19 Juin 2005 -->
<TITLE>A Form </TITLE>
</HEAD>
<BODY bgcolor="#80B080">
<P>
<H3 ALIGN=CENTER>Done for ERIICTA training.</H3>
<form action="http://naboo.lim.univ-mrs.fr/cgi-bin/chris/page.cgi" method=POST>
<P>
Your first name . . . . <INPUT TYPE=TEXT NAME=FIRST SIZE=40>
</P>
<P>
Your second name . .<INPUT TYPE=TEXT NAME=SECOND SIZE=40>
</P>
<P>
Your email . . . . . . . .<INPUT TYPE=TEXT NAME=MAIL SIZE=40>
</P>
<BR>
<CENTER>
<INPUT TYPE=SUBMIT VALUE="Envoyer">
<INPUT TYPE=RESET VALUE="Annuler">
</CENTER>
</FORM>
</BODY>
</HTML>
Département d’Informatique
34
Université de la Méditerrannée
C. Aperghis-Tramoni
Récupération de l'information..
L'information envoyée par le client sera récupérée sur le serveur par un CGI.
Récupération des valeurs par l'intermédiaire d'un hash.
#!/usr/bin/perl
use CGI;
my $info = new CGI;
#get info
$nom1 = $info->param('first');
$nom2=$info->param('second');
$mail=$info->param('mail');
Your first name . . . . <INPUT TYPE=TEXT NAME=FIRST SIZE=40>
Your second name . .<INPUT TYPE=TEXT NAME=SECOND SIZE=40>
Your email . . . . . . . .<INPUT TYPE=TEXT NAME=MAIL SIZE=40>
Département d’Informatique
35
Université de la Méditerrannée
C. Aperghis-Tramoni
Edition des résultats.
L'information est retournée au client en format html.
print
print
print
print
print
$info->header;
$info->start_html("Result.");
('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">');
('<HTML><HEAD><TITLE>Your results.</TITLE>');
('</HEAD><BODY bgcolor="#F5F5F5">');
print ("<H1><CENTER>This is the information you sent. :</CENTER></H1><BR>");
print
print
print
print
print
("<H3> Your first name is : $nom1.</H3>")
("<H3> Your second name is : $nom2.</H3>")
("<H3> Your email is : $mail.</H3>")
("<H2>Nice to meet you.</H2>")
$cgi->end_html;
print $cgi->end_html;
Département d’Informatique
36
Université de la Méditerrannée
C. Aperghis-Tramoni
Les effets pervers de la mémoire cache.
La majorité des navigateurs mémorisent les pages visitées dans un cache.
Cette technique permet d'en disposer aussi longtemps que nécessaire sans avoir besoin
de les recharger à chaque consultation.
Cette technique est profitable sauf dans certains cas bien précis.
Soit le cgi ci contre.
Département d’Informatique
#!/usr/bin/perl
use CGI;
my $cgi = new CGI;
chomp ($heure = `date`);
$script = $ENV{'SCRIPT_NAME'};
$rel = "<A HREF = \"$script \" > Relancer.";
print $cgi->header;
print $cgi->start_html("Effet surprenant du cache.");
print ('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">');
print ("</HEAD><BODY bgcolor='#F0F0FF'>");
print ("<H1><CENTER>$heure<BR>");
print (" $rel.</CENTER></H1><BR>");
print $cgi->end_html;
37
Université de la Méditerrannée
C. Aperghis-Tramoni
Résultat.
Si le cache est actif, chaque requête faite par l'intermédiaire du lien "Relancer" ira
chercher la page présente dans le cache et l'heure affichée ne sera pas remise à
jour. Il est nécessaire d'interdire au navigateur de stocker le document dans sa
mémoire cache.
Département d’Informatique
38
Université de la Méditerrannée
C. Aperghis-Tramoni
Les intitulés "Expires" et "Pragma"
Ce sont les intitulés "Expires" et "Pragma" qui vont
permettre de contrôler la mise en cache d'une page.
#!/usr/bin/perl
use CGI;
my $cgi = new CGI;
. . . .
print $cgi->header;
print ('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">');
print ("</HEAD><BODY bgcolor='#F0F0FF'>");
# Suppression de la mise en cache.
print ("Pragma: no cache \n\n");
. . . .
print $cgi->end_html;
Attention, certains
navigateurs se
révèlent incapables
de traiter de
manière correcte
ces en-têtes.
#!/usr/bin/perl
use CGI;
my $cgi = new CGI;
. . . .
print $cgi->header;
print ('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">');
print ("</HEAD><BODY bgcolor='#F0F0FF'>");
# Date de peremption.
print ("Expires: Tuesday 01-Jan-08 00:00:00 GMT\n\n");
. . . .
print $cgi->end_html;
Département d’Informatique
39
Université de la Méditerrannée
C. Aperghis-Tramoni
Utilisation de SSI.
Server-Side Includes est un ensemble de fonctionnalités fournissant des instructions
qui permettent d'insérer les résultats d'actions dans les documents html.
L'utilisation de ces fonctions impose ique les documents aient l'extension shtml et que
le fichier de configuration d'Apache soit modifié comme suit.
#
# Pour activer SSI , utiliser les lignes suivantes:
#
# Pour les fichiers Server-parsed HTML :
AddType text/html .shtml
AddHandler server-parsed .shtmll
Dans une page HTML, un commentaire est inséré par la ligne suivante.
<!-- description des instructions -->.
Les instructions SSI s'insèrent dans un document "*.shtml" au moyen de la ligne.
<!--#include file="fichier.html"-->
La différence est le signe " # " qui va permettre d'utiliser le "Server-parsed HTML" a
condition que le document ait l'extension shtml.
<!--#exec cgi="naboo.lidil.univ-mrs.fr/cgi-bin/chris/counter.pl"-->
Département d’Informatique
40
Université de la Méditerrannée
C. Aperghis-Tramoni
Les instructions SSI.
<!-# include file="fichier.html"->
Insère un fichier dans le document.
<!-# echo var="SERVER_NAME"->
<!-# echo var="LAST_MODIFIED"->
Affiche le nom du navigateur.
<!-# exec cmd="/bin/uname -n"->
Exécute la commande uname -n.
<!-# exec cgi="/cgi-bin/form.pl->
Exécute le script form.pl.
Affiche la taille du fichier en octets.
Affiche la date de dernière
modification du fichier.
<!-# fsize file="fichier.html"->
<!-# config errmsg="ERREUR: fichier introuvable !"->
Affiche ce message:
ERREUR: fichier introuvable !
<!-# config timefmt="%d/%m/%Y"->.
Met en forme la date (et/ou l'heure).
Département d’Informatique
41
Université de la Méditerrannée
C. Aperghis-Tramoni
Les fonctions de balisage.
De nombreuses méthodes génèrent des balises HTML.
Voyons comment les fonctions de balisage génèrent automatiquement certaines
balises.
use CGI qw/:standard/;
$q = new CGI;
print h1('En tete de niveau 1.');
print "\n";
print $q -> h1('En tete de niveau 1.');
<h1>En tete de niveau 1.</h1>
<h1>En tete de niveau 1.</h1>
Département d’Informatique
42
Université de la Méditerrannée
C. Aperghis-Tramoni
La fonction header().
header() renvoie l'en-tête ``Content-type:''.
On peut indiquer son propre type MIME, sinon il est positionné par défaut à text/html.
Un second paramètre optionnel spécifie le code de Status et un message lisible.
Les caractères de soulignement internes sont transformés en tiret.
use CGI qw/:standard/;
$q = new CGI;
print header(
-type=>'image/gif',
-nph=>1,
-status=>'En attente',
-expires=>'+3d',
-cookie=>$cookie,
-charset=>'utf-7',
-attachment=>'Moi.jpg',
-Cost=>'$2.00');
print "\n";
print $q->header(
-type=>'image/gif',
-nph=>1,
-status=>'En attente',
-expires=>'+3d',
-cookie=>$cookie,
-charset=>'utf-7',
-attachment=>'Moi.jpg',
-Cost=>'$2.00');
Département d’Informatique
HTTP/1.0 En attente
Server: cmdline
Status: En attente
Expires: Sun, 24 Feb 2008 13:21:24 GMT
Date: Thu, 21 Feb 2008 13:21:24 GMT
Content-Disposition: attachment;
filename="Moi.jpg"
Cost: $2.00
Content-Type: image/gif; charset=utf-7
HTTP/1.0 En attente
Server: cmdline
Status: En attente
Expires: Sun, 24 Feb 2008 13:21:24 GMT
Date: Thu, 21 Feb 2008 13:21:24 GMT
Content-Disposition: attachment;
filename="Moi.jpg"
Cost: $2.00
Content-Type: image/gif; charset=utf-7;
43
Université de la Méditerrannée
C. Aperghis-Tramoni
La fonction start_html().
Permet la création
de l'en tête html.
use CGI qw/:standard/;
$q = new CGI;
print $q->start_html(
-title=>"Le secret de l'espadon.",
-author=>'[email protected]',
-base=>'Olrik',
-target=>'Basam_Damdu',
-meta=>{'keywords'=>'Blake, Mortimer'},
-style=>{'src'=>'/espadon/style.css'},
-BGCOLOR=>'red');
C:\Documents and Settings\Chris\Bureau>perl prog.pl
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Le secret de l&#39;espadon.</title>
<link rev="made" href="mailto:Edgar.P.Jacobs%40lombard.be" />
<base href="http://localhost" target="Basam_Damdu" />
<meta name="keywords" content="Blake, Mortimer" />
<link rel="stylesheet" type="text/css" href="/espadon/style.css" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body bgcolor="red">;
Département d’Informatique
44
Université de la Méditerrannée
C. Aperghis-Tramoni
Création d'éléments html standards.
use CGI qw/:standard/;
$q = new CGI;
print $q -> start_html(-title=>"Le secret de l'espadon.");
print $q->blockquote("Blake et Mortimer ont réussi à rallier la base secrète",
"<br>de la résistance dans les falaises du ",
$q->a({href=>"http://Makran.org/"},"Makran"),
"au Moyen-Orient",
"<br>A l'abri de ses redoutables défenses et tandis que",
"<br>Blake s'occupe de la sécurité,",
"<br>le professeur Mortimer fini de mettre au point",
"<br>le premier prototype de l'Espadon :.",
$q->strong(" le SX 1."),
),
$q->hr;
print $q -> end_html;
Département d’Informatique
45
Université de la Méditerrannée
C. Aperghis-Tramoni
Distributivité des méthodes.
Une fonctionnalité utile des méthodes HTML est la distributivité.
Si un argument de type référence à une liste est passé en paramètre, la balise sera
alors distribuée sur chacun des éléments de la liste.
#!/usr/bin/perl -w
use CGI qw/:standard/;
$q = new CGI;
print $q -> start_html(-title=>"Création d'une liste ordonnée.");
print ul(
li({-type=>'Albums'},
["La marque jaune", "L'énigme de l'Atlantide",
"SOS météores","Le piège diabolique"])
);
$q->hr;
print $q -> end_html;
Département d’Informatique
46
Université de la Méditerrannée
C. Aperghis-Tramoni
Création d'une table.
#!/usr/bin/perl -w
use CGI qw/:standard/;
$q = new CGI;
print $q -> start_html(-title=>"Création d'une table.");
print table({-border=>undef},
caption('Les gentils et les méchants'),
Tr({-align=>CENTER,-valign=>TOP},
[
th(['Album', 'Héros','Gentil','Méchant']),
td(['La marque jaune.','Philip Mortimer','Françis Blake','Colonel Olrik']),
td(['Coke en stock.','Tintin','Capitaine Hadock','Roberto Rastapopoulos']),
td(['Les dragons de feu.','Luc Orient','Hugo Kala', 'Docteur Argos'])
]
)
);
print $q -> end_html;
Département d’Informatique
47
Université de la Méditerrannée
C. Aperghis-Tramoni
Création d'un formulaire.
#!/usr/bin/perl -w
use CGI qw/:standard/;
$q = new CGI;
print $q -> start_html(-title=>"Création d'un formulaire.");
print h3("Pratique de la programmation.");
print $q -> start_form (-action => "http://coruscant.lim.univ-mrs.fr/cgi-bin/ident.txt",
-method => "POST");
print "Vos Nom et pr&eacute;nom : <INPUT TYPE=TEXT NAME=NOM1 SIZE=40>";
print "<BR>";
print "Votre adresse &eacute;lectronique : <INPUT TYPE=TEXT NAME=ADR1 SIZE=40>";
print h3("Quel langage d&eacute;sirez vous pratiquer?");
print<<FIN;
<PRE>
<INPUT TYPE=RADIO NAME=SECTEUR1 VALUE="UNIV" checked> Perl
<INPUT TYPE=RADIO NAME=SECTEUR1 VALUE="CNRS"> Java
<INPUT TYPE=RADIO NAME=SECTEUR1 VALUE="INSE"> C++
<BR>
<INPUT TYPE=SUBMIT VALUE="Envoyer">
<INPUT TYPE=RESET VALUE="Annuler"></PRE>
FIN
print $q -> end_form;
print $q -> end_html;
Département d’Informatique
48
Université de la Méditerrannée
C. Aperghis-Tramoni
Les champs de texte.
#!/usr/bin/perl -w
use CGI qw/:standard/;
$q = new CGI;
print $q -> start_html(-title=>"Création d'une zone de
saisie.");
$x = <<FIN;
#!/usr/bin/perl
print ("Entree dans le programme.\n");
print ("Requete Fork.\n");
$pwd = fork();
print ("Apres le Fork.\n");
if ($pwd) {
print ("Je suis le pere.\n");
} else {
print ("Je suis le fils.\n");
}
FIN
print $q->textarea(-name=>'Texte',
-default=>$x,
-rows=>15,
-columns=>50);
print $q -> end_html;
Département d’Informatique
49
Université de la Méditerrannée
C. Aperghis-Tramoni
Mot de passe.
Création d'un champ mot de passe (PASSWORD)
print $query->password_field(-name=>'secret',
-value=>'starting value',
-size=>50,
-maxlength=>80);
print $query->password_field('secret','starting value',50,80);
Département d’Informatique
50
Université de la Méditerrannée
C. Aperghis-Tramoni
Exemple de création de fichier.
#!/usr/bin/perl
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
my $cgi = new CGI;
print
$cgi->header(),
$cgi->start_html( '' ),
$cgi->h1('Creation et comptage.'),
$cgi->start_form(-method=>'GET'),
"type de comptage ",
$cgi->popup_menu(-name=>'type',-values=>['lignes','caracteres']),
$cgi->p,
"Nom du fichier ",
$cgi->textfield(-name=>'nom'),
$cgi->p,
$cgi->textarea(-name=>'contenu', -rows=>10, -columns=>50),
$cgi->p,
if ($cgi->param) {
$cgi->submit(),
my $nom = $cgi->param('nom');
$cgi->end_form,
my $contenu = $cgi->param('contenu');
$cgi->hr;
my $type = $cgi->param('type');
my $sortie;
open($sortie, ">".$nom);
print $sortie $contenu;
close $sortie;
$wc = "wc -".substr($type,0,1)." ".$nom."\n" ;
$n = `$wc` + 0;
print "Le fichier <b>$nom</b> a ete cree, il comporte $n $type";
print $cgi->end_html;
}
Département d’Informatique
51
Université de la Méditerrannée
C. Aperghis-Tramoni
CGI perl et JavaScript.
La partie JavaScript.
#!/usr/bin/perl
$f=<<'FIN';
<SCRIPT LANGUAGE="JavaScript">
function f (nom, qualite, photo) {
w=open("","popup","width=400,height=300,resizable=no");
w.document.write("<TITLE> Identite.</TITLE>");
w.document.write("<BODY BGCOLOR=lightgreen TEXT=navy LEFTMARGIN=20
ONLOAD=\"moveTo(400,200)\">");
w.document.write("<FONT FACE=arial SIZE=3><CENTER>"+nom+"</CENTER>
</FONT><BR>");
w.document.write("<TABLE BORDER=\"2\" WIDTH=100%>");
w.document.write("<TR>");
w.document.write("<TD WIDTH=50%>"+qualite+"</TD>");
w.document.write("<TD WIDTH=50%><img src=Ident/"+photo+" border=0>
<TD></TD>");
w.document.write("</TR>");
w.document.write("</TABLE>");
w.document.close();
}
</SCRIPT>
FIN
Département d’Informatique
52
Université de la Méditerrannée
C. Aperghis-Tramoni
CGI perl et JavaScript.
La partie programmation Perl.
useCGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
my $fiche = new CGI;
print
$fiche->header(),
$fiche->start_html(),
$f,
$fiche->h1('Consultation de fichier.'),
$fiche->start_form(-method=>'POST'),
"Fiche a consulter ",
$fiche->popup_menu(-name=>'type',values=>['Matricule','WE4976','BI4638','BU2654']),
$fiche->submit(),
$fiche->end_form,
$fiche->hr;
if ($fiche->param) {
my $type = $fiche->param('type');
open (FICHE,"ident/$type.txt");
chomp(@ident = <FICHE>);
close (FICHE);
print "<SCRIPT LANGUAGE=\"JavaScript\"> f(\"$ident[0]\",\"$ident[1]\",
\"$ident[2]\");</SCRIPT>";
print $fiche->end_html;
}
Département d’Informatique
53
Université de la Méditerrannée