Chapitre 40 : Trucs et astuces en CGI


Dernière mise à jour  15 mai 1998  Auteur Gilles Maire
Serveur  http://www.imaginet.fr/ime/truccgi.htm Adresse Gilles.Maire@UNGI.com

Ce chapitre s'attache à donner quelques astuces de programmation CGI, c'est-à-dire sur le serveur httpd.

 Mais avant de vous aventurer sur le développement en PERL sous UNIX, il est peut-être encore question de faire machine arrière, en lisant la première section.

40.1 - L'action mailto:

Lors de l'écriture d'une page avec des FORMS, vous devez utiliser, soit la méthode POST, soit la méthode GET, avec une procédure CGI, référencée par la valeur de la variable ACTION.

 En positionant la valeur mailto: suivie de votre adresse en regard de la méthode POST, vous évitez l'écriture d'une procédure CGI sur le serveur puisque vous recevrez un courrier contenant toutes les valeurs entrées dans les différents champs.

 Ainsi l'exemple suivant : 

Nom 
Prénom 
Adresse Email 

dont le code HTML est :
<FORM METHOD="POST" ACTION="mailto:nom@adresse.fr">
<P>
Nom <INPUT NAME="Nom" VALUE="" > <BR>
Prénom <INPUT NAME="Prenom" VALUE="" ><BR>
Adresse Email <INPUT NAME="Email" VALUE="" > <BR>
<INPUT TYPE="SUBMIT" VALUE="Envoyer">
</FORM>

vous soumettra un courrier (si tant est que votre adresse est nom@adresse.fr) contenant les informations suivantes :

Nom=Maire&Prenom=Gilles&Email=Gilles.Maire@imaginet.fr

Un certain nombre de transformations seront appliquées quant à l'expédition de ce courrier:

Il existe quantité de programmes capables de faire ces modifications :

Remarque fondamentale : les dernières versions des navigateurs comprennent l'option ENCTYPE="plain.text", cette option permet de soumettre les informations non codées.

Ainsi   pour recevoir le message :

From: service@adresse
To: nom@adresse
Subject: Message du Service Web
nom1=valuer1
nom2=valeur2
nom3=valeur3

il suffit de soumettre le formulaire avec les options suivantes

<FORM ACTION="mailto:nom@adresse"  ENCTYPE="text/plain">

40.2 - Les directives

Le chapitre traitant du langage PERL utilisait la subroutine PrintHeader pour commencer l'affichage d'une page HTML par une procédure CGI.

 Cette subroutine n'est autre qu'un ordre :

print "Content-type: text/html\n\n"  ;

Il est très important de respecter les deux caractères \n\n.

Une autre directive est la directive Location:

Cette directive permet d'appeler une page HTML existante à partir d'une procédure CGI. C'est comme cela que le programme URoulette fonctionne.

40.3 - La variable %ENV

Le programme PERL suivant donne la liste des variables d'environnement présentes lorsque vous appelez un CGI:

 

print "Content-type: text/html\n\n"  ;
print "<UL>"  ;

foreach   ( keys (%ENV))
#la procedure keys donne tous les indices du tableau associatif %ENV
{
 print "<LI><B>$_ </B> :<BR> $ENV{$_}\n" ;
 #On imprime simplement chaque nom de variable d'environnement et
 sa valeur.
}
print "</UL>";

Pour voir le résultat de l'exécution de cette procédure cliquer ici

On voit qu'il est, par exemple, facile de savoir la marque de votre lecteur de Web, par la variable $ENV{HTTP_USER-AGENT}.

 

40.4 - Les mécanismes "Server Push" et "Client Pull"

Introduction

Les mécanismes de Serveur Push et de Client Pull ont été introduits à partir des versions 1.1 de Netscape. Ils ne fonctionnent donc pas avec Mosaic ou d'autres lecteurs de Web.

 Ils ont été mis en oeuvre pour permettre quelques fonctions dynamiques aux pages Webs. Ainsi sans aller aussi loin que le langage Java, ils permettent d'animer vos pages Webs, notamment par des séquences d'images.

 

Les applications pratiques, sont les dessins animés, les photos satellites évolutives, et tous les effets que l'on peut imaginer.

 La fonction Serveur Push laisse la connexion ouverte, ce qui a pour effet de montrer au lecteur une page HTML jamais chargée à 100%. Cette directive nécessite un serveur HTTP et l'emploi de procédure CGI.

 La fonction Client Pull provoque la réouverture de la connexion par le client. Cette directive peut être utilisée même dans des pages locales, c'est à dire qu'elle est purement orientée client.

 

Client Pull

La demande de rafraîchissement est faite par le serveur, c'est à dire dans la page HTML, par une directive META avec la syntaxe suivante :

    
      <META HTTP-EQUIV="Refresh" CONTENT="x; URL=http://..">

