Devoir Réseau - 2001-2002
Aspirateur de site

© D. Mathieu  mathieu@romarin.univ-aix.fr - M.  Laporte - C. Pain-Barre
I.U.T.d'Aix en Provence - Département Informatique

Donné le : lundi  07/01/2002 (St Raymond),
A rendre au plus tard le : Vendredi 01/02/2002 (Ste Ella) à 17h15 au secrétariat.

Consulter régulièrement les Remarques


Sommaire

Sujet : Aspirateur de site
Site Web
Serveur Web
Client Web
Protocole HTTP
Aspirateur de site
Les liens en HTML
Liens internes
Liens locaux - chemins absolus - chemins relatifs
Liens externes
Les images dans les pages HTML
Format de l'interrogation du serveur par le client
Format de la réponse du serveur
Quelques pistes
Construction de l'arborescence
Récupération de la home page
Récupération des balises dans un fichier HTML
Analyse des URL et des liens
Structure de l'application


Sujet : Aspirateur de site

Site Web

     Pour commencer, on peut donner d'un site Web la définition simplifiée suivante : c'est un ensemble de fichiers organisés selon une arborescence, à partir d'un répertoire que nous appellerons la racine du site.

Serveur Web

    Il est hébergé sur une machine, appelée la machine hôte, sur laquelle tourne un programme serveur, dont le service est appelé http (hypertext transfer protocol) correspondant normalement au numéro de port 80. Les fichiers que nous considèrerons ici sont de deux sortes :     En principe, la page principale d'un site, appelée home page, a pour nom standard index.html (ou parfois default.html), mais cela n'a rien d'obligatoire. Elle est située dans le répertoire racine du site. Un serveur peut gérer plusieurs sites, chacun est une sous-arborescence d'un arbre dont la racine est elle-même un répertoire du système de fichiers de la machine hôte. La racine du serveur est notée / et la hiérarchie réelle au-dessus de cette racine est totalement cachée aux utilisateurs extérieurs.

Client Web

    Un utilisateur qui veut consulter un site utilise généralement un programme client standard, appelé navigateur (ou butineur ...) ou browser. L'utilisateur donne à l'application cliente (le navigateur) une adresse (appelée URL : Uniform Resource Location) comme par exemple :
 
http://duo.iut.univ-aix.fr/~mathieu/index.html

que l'on peut décomposer en :
 
http:// nom du service (ou du protocole) utilisé. Ce protocole utilise lui-même TCP, donc fonctionne en mode connecté.
duo.iut.univ-aix.fr nom de la machine hôte
/~mathieu/ nom du répertoire racine du site, immédiatement placé sous la racine / du serveur 
index.html nom de la home page

