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. 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