La valeur de CONTENT règle la fréquence de rafraîchissement en secondes. La directive doit être entrée dans le block <HEAD></HEAD> de la page HTML. La partie URL permet de lancer une URL qui doit obligatoirement être définie par son chemin absolu et non par un chemin relatif.

 Regardons l'exemple suivant :

<META HTTP-EQUIV="Refresh" CONTENT=3>
<TITLE>Exemple Pull Client</TITLE>

<h1>Exemple Pull Client</h1>

Ceci est une page qui est réactivée toutes les 3 secondes<P>

Cliquez ici pour accéder à l'exemple

 Puisque nous sommes dans le chapitre trucs et astuces donnons les idées suivantes :

La combinaisons de plusieurs de ces remarques vous permettront de faire quelques animations.

 N'oubliez pas non plus de mettre dans votre page personnelle un générateur automatique d'adresse URL, à l'instar d'Uroulette, en donnant l'URL : URouLette [kuhttp.cc.ukans.edu/cwis/organizations/kucia/uroulette/uroulette.html])

Serveur Push

Le mécanisme Serveur Push permet de laisser une connection ouverte afin de provoquer des actions multiples comme nous allons le voir.

 Ceci naturellement consomme des ressources CPU sur le serveur httpd et il n'est pas évident que votre ingénieur système vous autorisera à mettre en place la directive Serveur Push.

Pour actionner un mécanisme Serveur Push il faut envoyer avec la page HTML une directive qui n'est plus text/html, mais la suivante :

Content-type: multipart/mixed;boundary=ThisRandomString
--ThisRandomString
Content-type: text/plain

Les données du premier document

--ThisRandomString
Content-type: text/plain

Les données du deuxième document

--ThisRandomString--

Ce sont les deux tirets (--) après le dernier ThisRandomString qui indiquent que le document est terminé. Il est possible d'utiliser une deuxième syntaxe encore expérimentale:

 

"multipart/x-mixed-replace"

à la place de

 multipart/mixed

Le caractère x indique que le protocole est encore expérimental. La directive replace indique que les données des différents blocs se remplaceront au fur et à mesure. Par cette deuxième syntaxe, vous allez pouvoir animer des images, par exemple.

 Si la procédure CGI effectue une boucle sans fin, l'image pourra être animée de façon continue.

 On peut agrémenter la procédure CGI d'une attente de quelques secondes.

 Attention Aucun caractère blanc n'est autorisé dans une directive Serveur Push

Enfin regardons le sympathique programme suivant de Rob McCool,

/*
 * doit.c: Quick hack to play a sequence of GIF files.
 * 
 * Rob McCool
 *
 * This code is released into the public domain.  Do whatever 
 * you want with it.
 *
 */

#include <sys/types.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>

#define LASTCHAR 'j'

#define HEADER \
"Content-type: multipart/x-mixed-replace;boundary=ThisRandomString\n" \

#define RANDOMSTRING "\n--ThisRandomString\n"
#define ENDSTRING "\n--ThisRandomString--\n"
#define CTSTRING "Content-type: image/gif\n\n"

int main(int argc, char *argv[])
{
    struct stat fi;
    char fn[32];
    caddr_t fp;
    unsigned char x;
    int fd;

    if(write(STDOUT_FILENO, HEADER, strlen(HEADER)) == -1)
        exit(0);
    if(write(STDOUT_FILENO, RANDOMSTRING, strlen(RANDOMSTRING)) == -1)
        exit(0);

    x = 'a';

    while(1) {
        sleep(1);
        if(write(STDOUT_FILENO, CTSTRING, strlen(CTSTRING)) == -1)
            exit(0);
        sprintf(fn, "images/A%c.gif", (char) x);
        if( (fd = open(fn, O_RDONLY)) == -1)
            continue;
        fstat(fd, &fi);
        fp = mmap(NULL, fi.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
        if(fp == (caddr_t) -1)
            exit(0);
        if(write(STDOUT_FILENO, (void *) fp, fi.st_size) == -1)
            exit(0);
        munmap(fp, fi.st_size);
        close(fd);
        if(write(STDOUT_FILENO, RANDOMSTRING, strlen(RANDOMSTRING)) == -1)
            exit(0);
        if(x == LASTCHAR) goto thats_it;
        else ++x;
    }

    /* This goto is Marc's fault.  Marc digs goto. */

thats_it:
    exit (0);
}

c'est un programme écrit en C qui permet de dérouler une séquence d'images répertoriées de images/Aa.gif à images/Aj.gif

 Mais ces exemples ont été supplantés aujourd'hui par les programmes de création d'images animées du style de GifConf.


Haut Haut Suivant Sommaire Recherche Fenêtre Glossaire Nouveau Bientôt Courrier Souscription Aide Copyright