Protocole HTTP

    Nous présentons succinctement ici le fonctionnement du protocole HTTP 1.0. L'application cliente analyse et décompose cette URL, établit une connexion (TCP) avec la machine hôte du serveur (duo.iut.univ-aix.fr dans l'exemple), lui envoie un message TCP (voir plus loin) lui demandant de lui renvoyer un fichier (ici /~mathieu/index.html). le serveur le renvoie (s'il existe) et referme la connexion.

    Dans la pratique, le client commence par vérifier s'il n'a pas déjà stocké localement ce fichier, dans son répertoire cache. De plus, il arrive fréquemment que, pour des raisons de sécurité ou d'efficacité, le client passe par un serveur intermédiaire (proxy) qui se charge de faire la requête à sa place, de récupérer le résultat et de le lui renvoyer. Au passage, le serveur proxy peut très bien avoir lui-même ce fichier dans ses caches.

    L'application cliente analyse le fichier reçu, l'affiche à l'écran, répertorie chaque fichier complémentaire de la page (en particulier les images), et, par une succession de requêtes identiques à la précédente, rapatrie l'ensemble, qu'il affiche au fur et à mesure. Il nécessite donc autant de connexions TCP qu'il y a de fichiers à rapatrier. Dans la version HTTP 1.1, une seule connexion permet le transfert de plusieurs fichiers, mais nous ne l'utiliserons pas dans le devoir pour des raisons de simplicité.

Aspirateur de site

    Un "aspirateur de site" est un programme qui recopie localement (sur votre disque dur) un site Web. En principe, l'utilisateur lui indique :     Tout en recopiant tous les fichiers qui constituent le site, l'application reconstitue localement la totalité de l'arborescence. Pour cela, elle utilise deux sortes d'informations contenues dans chaque fichier qu'elle rapatrie, et qui ont été signalés plus haut :
  • les liens, références locales à d'autres pages du site ou externes, vers d'autres sites.
  • les références aux images à positionner dans la page.
  • Les liens en HTML

        Dans une page HTML, les liens apparaissent la plupart du temps dans la balise <a> [2][3]. Ils représentent trois types de références, qui apparaissent entre les guillemets de l'attribut href="" de la balise. Un texte est associé à ce lien, délimité par la balise de fin de lien </a>.

    Liens internes

        Comme leur nom l'indique, ils permettent, lorsque l'utilisateur clique sur le texte qui leur est associé, de positionner l'affichage de la page courante sur un index repéré par son identificateur. Ainsi, au début du fichier source (HTML) de cette page-ci (dans le sommaire), on peut voir la ligne :
     
    <a href="#Sujet">Sujet : Aspirateur de site</a>

        L'affichage de la page HTML fait apparaître le texte : Sujet : Aspirateur de site

        La référence interne a pour identificateur Sujet et se reconnaît par le caractère # qui la précède.

        les liens internes ne correspondent pas à des fichiers, ils peuvent être ignorés par l'aspirateur de site.

    Liens externes

        Ce sont des liens qui font référence à des pages d'un autre site. La référence est alors l'URL complète, comme par exemple :
     
    <a href="http://www.gnu.org/software/libc/libc.html">The GNU C Library : site officiel </a>

    qui apparaît ainsi :

    The GNU C Library : site officiel

        En principe, ces liens désignant des fichiers externes au site, devraient pouvoir être ignorés par l'aspirateur. En réalité, ils peuvent référencer un fichier du site copié, comme par exemple :
     
    <a href="http://duo.iut.univ-aix/fr/~mathieu/CoursInfo/Reseau2/Devoirs-Tests/Devoir01/Sujet.html">
    Sujet du devoir de reseau
    </a>

        Dans ce cas les fichiers correspondants doivent être rapatriés.

    Liens locaux - chemins absolus - chemins relatifs

        Les liens locaux font référence à des fichiers de la même machine (pas forcément du même site que celui de la page courante). Ils indiquent un nom de fichier, éventuellement précédé d'un chemin relatif ou absolu.

        Considérons les références suivantes :
     
    <a href="Remarques.html">Remarques et complements</a>

    <a href="../../../C++1/index.html">Sommaire du module C++</a>

    <a href="/~mathieu/index.html">Home page</a>
    <a href="~mathieu/index.html">Home page</a>

    qui apparaissent ainsi au lecteur (les deux dernières lignes sont équivalentes) :

    Remarques et compléments

    Sommaire du module C++

    Home page

        Le premier désigne un fichier dans le même répertoire que la page qui le référence. Le deuxième désigne un fichier qui est dans une branche adjacente de l'arborescence du fichier. Le troisième désigne un fichier qui est à la racine du site aspiré (si le site aspiré est ~mathieu).

        Tous ces fichiers sont bien entendu à rapatrier.

        Pour finir, on peut aussi trouver des références à des fichiers de sites différents, mais sur la même machine. Soit les deux références suivantes :
     
    href="/gif/picto.gif"

    <a href="/~cpb/tp1.html/a>

        Si elles ont été trouvées dans une page de mon site, les fichiers correspondants ne doivent pas être aspirés. La première fait référence au fichier picto.gif du répertoire gif qui est lui-même à la racine du serveur (et non du site aspiré).

    Les images dans les pages HTML

        Dans un fichier HTML, les images apparaissent     Les références à des fichiers images apparaissent     Voici quelques exemples de références à des fichiers images :

    Format de l'interrogation du serveur par le client

        La forme la plus simple de cette interrogation est d'envoyer au serveur, sur la socket connectée, la suite de caractères suivante :
     
    GET nom_du_fichier HTTP/1.0

    suivie de deux fois la séquence (caractère  "Fin de ligne" suivi du caractère "Retour Chariot") correspondant respectivement en C à '\r' et '\n'.

        Le nom du fichier doit être l'adresse absolue du fichier (avec le chemin) à partir de la racine du serveur (et non du site). HTTP/1.0 indique la version du protocole utilisé.

    Format de la réponse du serveur

        Le serveur renvoie un entête, suivi de deux fois la séquence (caractère  "Fin de ligne" suivi du caractère "Retour Chariot"), suivi du contenu du fichier, après quoi il ferme la socket. Voici un exemple de l'entête reçu :
     
    HTTP/1.1 200 OK
    Date: Sat, 22 Dec 2001 17:50:25 GMT
    Server: Apache/1.3.12 (Unix)  (Red Hat/Linux) PHP/3.0.15 mod_perl/1.21
    Last-Modified: Tue, 11 Dec 2001 07:10:08 GMT
    ETag: "19480e-a15-3c15b150"
    Accept-Ranges: bytes
    Content-Length: 2581
    Connection: close
    Content-Type: text/html

    <HTML>^M
    <HEAD>^M
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">^M
    <META NAME="Generator" CONTENT="Microsoft Word 97">^M
    <TITLE>Index g&eacute;n&eacute;ral</TITLE>^M
    </HEAD>^M

        Tout l'entête peut être ignoré, à part la première ligne qui indique le protocole supporté par le serveur (ici HTTP 1.1), et surtout un compte rendu de l'opération sous la forme d'un code numérique : toute valeur entre 200 et 299 correspond à un succès, toute autre valeur traduit un échec. On connaît bien l'erreur : 404 not found !!!

    Quelques pistes

        Il est évident que, pendant la mise au point du devoir, vous ne devez pas essayer d'aspirer de gros sites, pour plusieurs raisons :

    Construction de l'arborescence

         Vous pouvez par exemple prendre pour cible l'un de mes sous-répertoires (http://duo.iut.univ-aix.fr/~mathieu/CoursInfo/ADA/index.html) ou http://duo.iut.univ-aix.fr/~laporte/CoursInfo/ADA1/TP/TP_Task.html ou ce que vous voudrez.

        De plus vous ne devriez pas recopier les fichiers mais seulement les créer vides, ou à la rigueur avec un petit contenu (par exemple seulement les balises contenant des liens vers d'autres fichiers du site). Si l'arborescence est correctement restituée, c'est que l'aspirateur fonctionne probablement correctement.

        Vous pouvez réaliser cette partie indépendamment, par exemple en utilisant un fichier de travail dans lequel vous aurez indiqué quelques noms et chemins de fichiers.

        Un fichier déjà chargé ne doit pas l'être de nouveau si un nouveau lien sur lui apparaît. Une solution provisoire consiste à vérifier si le fichier existe, mais elle est très lente. La meilleure solution est de conserver la liste complète des fichiers déjà téléchargés.

    Récupération de la home page

        C'est la première étape "réseau", dans laquelle l'application se contente d'afficher à l'écran la page source HTML qu'elle reçoit du serveur. Elle peut être réalisée en parallèle avec les étapes ci-dessus.

    Récupération des balises dans un fichier HTML

        Une partie du test de C++ du 10 mars 2001 était consacré à la récupération et à l'affichage des balises d'une page HTML. Le corrigé peut être utilisé pour extraire les balises intéressantes de la home page.

    Analyse des URL et des liens

        Dans le site copié, tous les liens locaux doivent être relatifs, ce qui permet de déplacer tout le site en changeant seulement sa racine. Cela nécessite que tous les liens dits externes mais qui pointent en réalité sur le même site soient transformés en liens relatifs.

        Il sera bon de se doter de petits outils permettant de manipuler ces liens : extraire les noms de fichiers, les chemins relatifs ou absolus, etc.

    Structure de l'application

        Chaque fichier contenant des références à d'autres fichiers, l'application peut-elle être récursive ?

        Le site représentant une arborescence, les identificateurs des répertoires et des fichiers doivent-ils être eux-mêmes stockés dans un arbre ?

        Chaque fichier à rapatrier nécessitant une connexion, est-il souhaitable de paralléliser au maximum l'application,



    [1] Les pages HTML que nous présentons ici sont dites "statiques" : ce sont de véritables fichiers textes, qui peuvent être créés et modifiés par n'importe quel éditeur de texte.

        De plus en plus de sites utilisent des "pages HTML dynamiques". Elles se diférencient des précédentes par le fait qu'elles sont partiellement ou totalement virtuelles : elles peuvent ne pas apparaître dans l'arborescence du site ! Lorsque le serveur reçoit d'un client la requête d'une telle page, il transmet cette requête à une application spécialisée. Celle-ci génère la page (souvent à partir d'informations stockées dans une base de données) et la renvoie au serveur (redirection de la sortie standard ...) qui la renvoie lui-même au client.

        Ainsi, le client reçoit bien une page HTML classique, mais qui n'a qu'une durée de vie éphémère, et qui n'est pas stockée physiquement sur la machine hôte du serveur.

    [2] En HTML, la casse (majuscules/minuscules) des balises n'a pas d'importance. Ainsi, les balises <br>, <bR>, <Br> et <BR> sont les mêmes. Cependant, lorsqu'elles contiennent certains identificateurs, la casse peut être importante. C'est en particulier le cas des chemins et noms de fichiers, qui auront à être communiqués au système d'exploitation.

    [3] A comme Anchor : ancrage

    © D. Mathieu    mathieu@romarin.univ-aix.fr
    I.U.T.d'Aix en Provence - Département Informatique