Un programme CGI peut être écrit dans n'importe quel langage de programmation disponible sur le système. Les seules conditions sont que le langage puisse lire sur l'entrée standard, écrire sur la sortie standard et accéder aux variables d'environnement. De nombreux scripts ont été écrits en Perl, mais on peut aussi utiliser C et C++, Python, Fortran, TCL, sh, csh, ksh (ou n'importe quel autre shell UNIX), Visual Basic (sous Windows), AppleScript (sur Macintosh)...
Les fichiers sont généralement placés dans un répertoire spécifique nommé /cgi-bin/. Tout fichier dans ce répertoire est considéré comme un exécutable. De fait lorsque le serveur HTTP reçoit une requête du type http://www.votredomaine.com/cgi-bin/fichier.cgi, le fichier sera exécuté, et ce sera le résultat qui sera renvoyé à l'utilisateur...
La communication en entrée peut se faire via des variables d'environnement ou directement via l'entrée standard (STDIN), La sortie se fait via la sortie standard (STDOUT) sur laquelle on envoie les informations à afficher sous forme identifiée. Voici une liste d'un certain nombre de 'variables d'environnement' accessibles par un programme CGI.
· CONTENT_LENGTH : Taille en octets du contenu des informations jointes à la requête en mode PUT ou POST, vide si on utilise la méthode GET.
· CONTENT_TYPE : Type MIME des données envoyées au programme CGI appelé par la méthode POST, vide si on utilise la méthode GET.
· QUERY_STRING : Chaîne de caractères au format URL contenant les paramètres joints à la requête GET. Contient les données d'entrée du programme précédé du caractère '?'. Elle est vide si on utilise la méthode POST, a moins qu'il y ait déjà quelque chose derrière l'URL du script.
· REQUEST_METHOD : Contient la méthode utilisée pour la requête (GET, POST, HEAD, PUT, DELETE, LINK), sert pour déterminer la méthode utilisée pour traiter les données.
On appelle client HTTP, le programme utilisateur qui fait la requête, en général c'est un navigateur.
· HTTP_ACCEPT : Les différents types MIME supportés par le client HTTP (Format: type/soustype).
· HTTP_ACCEPT_LANGUAGE : Langage utilisé par le client HTTP.
· HTTP_ACCEPT_ENCODING : Type d'encodage supporté par le client HTTP.
· HTTP_ACCEPT_CHARSET : Table de caractères supportée par le client HTTP.
· HTTP_COOKIE : Liste des 'Cookies' associés par le client HTTP à la ressource consultée.
· HTTP_USER_AGENT : Signature du client HTTP effectuant la requête (Format: software/version ou library/version).
· HTTP_REFERER : URL de la ressource ayant renvoyé le client HTTP sur la requête en cours.
· REMOTE_ADDR : Adresse IP de l'ordinateur client effectuant la requête. Cette variable permet de repérer, d'identifier des ordinateurs et d'effectuer quelque chose en conséquence (empêcher l'accès, donner des droits supplémentaires par exemple).
· REMOTE_HOST : Adresse DNS (nom de domaine) de l'ordinateur client effectuant la requête. Cette variable est très utilisée pour afficher des publicités en rapport avec le pays d'origine par exemple.
· REMOTE_USER : Identifiant de l'utilisateur du client, lorsque le mode d'authentification de la ressource est actif.
· AUTH_TYPE : Si le serveur supporte l'authentification et que le script est protégé, indique le protocole utilisé pour valider l'identité.
· REMOTE_PORT : Port utilisé par le client HTTP pour cette connexion. Souvent absente
· DOCUMENT_ROOT : Nom du répertoire physique contenant la racine du serveur consulté sur la machine.
· GATEWAY_INTERFACE : La version du standard CGI supportée par le serveur HTTP (Format: CGI/révision).
· HTTP_HOST ou SERVER_NAME : Adresse IP ou DNS de la machine hébergeant le serveur HTTP.
· SERVER_ADMIN : Adresse e-mail déclarée par l'administrateur du serveur.
· SCRIPT_NAME : URL du chemin d'accès au script CGI.
· SCRIPT_FILENAME : Nom et chemin d'accès complet au CGI sur le disque du serveur consulté.
· SERVER_PORT : Port sur lequel le serveur a réceptionné la requête
· SERVER_PROTOCOL : Nom et version du protocole utilisé par le serveur HTTP (Format: protocol/révision).
· SERVER_SOFTWARE : Nom et version du logiciel serveur HTTP utilisé. (Format nom/version)
· TZ : Nom de la 'Time Zone' définie sur la machine du serveur HTTP.
On appelle méthode la façon de passer les informations du serveur au programme CGI. Elles définissent la façon dont le programme reçoit les données. Il faut différencier 2 méthodes :
· La méthode GET : Quand on utilise cette méthode, le programme reçoit les données dans la variable d'environnement QUERY_STRING. La méthode GET ne peut être utilisée que si les données d'entrées ne sont pas trop importantes, ni confidentielle car cette méthodes passe les arguments dans l'URL donc visible, de plus la longueur d'une URL est est limitée à 1024 caractères.
· La méthode POST : Quand on utilise cette méthode, les données à traiter sont transmises via l'entrée standard (STDIN). Le serveur n'indiquant pas la fin de la chaîne avec un caractère spécial, il faut utiliser la variable d'environnement CONTENT_LENGTH pour connaître la longueur des données.
Dans les 2 cas les données sont transmises sous forme URL-encoded; c'est-à-dire que les espaces sont remplacés par des signes +, les tildes (~) sont remplacés par %7E et ainsi de suite...
Le programme CGI envoie les résultats vers la sortie standard (STDOUT soit l'écran en général). Ils peuvent être envoyés directement vers le client HTTP ou être interprétés par le serveur qui va effectuer une nouvelle action.
Dans les résultats renvoyés, le serveur cherche un des 3 en-têtes que le programme peut retourner :
· Content-type : Indique le type MIME des données. Généralement comme les programmes CGI renvoient de l'HTML, la ligne utilisée est Content-type: text/html\n\n. Attention à bien mettre les 2 nouvelles lignes (\n)
· Location : Indique au serveur que l'on fait référence à un autre document. Utilisé pour faure des redirections.
·
Status : C'est le code d'état renvoyé par le serveur au client.
Format : nnn XXXXXXX où nnn est un nombre à 3 chiffres et XXXXXX le texte qui
y correspond. Exemple : 404
Not found.