CGI - UN TUTORIAL, UNE CLASSE ET UN EXEMPLE

MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 - 10 avril 2004 à 11:43
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 - 31 janv. 2012 à 17:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21801-cgi-un-tutorial-une-classe-et-un-exemple

cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 1
31 janv. 2012 à 17:55
Je n'ai pas testé, mais j'ai regardé le code. Ça me semble tout bon. Je n'ai pas vraiment regardé pour la gestion de la mémoire (vu que tu utilises des pointeurs). Enfin, en fait, je n'ai même pas regardé du tout.
Sinon, c'est clair, les variables, classes, ... ont des noms parlants. Ainsi que les fichiers. Les commentaires sont nettement appréciables.
Pour l'instant, je mets ce code dans mes favoris, je le testerai plus tard, une fois que j'aurais installé ma tour Linux...
ana_adil Messages postés 52 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 4 juillet 2006
29 janv. 2006 à 01:35
Bonjour,

Comment faire pour tester les scripts CGI/C (CGI/Perl marche impeccable)

Je suis sous windows XP, Apache 2.

Merci.
marik7335 Messages postés 115 Date d'inscription samedi 27 décembre 2003 Statut Membre Dernière intervention 11 mai 2009
13 nov. 2004 à 19:37
re,
c'est drôle, je ne m'étais jamais posé la question de savoir si on écrivait "autant pour moi" ou au temps pour moi", on peut dire que là j'ai la réponse à cette question (lol). Merci pour cette info Kirua.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
13 nov. 2004 à 18:46
http://www.cppfrance.com/code.aspx?ID=27468

je t'enjoins à lire les 5 derniers commentaires de ce code, ils sont frais du jour :D (c'est ça qui me fait rire ^^)
marik7335 Messages postés 115 Date d'inscription samedi 27 décembre 2003 Statut Membre Dernière intervention 11 mai 2009
13 nov. 2004 à 18:43
Kirua => Autant pour moi
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
13 nov. 2004 à 18:37
je ne pense pas avoir dit que le php se compilait en CGI... si c'est ce que tu as compris, c'est que je me suis mal exprimé, parce que pas une seconde dans mon existence je n'ai cru ça. j'ai relevé le fait que le PERL était souvent compilé en CGI, mais ça c'est une chose qui n'a pas d'effet sur le PHP qui reste bien interprété, rien à voir avec le PERL.

pq tu dis que le PHP s'interprète en CGI?? comprends pas. l'interpréteur PHP renvoie du "contenu" (que ce soit du html, des données binaires, des images, .....) au serveur (Apache par exemple) qui lui-même renvoie le tout au client avec les en-têtes HTTP (précisés par le code PHP ou bien les en-têtes par défaut).

tu dis de même que le CGI est interprété en HTML, ben non, certainement pas. Le CGI, une fois exécuté, renvoie du contenu (à nouveau, pas forcément du HTML) au serveur, et le serveur relaie l'information.
marik7335 Messages postés 115 Date d'inscription samedi 27 décembre 2003 Statut Membre Dernière intervention 11 mai 2009
13 nov. 2004 à 18:32
Kirua => tu dis que : "c'est comme le PHP, le PERL (qui d'ailleurs se compile souvent en CGI), l'ASP... " ,
le PHP ne se compile en CGI mais s'interprète en CGI, et comme tu le dis par la suite, c'est le serveur qui permet cette interprétation. le CGI est un programme compilé qui n'est interpété en HTML que lors de son éxécution par le serveur, grâce à l'entête Content-type: text/html.
Re,
Finalement aprés étude du code, je m'apperçoit que je me suis trompé, dsl. J'avais pas bien compris le sytème du GET et du POST et c'est pour cette raison que je croyais que le code était lourd.
Ce qui est interessant, c'est ce système de listes chaînées pour parcourir les noms et valeurs des champs du formulaire. Moi je l'ai géré avec un tableau, étant donné que l'on connaît le nombre de champs dans le formulaire. C'est vrai qu'avec une liste chaînée c'est plus générique. Par contre, pour en revenir à ce que j'ai dit. Il aurait été possible de créer une seule fonction valable à la fois pour le GET et pour le POST pou récupérer le contenu de la QUERY STRING et également pour convertir les valeurs en cas de besoins. Voici une grande partie du code de mes fonctions :

struct CGI
{
char nom_champ[100]; //le nom du champ
char val_champ[100]; //le contenu du champ
};

void getword(char *word, char *line, char stop)
{
int x = 0,y;
for(x=0;((line[x]) && (line[x] != stop));x++)
word[x] = line[x];
word[x] = '\0';
if(line[x]) ++x;
y=0;
while(line[y++] = line[x++]);
};

char x2c(char *what)
{
register char digit;
digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
digit *= 16;
digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
return(digit);
};

void unescape_url(char *url)
{
register int x,y;
for(x=0,y=0;url[y];++x,++y)
if((url[x] = url[y]) == '%')
{
url[x] = x2c(&url[y+1]);
y+=2;
};
url[x] = '\0';
};

void plustospace(char *str)
{
register int x;
for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
};

