CSI 3540 - Laboratoire 1

solution
solution

* Objectifs

  - Se familiariser avec les concepts sous-jacents du Web
  - Savoir créer des messages requête HTTP
  - Savoir lire les messages réponse HTTP
  - Se familiariser avec les codes réponse HTTP

  Une connaissance détaillée du protocole HTTP vous permettra de
  comprendre la nature des échanges d'information entre le client
  (navigateur) et le serveur (httpd). Ces concepts seront essentiels
  lors des discussions sur les témoins de session.

* Contenu du laboratoire

  - Concevoir un client HTTP

    Pour cette partie du laboratoire, vous devez concevoir un outil de
    débogage.  Cet outil devra:

    -- Établir une connection TCP avec un serveur
    -- Transmettre un message requête formulé par l'utilisateur
    -- Afficher le message réponse du serveur

    Vous pouvez consultez ce tutoriel afin vous familiariser avec
    les connections de bas niveau : All About Sockets.

    Une version minimaliste de cet outil obtiendrait le nom logique de
    l'hôte sur la ligne de commande. Ferait la lecture du message HTTP
    requête sur l'entrée standard. Transmettrait le message au
    serveur. Finalement, afficherait sur la sortie standard le message
    HTTP réponse.

    Étant donné la simplicité du protocole et sa structure en deux
    étapes, envoi du message requête, réception du message réponse,
    vous n'aurez à créer des filins concurrents et à vous préoccuper de
    la synchronisation.
  
    > java Client www.site.uottawa.ca
    GET / HTTP/1.1
    HOST: www.site.uottawa.ca

    Server: HTTP/1.1 200 OK
    Date: Wed, 20 Jan 2010 18:15:04 GMT
    Server: Apache/2.0.59 (FreeBSD) PHP/5.1.6 with Suhosin-Patch mod_ssl/2.0.59 OpenSSL/0.9.7e-p1
    Last-Modified: Mon, 07 Dec 2009 14:17:10 GMT
    ETag: "114d1b-1a1-1cf3e580"
    Accept-Ranges: bytes
    Content-Length: 417
    Connection: close
    Content-Type: text/html
 
    <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
    <html>
    ...

    Si vous préférez les applications graphiques, voici ma proposition.

    Capture d'écran

    Si vous le souhaitez, vous pouver utiliser cette coquille comme
    point de départ. Vous n'aurez qu'à implémenter la méthode submit. 
    (demandez la clé à votre démonstrateur)

    JClient.java

    Voci une version complète du client (demandez la clé à votre
    démonstrateur) :

    JClient.java
    manifest.mf
    JClient.jar (une application double-clique)

    Ajoutez un entête 'Connection: close' à vos messages afin que
    le serveur ferme la connexion immédiatement et que l'outil
    affiche le message rapidement.

    Voici un tutoriel plus avancé, où l'on utilise plusieurs filins
    d'exécution: Socket Communications.

  - Un peu d'exploration

    Pour cette partie, utilisé l'outil de débogage développé ci-dessus
    (ma version ou la vôtre), ou encore l'application telnet afin
    d'établir une connexion brute TCP avec des serveurs Web.

    L'étudiant joue le rôle du client, il doit formater lui-même les
    messages requêtes en suivant le protocole de la couche application
    HTTP.

    Revoir la forme générale d'un message requête

    Ligne de commande
    En-tête(s)
    [ Ligne vide ]
    Corps du message (possiblement vide)

    La ligne de commande est formée de trois éléments séparés par des
    blancs: commande, URI, version
   
    Revoir la forme générale d'un message réponse

    Ligne de statut
    En-tête(s)
    [ Ligne vide ]
    Corps du message (possiblement vide)

    Exercices:

    -- Un exemple GET à l'aide d'une URL valide et d'un message bien formé.

    -- Explorez deux variantes de cet exemple: avec l'entête 'Connection: close',
       puis 'Connection: keep-alive'.

    -- Un exemple où le nom de l'hôte utilisé pour la connexion
       diffère du nom de l'hôte de l'entête 'Host:'.

    -- Un exemple où la ressource n'existe pas. Quel est le code de la réponse?

    -- Un exemple où la réponse du serveur comprend une redirection

       Le but de ces deux exemples est d'observer les différents
       codes de statut émis par le serveur.

       Gmail fait un re-direct

       telnet www.gmail.com 80
       GET / HTTP/1.1
       HOST: www.gmail.com

       Voici les différents codes, essaye de trouver quelques exemples
       qui génèreront d'autres codes (e.g. accès à la ressource refusé).

       Status Code Definitions

    -- Connexion:

    Le site de SITE est parfait pour ces expériences puisque 1) par
    défaut la connexion est 'keep-alive' et 2) le 'time out' est
    long.

    Avec Keep-Alive, on peut faire plusieurs sur une même connexion (pipelining):

    telnet www.site.uottawa.ca 80
    GET / HTTP/1.1
    Connection: Keep-Alive
    HOST: www.site.uottawa.ca

    GET /eng/about.html HTTP/1.1
    HOST: www.site.uottawa.ca

    Sinon, il y a rupture de connexion, suite à l'envoi du message réponse:

    telnet www.site.uottawa.ca 80
    GET / HTTP/1.1
    Connection: close
    HOST: www.site.uottawa.ca

    GET /eng/about.html HTTP/1.1
    HOST: www.site.uottawa.ca

    -- Vous devez maintenant concevoir des requêtes autres que GET (HEAD et OPTION, par exemple)

  - NSLOOKUP

    - Quelques tests avec nslook up, par exemple afin de découvrir les
    alias ce certains serveurs, wwww.google.com.

    - Utiliser traceroute (tracert sous Windows) afin de découvrir les
      passerelles utilisées pour la transmission des paquets.

  - Mécanismes d'exclusion

    Si le temps le permet, votre démonstrateur fera une présentation
    des mécanismes d'exclusions de webbots.

* Quelques idées

  - Si vous le souhaitez, à partir des informations que vous trouverez
    dans les tutoriels ci-dessous, vous pourriez concevoir votre
    propre serveur http. Dans un premier temps, concevoir un serveur
    qui ne traite qu'un seul client à la fois. Ensuite, à l'aide de
    filins d'exécution, concevez un serveur qui traite plus requêtes
    simultanément.
  
    > java Serveur répertoire port

    All About Sockets
    Socket Communications