TP1 Applications web M1 Miage 2010-2011 : étude du protocole HTTP

De $1

Version de 19:24, 19 Avr 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

Introduction

Ce TP a pour but de vous faire comprendre la nature du dialogue entre un navigateur et un serveur web. Le langage d'échange est le protocole HTTP. Il est très simple d'écrire un serveur web minimaliste, vous allez vous en rendre compte en simulant ce qu'envoie un navigateur web à un serveur à l'aide de divers outils tels que telnet ou netcat (commande "nc" de unix).

Outils nécessaires à ce TP

Si vous êtes sous Linux, vous n'avez théoriquement besoin de rien, toutes les commandes sont disponibles. Si vous êtes sous windows, vous commencerez par installer le package Cygwin, qui pertmet d'installer sur une machine Windows un shell unix ainsi qu'une grande partie des commandes disponibles sous ce système. Cygwin est non seulement une formidable boîte à outils mais il vous permettra également de vous faire la main avec les commandes Unix que vous n'avez généralement pas l'habitude d'utiliser et qui sont pourtant beaucoup plus puissantes que ce que propose l'ancêtre DOS. Ajoutons que la maîtrise des commandes Unix fait partie des prérequis pour certains stages et embauches (parlez-en aux M2 qui sont partis en stage chez Google à New-York cette année, ou aux stagiaires IBM/SAP).

