Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs



Documents pareils
Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Manuel d'installation

Stockage du fichier dans une table mysql:

Sage CRM. 7.2 Guide de Portail Client

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

Un exemple d'authentification sécurisée utilisant les outils du Web : CAS. P-F. Bonnefoi

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation Web. Madalina Croitoru IUT Montpellier

EXPOSE. La SuisseID, qu est ce que c est? Secrétariat d Etat à l Economie SECO Pierre Hemmer, Chef du développement egovernment

Module BD et sites WEB

Application de lecture de carte SESAM-Vitale Jeebop

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Recherche dans un tableau

Documentation CAS à destination des éditeurs

Aspects techniques : guide d interfaçage SSO

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

.NET - Classe de Log

Mysql avec EasyPhp. 1 er mars 2006

Module http MMS AllMySMS.com Manuel d intégration

Formation HTML / CSS. ar dionoea

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Types MIME (2) Typage des ressources Internet. Les URI. Syntaxe dans les URI. Possibilité de spécifier un paramètre du sous-type

Introduction à JDBC. Accès aux bases de données en Java

ASP.NET MVC 4 Développement d'applications Web en C# - Concepts et bonnes pratiques

RMI le langage Java XII-1 JMF

Gestion du cache dans les applications ASP.NET

Java DataBaseConnectivity

Utilisation d objets : String et ArrayList

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architectures web/bases de données

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Programmer en JAVA. par Tama

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Comptabilité - USR. Logiciel : Comptabilité USR - Version 2,16 Documentation réalisée par JJ Gorge Trésorier Tir à l'arc le 04/04/ / 15

Formulaires et Compteurs

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

WebSSO, synchronisation et contrôle des accès via LDAP

Programmation Internet Cours 4

TrueCrypt : installation et paramétrage

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

< Atelier 1 /> Démarrer une application web

I. Introduction aux fonctions : les fonctions standards

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Authentification avec CAS sous PRONOTE.net Version du lundi 19 septembre 2011

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

(structure des entêtes)

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Sommaire Accès via un formulaire d'identification... 4 Accès en mode SSO... 5 Quels Identifiant / mot de passe utiliser?... 6

Plateforme PAYZEN. Définition de Web-services

Situation présente et devis technique

TD3: tableaux avancées, première classe et chaînes

TP JAVASCRIPT OMI4 TP5 SRC

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Réseaux. 1 Généralités. E. Jeandel

L3 informatique TP n o 2 : Les applications réseau

Serveur d'archivage 2007 Installation et utilisation de la BD exist

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Mysql. Les requêtes préparées Prepared statements

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Master d Informatique Corrigé du partiel novembre 2010

INF8007 Langages de script

Extended communication server 4.1 : VoIP SIP service- Administration

Mobyt Intégration HTTP TABLE DES MATIERES

Manuel d'utilisation d'apimail V3

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Option site e-commerce

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Attaques de type. Brandon Petty

Exercices INF5171 : série #3 (Automne 2012)

Les solutions de paiement CyberMUT (Crédit Mutuel) et CIC. Qui contacter pour commencer la mise en place d une configuration de test?

Guide de démarrage rapide

OPTENET DCAgent Manuel d'utilisateur

Guide d interfaçage SSO Connexion des ressources aux plates-formes de type Corrélyce. Sommaire. Titre du document

Initiation à html et à la création d'un site web

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

DOM - Document Object Model

Programme Compte bancaire (code)

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Les sites Internet dynamiques. contact : Patrick VINCENT pvincent@erasme.org

Mobyt Intégration par Webservice TABLE DES MATIERES

Cours Programmation Système

Projet de programmation (IK3) : TP n 1 Correction

LES GRANDES ETAPES DE CREATION D UN WEB DESIGN

Sage CRM. Sage CRM 7.3 Guide du portable

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Obtention via HTTP des fichiers PDF générés par le service de SMS/MMS certifiés

STID 2ème année : TP Web/PHP

Transcription:

Utilisation des classes de PourCGI par Michel Michaud, version 2002-11-23 Les fichiers PourCGI.h et PourCGI.cpp rendent disponibles deux classes et une fonction libre qui permettent de faire facilement des applications CGI simples (les demandes doivent être pour des pages HTML). Une classe s'occupe de l'accès aux paramètres en unifiant les diverses possibilités de CGI. Elle permet en plus d'empêcher les accès concurrents aux données. L'autre classe permet de copier et compléter facilement des fichiers HTML pour les réponses aux requêtes. La fonction libre s'occupe de faire respecter le protocole HTTP pour la réponse. Les classes sont prévues pour fonctionnement sous Windows avec le Serveur Web personnel (Personal Web Server, PWS) ou Internet Information Server (IIS). Elles n'ont pas été testées dans un autre environnement. Classe ClInfoCGI La classe ClInfoCGI permet d accéder facilement aux paramètres reçus, indépendamment de la méthode d envoi (post ou get) et du type d'encodage 1 utilisé. Les formulaires envoyés devraient contenir un champ caché (<input type="hidden"...) ayant un name="requete", avec un attribut value qui permettra de déterminer l'opération demandée par le formulaire spécifique (s'il y a plusieurs possibilités). Il ne faut déclarer qu'une seule variable de ce type (qu'on passe en paramètre par référence constante au besoin). Fonctions membres principales ClInfoCGI(const std::string& p_nomficsemaphore="semaphore.txt"); Le constructeur s occupe de trouver les paramètres et d'en normaliser l accès. Au besoin, la fonction DemarrerReponseHTTP est appelée. Par défaut, mais on peut spécifier un autre nom de fichier, le fichier "semaphore.txt" est ouvert et gardé ouvert pendant l'exécution du programme afin d'empêcher des accès concurrents aux données; il est fermé mais n'est pas détruit à la fin de l'exécution.. (voir Gestion des erreurs) std::string Requete(); Cette fonction renvoie la valeur du paramètre "Requete". std::string ValeurStringDe(const std::string& p_nomparam); char ValeurCharDe(const std::string& p_nomparam); int ValeurIntDe(const std::string& p_nomparam); long ValeurLongDe(const std::string& p_nomparam); double ValeurDoubleDe(const std::string& p_nomparam); Ces fonctions renvoient la valeur du paramètre demandé dans un des types de base. Si on demande une valeur numérique d un paramètre qui est simplement du texte, la valeur 0 est renvoyée. La valeur en char renvoie simplement le premier caractère ou '\0' si la valeur est vide. bool EstUnChar(const std::string& p_nomparam); bool EstUnInt(const std::string& p_nomparam); bool EstUnLong(const std::string& p_nomparam); bool EstUnDouble(const std::string& p_nomparam); Ces fonctions renvoient true si la valeur du paramètre peut être convertie sans perte ni débordement dans le type demandé par les fonctions ValeurTypeDe. Gestion des erreurs Il y a trois types d'erreurs qui sont gérés par la classe ClInfoCGI : l'exécution du programme sans CGI, le content-type non supporté et l'échec de l'ouverture du fichier sémaphore. Dans les trois cas, le pseudo paramètre Erreur contiendra un message approprié, qu'on peut obtenir directement par la fonction spéciale std::string Erreur() ou par ValeurStringDe("Erreur"). 1 Seuls les types de contenu standards sont supportés, enctype="text/plain" n'est pas supporté. Pour les requêtes post, on peut donner enctype="multipart/formdata" ou enctype="application/x-www-form-urlencoded", ce dernier étant la valeur par défaut, moins efficace pour les formulaires contenant beaucoup de données. Les requêtes get sont toujours en url encoded. En général, on devrait employer des post en formdata pour les formulaires. 1

La fonction membre bool EnCGI(); permet de vérifier que le programme a bien été exécuté dans un contexte CGI. Si ce n'est pas le cas, le pseudo-paramètre Erreur est le seul à contenir une valeur et il vaudra «Appel du programme sans CGI.». Si le type de contenu n'est pas accepté, le pseudo-paramètre Erreur est le seul à avoir une valeur et il vaudra «enctype inconnu (attention, text/plain non supporté).». Si l'ouverture du fichier sémaphore ne réussit pas, le constructeur ressayera jusqu'à 100 fois, en mettant un temps d'attente aléatoire entre les essais, ce qui totalisera entre 10 et 30 secondes. S'il ne réussit pas à ouvrir le fichier malgré tout, il lève une exception de type ClInfoCGI::ClSemaphoreNonObtenu et le paramètre Erreur vaudra «Système occupé, opération annulée pour prévenir les accès concurrents.». Si le programme ne s'occupe pas de l'exception, le destructeur de la classe enverra automatiquement une page HTML simple indiquant que le système est occupé et qu'il faut réessayer plus tard. Par contre, si le programme traite l'exception et veut envoyer une page HTML personnelle en conséquence, il faudra appeler la fonction membre Annuler() pour éviter que le message automatique ne soit envoyé aussi. Autres fonctions membres int NbParametres(); Renvoie le nombre de paramètres, y compris "Requete" et "Erreur" le cas échéant. std::string Nom(int p_noparam); Renvoie le nom d'un paramètre selon son numéro. La liste est en ordre lexical et numérotée à partir de 0. void AfficherListeDesValeurs(); Cette fonction est surtout utile pendant le débogage. Elle fait apparaître la liste de tous les paramètres, noms et valeurs, en ordre lexical sous la forme "nom" = "valeur". Le texte est affiché dans un bloc <samp></samp>, un paramètre par ligne et le deux items (nom et valeur) sont encodées avec ClCopieHTML::EncodeHTML avant l'affichage (voir plus loin). Classe ClCopieHTML La classe ClCopieHTML permet de compléter et renvoyer des fichiers HTML en réponse aux requêtes CGI. Le principe consiste à faire un fichier HTML complet à l'exception des parties (segment) qui doivent être complétées selon les données courantes lors de la requête. On note ces segments du fichier sous la forme [[[NomDuSegment]]]. La classe permet de recopier facilement le fichier jusqu'à un tel segment et permet de savoir le nom des segments à compléter. Fonctions membres de base ClCopieHTML(const std::string& p_nomfichier); Ce constructeur ouvre le fichier HTML indiqué; il peut contenir des segments à compléter sous la forme [[[NomDuSegment]]]. Si le fichier n est pas accessible, un message HTML à cet effet est automatiquement renvoyé. Au besoin, la fonction DemarrerReponseHTTP est appelée. bool Transcrire(); Cette fonction transcrit ou continue de transcrire le fichier HTML jusqu au prochain segment à compléter. Elle renvoie true pour indiquer qu il y a un segment à compléter, false si la transcription est terminée. std::string NomSegment(); Cette fonction renvoie le nom du segment (sans les []) qui a fait arrêter la dernière transcription. 2

Autres fonctions membres static std::string EncodeHTML(std::string p_texte); Cette fonction peut être utilisée lors de l'écriture des données des segments s'il est possible que les données contiennent des codes HTML qu'on ne veut pas voir interprétés. La valeur de retour ne contient pas de & ni de < : ils sont remplacés par les codes & et < respectivement. static std::string EncodeURL(std::string p_texte); Cette fonction peut être utilisée lors de l'écriture des données des segments s'il faut composer un URL et qu'il est possible que les données contiennent des caractères invalides dans ceux-ci. La valeur de retour contient l'encodage url de ces caractères (un % suivi du code hexadécimal du caractère). Fonction DemarrerReponseHTTP void DemarrerReponseHTTP(); La fonction libre DemarrerReponseHTTP est disponible si on veut faire tout le traitement manuellement, elle s occupe simplement d envoyer la séquence initiale nécessaire pour la réponse HTTP. Il est inutile d appeler manuellement cette fonction si on utilise ClInfoCGI ou ClCopieHTML. EXEMPLES Programme simple (sans ClCopieHTML) montrant les paramètres d'un formulaire cout << "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" " \"http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd\">\n" "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" "<head><title>informations sur le formulaire soumis</title>\n" "</head>\n" "<body>\n"; if (! infocgi.erreur().empty()) cout << "<h1>erreur : " << infocgi.erreur() << "</h1>\n"; if (infocgi.nbparametres()!= 0) cout << "<h1>liste de tous les paramètres reçus</h1>\n" "<p>\n"; infocgi.afficherlistedesvaleurs(); cout << "</p>\n"; cout << "<hr />\n" "</body>\n" "</html>"; Note : les \n qui sont écrits ne sont pas nécessaires, mais, au besoin, ils permettent de visualiser plus agréablement le code HTML produit. 3

Structure typique du programme principal pour CGI ayant plusieurs fonctions possibles if (infocgi.requete() == "Ajout") AjouterMachin(infoCGI); if (infocgi.requete() == "Liste") AfficherListeDesMachins(infoCGI); AfficherPageErreur(); Fonction transcrivant un fichier HTML complet void AfficherPageErreur() ClCopieHTML copieur("erreur.html"); copieur.transcrire(); // On suppose qu'il n'y a pas de segment... Fonction transcrivant un fichier HTML à compléter void AfficherListeDesMachins(const ClInfoCGI& p_infocgi) ClCopieHTML copieur("liste.html"); while (copieur.transcrire()) string nomsegment= copieur.nomsegment(); if (nomsegment == "DateDemandée") cout << p_infocgi.valeurstringde("date"); if (nomsegment == "Liste") if (NbDeMachins() == 0) cout << "<tr><td colspan=\"2\">" << "Aucun machin inscrit à la date demandée</td></tr>"; for (int i= 0; i!= NbDeMachins(); ++i) cout << "<tr><td>" << ClCopieHTML::EncodeHTML(Machin(i).description) << "</td><td>" << Machin(i).quantite << "</td></tr>"; assert(false); // Un segment non prévu! 4

Fichier HTML (Liste.html), utilisé dans la fonction précédente <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>liste des machins inscrits</title> </head> <body> <h1>liste des machins inscrits</h1> <h2>en date du [[[DateDemandée]]]</h2> <table border="1"> <tr><th>description</th><th>quantité en stock</th></tr> [[[Liste]]] </table> <p><a href="moncgi.exe?requete=liste">refaire la liste</a></p> <p><a href="default.html">retour à la page d'accueil</a></p> </body> </html> Programme principal avec gestion complète des erreurs d'accès concurrent try if (infocgi.requete() == "Ajout") AjouterMachin(infoCGI); if (infocgi.requete() == "Liste") AfficherListeDesMachins(infoCGI); AfficherPageErreur(); catch (ClInfoCGI::ClSemaphoreNonObtenu) AfficherQuOnReessayeraPlusTard(); infocgi.annuler(); Utilisation avec VC 6 Il est conseillé de copier localement les fichiers PourCGI.h et PourCGI.cpp, puis d'inclure le fichier d'en-tête par #include "PourCGI.h". On devrait donc l'inclure après tous les fichiers standards (entre < >). De plus, il faut ajouter PourCGI.cpp au projet (l'ouvrir et demander une compilation, VC propose l'ajout). 5