TP Noté 2013 : serveur HTTP

Dans ce sujet, nous vous demandons de réaliser deux versions d'un serveur HTTP en utilisant la bibliothèque Java NIO.

Commencez par créer un nouveau projet Java dans votre environnement Eclipse que vous appellez tpnote-VotreNom. Créez aussi dans cette arborescence du projet un fichier readme.txt dans lequel vous mettez vos notes et les réponses aux questions.

Le barème est donné à titre d'indication.

Les exercices sont assortis de questions de compréhension auxquelles vous devez répondre par écrit dans le fichier readme.txt.

En fin de TP :

  1. si ce n'est déjà fait, créez un fichier readme.txt dans lequel vous mettez vos notes à destination des correcteurs ;
  2. exportez votre projet Eclipse sous la forme d'une archive :
  3. télé-chargez le fichier sur moodle afin de fournir le résultat de votre travail ;
  4. vérifiez avec l'enseignant présent dans la salle que le fichier téléchargé est correct.

1 Présentation du sujet

Objectif : complétez des classes qui permettent de réaliser un serveur HTTP simple.

Notre serveur HTTP est très simple. Il est capable de décoder une requête de type GET. Une requête de type GET est constituée d'un ligne contenant le mot GET suivi d'un chemin (URI) correspondant au nom du fichier. Pour faire simple, les noms de fichiers sont traités à partir du répertoire /mci/inf/chris/public_html/.

La première version du protocole traite les requêtes une par une et clôt le canal de connexion après chaque traitement. Elle correspond au protocole 1.0 de HTTP.

2. Récupération de classes

Créez un paquetage www dans votre project Eclipse.

Récupérez les classes suivantes et mettez-les dans le paquetage www :

Récupérez la classe Httpd10Base.java et mettez-la dans le paquetage par défaut.

3. Modification du Worker Httpd10WorkerBase.java (5 pts)

Vous devez modifier le Worker en complétant les TODOs et répondre aux questions.

  1. À la ligne 62, vous devez envoyer le contenu du ByteBuffer writeBuf sur le channel rwChan ;
  2. Entre les lignes 110 et 127, vous devez modifier le code pour que le fichier ouvert soit envoyé sur le channel rwChan.
  3. Expliquez en quelques phrases l'enchaînement des opérations que vous avez réalisé en complétant la classe entre les lignes 110 et 127 initiales.

4. Modification du serveur Httpd10Base (5 pts)

Vous devez modifier le serveur en complétant les TODOs et répondre aux premières questions qui suivent.

  1. Initialisez le channel entre les lignes 34 et 37 ;
  2. Réalisez l'ouverture de la connexion, le traitement de la requête et la fermeture de la connexion entre les lignes 39 et 47 ;
  3. Expliquez la différence entre un ServerSocketChannel et un SocketChannel ;
  4. Quelle opération peut-on faire sur un ServerSocketChannel que l'on ne peut pas faire sur un SocketChannel ?
  5. Quelles opérations peut-on faire sur un SocketChannel que l'on ne peut pas faire sur un ServeurSocketChannel ?

5. Test du serveur

Vous pouvez tester votre serveur soit en utilisant votre navigateur habituel, soit en utilisant telnet comme dans l'exemple suivant :

telnet localhost 2020
GET /index.html HTTP/1.0

Vous devez obtenir une réponse contenant du code HTML, dont l'entête ressemble à ceci :

HTTP/1.0 200 OK
Content-Type: text/html
Content-length: 2741
Connection: close

Si vous essayez avec un fichier qui n'existe pas, par exemple test.htm, vous devez obtenir un résultat ressemblant à :

HTTP/1.0 404 File Not Found 

6. Autres questions sur le serveur Httpd10 réalisé (3 pts)

Une fois que vous avez testé le serveur réalisé à la section précédente, répondez aux questions suivantes :

  1. Ce serveur peut-il être utilisé par plusieurs clients ?
  2. Expliquez la séquence de traitements réalisés par le serveur pour répondre à une requête d'un client ;
  3. En mettant le serveur en mode debug, combien d'ouvertures de connexions sont réalisées pour charger la page index.html du répertoire /mci/inf/chris/public_html ?

7. Maintien des connexions ouvertes (5 pts)

Le serveur précédent ferme les connexions à chaque requête, ce qui pour une page faisant référence à des images sur le même site implique des ouvertures successives de canaux TCP de manière inutile.

Vous allez maintenant réaliser une version de serveur qui accepte de fournir plusieurs contenus sur le même canal ouvert.

Récupérez le squelette de la classe Http11WorkerBase.java et mettez-la dans le paquetage www.

Récupérez la classe Httpd11Base.java et mettez-la dans le paquetage par défaut.

Répondez aux questions suivantes puis réalisez les modifications au niveau des classes :

  1. Puisqu'un worker traite plusieurs requêtes successives d'un client, comment peut-on permettre que plusieurs clients travaillent avec le même serveur ?
  2. Quelles sont les modifications à appliquer au worker ?
  3. Quelles sont les modifications à appliquer au serveur ?

Appliquez ces modifications au code qui vous est fourni.