Présentation
appel
Format d'un CGI
Exemple sur Unix
Principales variables d'environnement HTTP
Passage de paramètres
CGI signifie Common Gateway
Interface, ou en dautre termes, une passerelle dinterfaçage standard
permettant de faire exécuter un programme situé sur le serveur Web. Plus précisément,
suite à une requête de lutilisateur (à travers un URL particulier spécifié
au sein du navigateur) un programme externe au serveur http est lancé, qui construit
dynamiquement le résultat de la requête au format HTML. Les principaux avantages
de CGI sont son universalité et sa simplicité de mise en oeuvre.
En effet un programme CGI est accessible à partir de nimporte quel serveur
http du marché, et peut être écrit dans des langages variés :
Langages utilisés
Interprétés : Shell, Perl
Compilés : C++, C,Visual Basic, etc.
Linconvénient, puisque chaque médaille a son revers, est principalement la consommation de ressources : chaque accès à des données (un fichier ou une base) déclenche un process autonome sur le serveur, sans partage possible des informations par dautres utilisateurs, et ce autant de fois quil y a de demandes de clients...
Le script doit se trouver dans un répertoire déterminé,
connu du serveur HTTP ou pouvoir être identifié comme étant
un CGI (par le type de fichier par exemple)
Un répertoire virtuel communément utilisé : /cgi-bin/
exemple d'Url d'appel :
http://mon_serveur.marseille.fr/cgi-bin/programme1.sh
entete + corps
entete :
précise le type Mime du document
text/html : de l'HTML
text/plain : du texte simple
images/gif /jpeg /x-xbitmap : une image gif, jpeg ou bitmap
corps :
un traitement qui renvoie les résultats au format précisé
ci-dessus sur la sortie standard (stdout), réacheminés vers le
navigateur
Appel : http://mon_serveu/rep_cgi/coucou.sh
le script CGI en lui même (ici un shell)
#!/bin/sh
#coucou.sh
echo 'Content-type: text/plain\n'
echo 'coucou'
et en un peu plus dynamique :
Appel : http://mon_serveur.domaine.fr/rep_cgi/date.sh
ici un shell qui affiche la date :
#!/usr/bin/sh
#date.sh
echo 'Content-type:text/html\n'
echo '<HTML>'
echo '<BODY>'
echo '<H1>'
echo 'nous sommes le '`date`
echo '</H1>'
echo '</BODY>'
echo '</HTML>'
Chaque requête http s'execute dans un environement particulier
sur le serveur
et utilise des variables spécifiques, donnant des infos sur
le dialogue client/serveur :
Appel : http://mon_serveur.domaine.fr/rep_cgi/env_cgi.sh
#!/bin/sh
# env_cgi.sh
# affichage de quelques variables
d'environnement
# concernant l'appel d'un CGI quelconque
#
echo 'Content-type: text/plain\n'
echo "Quelques variables d'envt CGI\n"
echo Serveur Web: $SERVER_SOFTWARE
echo Machine serveur: $SERVER_NAME
echo Version CGI: $GATEWAY_INTERFACE
echo Nom du script: $SCRIPT_NAME
echo Nom client: $REMOTE_HOST
echo Adresse client: $REMOTE_ADDR
echo Logiciel client: $HTTP_USER_AGENT
echo Types Mime supportes: $HTTP_ACCEPT
C'est en général un formulaire HTML qui est utilisé pour envoyer des paramètres au CGI. Et plus précisément via un champ texte, ou une liste déroulante ou un radio bouton. Voici un exemple de formulaire mini avec un champ texte à saisir :
<HTML> <HEAD> </HEAD> <FORM METHOD="GET" ACTION="/cgi-bin/repond.sh" > <INPUT TYPE = TEXT NAME=NOM>
<INPUT TYPE= SUBMIT VALUE="Envoyer!"> </FORM> </HTML>
et ca aura cette tête là :
Les méthode d'appel peuvent être de 2 types :
- appel avec la méthode GET, les paramètres d'entrée sont
stockés dans la variable QUERY_STRING de l'environnement d'exécution
- appel avec la méthode POST, les paramètres d'entrée passe
par l'entrée standard : stdin
architecture CGI (entrées et sorties)
Encodage
le format de l'encodage de la chaîne de paramètres est le suivant
:
début de la liste de paramètres introduit par un '?'
suite de paires parametre=valeur séparées par des '&', les
blancs éventuels étant remplacés par des '+'
Si la
méthode est GET, les paramètres et leurs valeurs apparaissent
de manière encodée mais lisible a la fin de l'URL d'appel. Cette
chaîne est introduite par un '?' a la fin de l'URL standard.
exemple :
http://mon_serveur.domaine.fr/rep_cgi/nom_script?par1=toto&par2=tutu+tata
ou
http://mon_serveur.domaine.fr/rep_cgi/bonjourx.sh?nom=daredevil
(j'ai saisi 'daredevil' dans le champ 'nom' du formulaire...)
CGI traitant un paramètre envoyé par POST
#!/usr/bin/sh
echo 'Content-type:text/plain\n'
read TOTO
NOM=`echo $TOTO |cut -f2 -d=`
echo bonjour $NOM
CGI traitant un paramètre envoyé par GET
#!/usr/bin/sh
echo 'Content-type:text/plain\n'
NOM=`echo $QUERY_STRING |cut -f2 -d=`
echo bonjour $NOM
resultat
remarque : il existe sur le Net, un certain nombre de source en shell , Perl
et autres qui font le traitement des chaines de paramètres...
|