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