Un Serveur HTTP de date et CGI

Transcription

Un Serveur HTTP de date et CGI
Un Serveur HTTP de date et CGI PeiP2 : Introduction au Web Dino López, Benjamin Miraglio et 1. Introduction CGI (Common Gateway Interface) est défini dans le RFC3875 comme une interface simple pour exécuter un programme externe, logiciel ou passerelle sous un serveur d’information et de manière autonome à l’infrastructure sous-­‐jacente. Le serveur d’information étant actuellement les serveurs HTTP. L’objectif des exercices proposés dan ce TP est donc de vous montrer la manière dont le serveur HTTP est structuré afin de vous proposer le service CGI et avoir une première aperçu des pages web dynamiques. 2. Vers la création d’un serveur CGI En accord à la définition de CGI donné dans la section précédente, pour avoir un système CGI dans un serveur, celui-­‐ci doit permettre l’exécution un programme et renvoyer au client la réponse. Le serveur de date créé dans le dernier TP ne peut pas encore être considéré comme un système CGI puisque pour obtenir la date, nous faisons appel au code natif du serveur (i.e. pas d’exécution d’un logiciel externe). 1. C’est pour cela que dans cette version du serveur (appelée ServeurWeb2), vous devrez légèrement modifier le serveur précédent, afin qu’il renvoie toujours la date sauf si l’URL demandée est « /mon-­‐cgi/xxxx.sh ». Dans ce dernier cas, on exécutera le script shell « xxxx.sh », qui se trouvera forcement dans le dossier ~/mon-­‐cgi/, et on rendra au client la sortie du script tel qu’il a été produit par le script. De ce fait, la première ligne de l’en-­‐tête HTTP (e.g. « HTTP/1.0 200 OK ») sera donné par le serveur lui-­‐même, mais la suite viendra uniquement et exclusivement du script shell (e.g. une ligne contenant le bon mimetype, une ligne vide, puis le corps de la réponse du script). Pour tester votre serveur CGI, vous utiliserez le script shell appelé « lavachedit.sh ». Pour information, le script utilise la commande « cowsay », que vous pouvez installer avec la commande « # apt-­‐get install cowsay ». Avant de continuer, répondez à la question, comment retrouver au niveau du serveur si la ressource demandée par le navigateur firefox contient la chaine de caractères « /mon-­‐
cgi/xxxx.sh » ? La seule question qui reste est « comment exécuter une commande externe en Java ? ». Pour cela, on utilisera la classe Runtime (de java.lang), qui permet de créer un objet de type Process grâce à la méthode exec(). Lorsqu'un nouveau processus est créé et exécuté, la sortie (standard) de l'objet de type Process pourra être récupérée avec la méthode getInputStream(). waitFor() est une méthode qui permet d'attendre la fin de l'exécution du nouveau processus avant de continuer. try {
Process myp = Runtime.getRuntime().exec("ls -l /tmp");
myp.waitFor(); // attention, cette attente peut bloquer si la
commande externe rencontre un problème
String line = null;
BufferedReader in = new BufferedReader(new
InputStreamReader(myp.getInputStream()));
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
System.out.println("error");
} Listing 1. Exécution de la commande externe « ls –l /tmp » depuis Java 2. Modifiez votre programme pour qu’un titre « La Vache Dit » soit affiché. Faite également le nécessaire pour que le reste soit affiché en mode preformaté (voir balise <pre>). Vous devez changer le mimetype de la réponse que vous produisez pour text/html. 3. Modifiez votre serveur pour que les paramètres envoyés par la méthode GET soient envoyés vers le script shell à exécuter. Vous devez donc accepter des URLs de la forme /mon-­‐
cgi/xxxx.sh?var1=val1&var2=val2. Pour tester votre serveur, modifiez le script lavachedit.sh afin qu’il reçoit 2 ou 4 arguments : l’argument impair indique le nom de la variable à modifier dans le script (variable « mode » ou « text ») tandis que l’argument paire indique la valeur à donner à cette variable là (mode=talk ou mode=think, et text=Ce que la vache doit dire ou penser). Lancé en ligne de commande, le script pourrait être lancé des manières suivantes « $ lavachedit.sh "mode" "think" » ou « $ lavachedit.sh "mode" "talk" "text" "Bonjour !" ». Si le mode est « talk », vous utiliserez la commande « cowsay » à l’intérieur de votre script shell. Si le mode est égal à « think », vous utiliserez la commande « cowthink » à la place de « cowsay ». Testez votre serveur avec les URL « mon-­‐cgi/lavachedit.sh?text=Un test » ou « mon-­‐cgi/lavachedit.sh?mode=think » ou n’importe quelle combinaisons de ces paramètres. 4. On décide d’être un peu plus restrictif et de gérer la demande des ressources non-­‐
disponibles. Votre serveur affichera donc la date que si l’URL est /date ou l’exécution d’un CGI uniquement si le script existe. Dans tous les autres cas, vous renverrez une erreur (code de retour « HTTP/1.0 404 Not Found »). En plus du code d'erreur renvoyé au navigateur, prévoyez d'afficher un joli message en html (inspirez-­‐vous de ce qui est fait sur d’autres sites quand on essaie d’accéder à une URL incorrecte). Dans ce cas, vous construirez une réponse qui aura un mimetype text/html.