void receptionenv(char *contenu, CGI tcouple[])
{
for(int x=0; contenu[x]; x++)
{
getword(tcouple[x].val_champ, contenu, '&');
plustospace(tcouple[x].val_champ);
unescape_url(tcouple[x].val_champ);
getword(tcouple[x].nom_champ, tcouple[x].val_champ, '=');
};
};

void _CGI_POST(CGI tcouple[])
{
char *cl = NULL;
char *contenu = NULL;
int icl;
int i = 0;

cl = getenv("CONTENT_LENGTH");
icl = atoi(cl);

contenu = (char *) malloc(icl + 1);
while (i < icl)
{
contenu[i++] = getchar();
}
contenu[i] = '\0';
receptionenv(contenu, tcouple);
};

void _CGI_GET(CGI tcouple[])
{
char *cl = NULL;
char *contenu = NULL;
char *queryst = NULL;
int icl;
int i = 0;

cl = getenv("CONTENT_LENGTH");
icl = atoi(cl);
queryst = (char *) malloc(icl + 1);
queryst = getenv("QUERY_STRING");
receptionenv(queryst, tcouple);
};

void REQUEST(CGI tcouple[])
{
char *request = NULL;
request = getenv("REQUEST_METHOD");

if(strcmp(request,"POST") == 0)
_CGI_POST(tcouple);
else if(strcmp(request,"GET") == 0)
_CGI_GET(tcouple);
};
mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008
13 nov. 2004 à 16:58
Oui sa m'intéresse de les voir.
marik7335 Messages postés 115 Date d'inscription samedi 27 décembre 2003 Statut Membre Dernière intervention 11 mai 2009
13 nov. 2004 à 09:52
Slt
mortiis => Ton code est intéressant mais je trouve que tes méthodes pour convertir une valeur et pour gérer les méthode GET et POST sont un peu lourdes. (je me suis pas intéressé au reste). Néanmoins, j'ai testé ton code, il fonctionne parfaitement, c'est juste une question d'optimisation. Si ça t'intéresse je me te montrer les fonctions que j'ai programmé moi, beaucoup moins lourdes mais plus difficiles à comprendre. Par contre je n'utilise pas les objets mais les structures, ça revient au même.
Cordialement
Marik7335
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
2 oct. 2004 à 03:09
je pense que si le PHP a gagné en popularité chez les hébergeurs (et dc chez les utilisateurs, en conséquence) c'est parce que tu peux facilement, en tant qu'admin du serveur, déterminer quelles fonctions sont "disabled" (désactivées), et donc: tu peux facilement gérer ce que tes clients peuvent scripter, parce que mine de rien, tu fais ce que tu veux avec ton site, mais pas avec le serveur, qui appartient à plusieurs clients dans le cas d'un mutualisé! ce qui est qd même fréquent. par rapport à ça, les CGI posent problème, car c'est du code compilé (binaire): tu peux pas bloquer spécifiquement certaines commandes, tu dois exécuter les cgi avec des droits systèmes particuliers, et c'est bcp plus subtile comme configuration, et en même temps moins précis.

pr la vitesse, je suis tenté de croire que les cgi vont plus vite, car c'est la vieille opposition compilé >< interprété, mais... il existe un outil spécial du Zend Engine, pour les pros, qui permet de semi compiler les scripts, pr les accélérer, un peu comme un byte-code Java. ceci dit... je pense que c'est réservé aux pros (comprendre: budget).
gergalp Messages postés 70 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 20 mars 2007
1 oct. 2004 à 20:05
oui, c'est un peu comme le php, mais compilé.
Et niveau rapidité, ca va vraiment beaucoup plus vite que apache/php ou c'est juste histoire de gagner quelques mirosecondes de traitement par heure?
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
1 oct. 2004 à 17:31
c'est comme le PHP, le PERL (qui d'ailleurs se compile souvent en CGI), l'ASP ... c'est juste un script interprêté par le serveur et qui est éventuellement remplacé par un autre contenu si le code l'indique.

par exemple, tu peux avoir un code qui récupère depuis une base de données une liste de noms, et qui les affiche au format HTML, et c'est ce code html qui est envoyé au client web, pas le code du cgi, qui reste du côté serveur.
gergalp Messages postés 70 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 20 mars 2007
1 oct. 2004 à 14:51
mais on peut créer un site complet avec un cgi? ou tout simplement une interface html pour controler à distance un logiciel?
cs_gueye Messages postés 2 Date d'inscription jeudi 23 janvier 2003 Statut Membre Dernière intervention 17 mars 2007
22 mai 2004 à 14:23
C'est cool comme tut et pour l'exple j'ai changer le rep:
/cgi-bin/NomIp.cgi et ca marche.
Merci
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
10 avril 2004 à 12:51
Common Gateway Interface: des programmes (souvent en Perl, mais en C++ comme tu le vois, c possible aussi) spécifiques au web. Ils permettent un affichage dynamique de données, puisque le script (programme en fait) reçoit des infos (par exemple fournies via un formulaire internet en html) et renvoie en conséquence un contenu différent (qu'il a pu piocher ds des ficheirs, ds des bdd, etc...)
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
10 avril 2004 à 11:43
Un truc cool serait de dire ici ce qu'est un cgi :)
Rejoignez-nous