Techbull.com est hébergé chez Hébergement-web-québec.com

Publicité   

Accueil \Guide\ Trucs & astuces pour Cgi

Vos Suggestions

 

 


Échange de bannières Québécoises

Chapitre 35 : Trucs et astuces en CGI

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. 

35.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 : 
Le meilleur programme est MTF 16 bits [ftp://ftp.winsite.com/pub/pc/win3/misc/mtf50_16.exe ] de Robert Fries, sur Windows, MTF 32 bits [ftp://ftp.winsite.com/pub/pc/win95/misc/mtf50_32.exe] ou inFORMer [www.phoenix.net/~jacobson/] de Doug Jacobson sur Macintosh 

35.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. 

35.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>";

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

 

35.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>

 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.

  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.  


 

 Accueil -  Techbull.com? Nous contacter  -  Ajouter Un bon lien(s)

Copyright © 2000 Les Technologies Bulldog