Passerelle CGI


Présentation
appel
Format d'un CGI
Exemple sur Unix
Principales variables d'environnement HTTP
Passage de paramètres

Apache & CGI

Présentation

CGI signifie Common Gateway Interface, ou en d’autre termes, une passerelle d’interfaçage standard permettant de faire exécuter un programme situé sur le serveur Web. Plus précisément, suite à une requête de l’utilisateur (à 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 n’importe 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.

L’inconvé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 d’autres utilisateurs, et ce autant de fois qu’il y a de demandes de clients...

appel

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

format d'un CGI

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

 

exemple sur Unix

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'

remarque : la première ligne est obligatoire sur Unix (elle permet de préciser le shell d'exécution du CGI)
Ne pas oublier la ligne vide ('\n' ici)

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>'


 

Principales variables d'environnement HTTP

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


 

Passage de paramètres

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


(c) 2002- 2006 Didier Deléglise


modifié
le 20/11/2006

Ecrire a DD
ecris
moi


les forums techniques Oracle

mon BLOG Oracle,
en Francais
connaitre DD
l'autre vie
de DD

mon CV

trucs
et astuces

JOBs Oracle
du jour
Homepage "Tout sur Oracle"
Mon site :
Tout sur Oracle (et le web)
Copyright (C) 2002
Utilisation de ces documents