Pour écrire un script CGI, nous pouvons utiliser n'importe quel langage de programmation. Nous devons simplement pouvoir lire sur l'entrée standard, écrire sur la sortie standard et accéder aux variables d'environnement.
Nous allons écrire notre premier programme que nous appelerons
date.cgi
. Nous devons penser aux permissions de ce fichier. Le
programme doit être exécutable par tous, et lisible par tous dans le
cas de script shell, perl ... En effet, n'oublions pas que c'est le
serveur HTTP qui va exécuter notre programme. Or, le serveur tourne
dans la majeure partie des cas sous l'utilisateur nobody
, et
donc il n'a pas de droits particuliers (retenons bien que le serveur
ne s'exécute pas sous l'utilisateur qui a écrit le script).
Nous installerons notre progamme dans le répertoire
/usr/local/etc/httpd/cgi-bin
, qui est le répertoire par défaut des
scripts CGI (encore faut-il que l'administrateur du système nous en
laisse le droit). En effet, n'importe qui n'a pas le droit de faire
des scripts CGI. L'administrateur peut limiter la possibilité de
mettre des scripts CGI que dans un seul répertoire. Il contrôlera
ainsi beaucoup plus facilement ces scripts. Car, il faut le savoir,
les scripts CGI sont une bonne source de trous de sécurité.
Ainsi, le serveur sait que tous les fichiers se
trouvant dans ce répertoire devront être exécutés et non pas envoyés
directement au navigateur, et ce seront les seuls dans ce cas. C'est le programme qui devra envoyer les
informations au navigateur, par l'intermédiaire de la sortie standard
(d'où l'obligation de pouvoir écrire sur la sortie standard). Donc,
notre programme doit produire sur sa sortie standard quelque chose de
compréhensible par le navigateur. Ainsi, lorsque votre navigateur accédera à l'URL
correspondant à ce fichier (par exemple:
http://www.april.org/cgi-bin/date.cgi), le serveur exécutera le
programme date.cgi
qui produira un fichier au format HTML contenant la
date courante. Le navigateur affichera alors le résultat.
Notre premier programme est écrit sous la forme d'un script shell. Voici le source de date.cgi:
#!/bin/sh tmp=`/bin/date` cat << EndFile Content-type: text/html <HTML><HEAD><TITLE>Script Cgi</TITLE></HEAD> <BODY> <CENTER> <H1>La date courante sur le serveur est</H1> $tmp </CENTER> </BODY> </HTML> EndFile
On fait un chmod 555 date.cgi
et on copie le fichier dans le
répertoire /usr/local/etc/httpd/cgi-bin
. Ensuite, on peut utiliser notre
navigateur pour voir le résultat. On accède à l'URL
http://www.april.org/cgi-bin/date.cgi et on obtient le résultat suivant:
La date courante sur le serveur est
Sun Mar 30 11:48:54 GMT+0100 1997
Au niveau du source, on affecte à la variable tmp
le résultat de la
commande /bin/date
($tmp
permet ensuite d'avoir accès au contenu de la
variable tmp
). Ensuite, il faut juste savoir que la commande cat
<< EndFile
permet d'afficher sur la sortie standard tout ce qui suit
jusqu'à ce que l'on rencontre une ligne formée uniquement par EndFile
(la chaîne suivant immédiatement <<). En
fait, tout ce qui se trouve entre << EndFile
et EndFile
est utilisé
comme entrée standard de la commande cat (la chaine EndFile est
choisie arbitrairement).
Ce type de script shell où les données sont directement incluses dans le script s'appellent des documents in-line ou des here documents.
Ce qui est important de noter, c'est la première ligne écrite sur la
sortie standard (Content-type: text/html
), c'est à ce niveau que l'on
spécifie le type de données que l'on envoie au navigateur. Cette
ligne fait en fait partie du header HTTP. Ce header est indispensable
pour que le navigateur puisse interpréter correctement les données
reçues (les autres parties du header seront ajoutées par le serveur HTTP). Le type "text/html" est le type MIME standard pour un document
HTML. Si notre programme devait générer une image au format Gif (par
exemple pour implémenter un compteur graphique), nous aurions utilisé
le type "image/gif". Le header doit obligatoirement être terminé par
une ligne vide (comme le header de tous les protocoles). Cette ligne
sépare l'en-tête de la réponse (c'est à dire les informations au sujet
de la réponse) du contenu de la réponse.
Ce qu'il faut retenir à ce niveau, c'est qu'un script CGI doit
produire sur sa sortie standard quelque chose de compréhensible par le
navigateur, donc, dans la majorité des cas, une sortie au format
HTML. La seule obligation est la présence, sur la première ligne, du
header Content-type
. Les autres parties du header seront
ajoutées par le serveur HTTP. C'est pourquoi ce type de script est
appelé Parsed Header Script. Il existe un autre type de
script CGI, appelé Non Parsed Header Script. Pour ce type de
script, le serveur ne rajoute rien, et c'est donc le script lui_même
qui a la charge de fournir un header complet, conforme au protocole HTTP.
Voilà, nous avons écris notre premier script CGI. On y accède directement par le navigateur.
Faites le test: http://www.april.org/cgi-bin/date.cgi.