Installation de cygwin sous windows :

  1. Aller sur cygwin.com, localisez le lien vers setup.exe (pour les plus fainéants : http://cygwin.com/setup.exe),
  2. Dans les packages proposés, il faut impérativement sélectionner : inetutils, nc, openssh, wget (cherchez-les et cliquer sur "skip" pour qu'ils soient installés,
  3. Terminez l'installation.
  4. Ouvrez une fenêtre cygwin (vous devriez avoir l'icône sur le bureau), et vérifiez que les commandes telent, nc, ssh, wget sont bien installées.

Jouons au client HTTP avec la commande telnet

Vous allez envoyer des requetes entièrement écrites à la main au serveur, en d'autres termes vous allez simuler un client HTTP. Pendant cette séance vos références principales seront les RFCs du protocole HTTP:

Pour réaliser cette première étape, vous aurez besoin d'un terminal (xterm, gnome-terminal ou konsole sous Linux, cygwin sous windows). Lancez le terminal de votre choix et au prompt taper la commande :

telnet www.unice.fr 80

Le serveur vous répondra :

# telnet www.unice.fr 80
Trying 134.59.1.71...
Connected to www.unice.fr.
Escape character is '^]'.

Vous pouvez alors commencer à envoyer des requêtes au serveur, par exemple :

GET / HTTP/1.0
Accept: www/source
Accept: text/html

 Terminez en tapant deux fois sur la touche Entrée (c'est ainsi qu'on termine une requête HTTP).

Le serveur vous va vous retourner une réponse et se déconnecter. Pour envoyer d'autres commandes, vous devez vous reconnecter avec telnet. Le protocole HTTP est par défaut un protocole "non connecté", je te parle, tu réponds, fin de transmission !

Question 1 Quelles sont les caractéristiques du serveur web de l'université ?

Question 2 Quelles informations tirez-vous de la première réponse du serveur?

Question 3 Essayez la requête suivante sur portail.unice.fr :

GET /jahia/jsp/index.jsp HTTP/1.0
Accept: www/source
Accept: text/html
Host: portail.unice.fr

Hmmm la réponse est bizarre non ? 

Question 4 : qu'en déduisez-vous ?

Question 5 : on veut afficher comme réponse telnet le contenu HTML de la home page du portail de l'université ! Uniquement en vous aidant des réponses à vos requêtes via telnet (vous pouvez tester en omettant les lignes de la requête commençant par Accept et Host), quel est l'URL final qu'il faut envoyer dans le GET pour avoir le source de la vraie page du portail de l'Université ? Alors, d'après-vous, est-ce que le navigateur web fait le même travail que vous venez de faire lorsqu'il interroge portail.unice.fr ?

Jouons au serveur HTTP maintenant avec la commande nc

On va maintenant changer de rôle et jouer au serveur HTTP, pour cela on va utiliser la commande nc (nc pour netcat: un cat sur le réseau. Pour plus d'informations sur cette commande, sous Linux, taper "man netcat", ou la version en ligne : http://www.manpagez.com/man/1/nc/) :

usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
          [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
          [-x proxy_address[:port]] [hostname] [port[s]]

Nc vous permet de simuler un serveur en utilisant l'option -l, par exemple pour lancer un serveur qui écoutera sur le port 12345, vous pouvez utiliser la commande suivante:

nc -l localhost 12345 (sous linux) ou
nc -l -p 12345 localhost (sous windows/cygwin)

... et pour vous connectez à ce serveur vous pouvez utiliser (dans une autre fenêtre) la commande:

telnet localhost 12345

Maintenant que vos deux fenêtres sont ouvertes, dans la fenêtre telnet, tapez des trucs et terminez par Entrée. Que voyez-vous dans la fenêtre "serveur", celle où la commande nc a été utilisée ?

Bon, si tout va bien vous devriez voir l'echo de ce que vous avez envoyé. Telnet est un "client" qui parle à nc qui est un "serveur". Voyons maintenant ce qui se passe lorsque le client est un navigateur web !

Question 6 : connectez-vous au serveur en utilisant le navigateur de votre choix, quelles sont les informations que votre navigateur envoie aux serveurs web sur lesquels vous vous connectez ?

Question 7 : Répondez à la requête du navigateur de sorte à afficher dans la page du navigateur "bonjour". Relisez le support de cours pour trouver des exemples de réponses HTTP. N'oubliez pas de commencer la réponse en précisant le protocole, le code d'erreur etc, puis on entre l'en-tête de réponse (qui peut être vide), puis on saute une ligne (obligatoire) puis on tape la réponse, puis on termine par control-d (unix) ou control-c (cygwin).

Question 8 : Positionnez un Cookie sur le client dans votre réponse suivante. Vous vérifierez avec firefox par exemple, que le cookie a bien été positionné (menu outils/options/vie privée/supprimer des cookies spécifiques)

Question 9 : Envoyez des erreurs avec différents codes de status au client.

Clients et Serveurs HTTP en Java

A RENDRE POUR LA SEMAINE SUIVANTE !

Les fichiers Client.java, Connection.java et Server.java, qui vous sont fournis implémentent un client et un serveur HTTP simples. Récupérez l'archive et créez un projet netbeans ou eclipse (de type "application java") dans lequel vous allez ajouter ces sources.

Question 10 Etudiez les sources. Compilez et testez ces programmes. Une fois le serveur lancé, vous lancerez le client java mais aussi un navigateur web sur l'adresse localhost:8080, par défaut le body de la réponse du serveur est l'echo de la reqête reçue. SI vous voulez-voir la réponse complète, ce n'est possible qu'avec le client java, le navigateur web n'affichant dans sa page que le body de la réponse.

Question 11 Ajoutez une fonctionnalité permettant de positionner des Cookies. Vous vérifierez avec firefox par exemple, que le cookie a bien été positionné (menu outils/options/vie privée/supprimer des cookies spécifiques)

Question 12 Ajoutez une fonctionnalité permettant de renvoyer des codes d'erreurs.

Question 13 Ajoutez une fonctionnalité qui fait que le serveur ne répond qu'à des requêtes de votre navigateur préféré.

Question 14 : Modifiez le code du serveur pour qu'il puisse renvoyer des pages HTML. Par exemple si on tape dans le navigateur "http://localhost:8080/?file=toto.html" et que la page toto.html est à la racine du projet eclipse ou netbeans, le serveur doit renvoyer le bon en-tête et le contenu HTML de la page toto.html dans le body de la réponse, afin que le navigateur web puisse l'afficher correctement.

Question 15 (pour les meilleurs, facultative) : comment gérer les images incluses dans les pages ? Les URLs relatifs ?

Modalités de rendu du TP noté

Vous travaillerez seul ou en binome. Vous préparerez une archive zip ou rar portant comme nom TP1_TechnoWebM1Miage_nom1_nom2 où nom1 et nom2 sont les noms des personnes faisant partie du binome. Lors de la prochaine séance de TP, vous ferez une démonstration à l'enseignant de TP de votre projet et vous lui remettrez (il aura une clé USB) votre projet + une mini doc en .txt ou en .html indiquant les particularités de ce que vous avez fait. L'archive contiendra aussi les pages html de test que vous aurez utilisées.