CGI - UN TUTORIAL, UNE CLASSE ET UN EXEMPLE

Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
- - Dernière réponse : cs_exar
Messages postés
287
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

Afficher la suite 
cs_exar
Messages postés
287
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1 -
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
58
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
4 juillet 2006
-
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
117
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
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
-
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
117
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
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
-
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
117
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
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
-
Oui sa m'intéresse de les voir.
marik7335
Messages postés
117
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
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
-
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
-
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
-
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
-
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
-
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
-
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 -
Un truc cool serait de dire ici ce qu'est un cgi :)