Projet No 2 : un validateur d'URL et d'email performant

Proposé par : Michel Buffa

Réalisé par : Didier Albet Florent Bouvier

Outils utilisés : C++, script CGI(shell), interface HTML

exécutable C++ : ~fbouvier/Internet/All/valid

script CGI : ~albet/Internet/cgi-bin/valid.cgi

page HTML : ~albet/Internet/Docs/valid.html


Travail réalisé

Détails d'implémentation

Utilisation


Travail réalisé

L'application que nous avons concue permet de valider des URLs et des adresses email. Il est possible de fixer divers paramètres de configuration :

  • nombre d'essais de l'URL ou de l'adresse avant de la déclarer invalide.
  • timeout : durée maximale autorisée pour le test de validation (connexion et récupération du header).
  • divers modes d'affichages.
  • s'il s'agit d'une URL, parser la page correspondante et valider les URL et adresses.

Le résultat obtenu dépendra des options choisies et du mode d'affichage utilisé. Celui-ci permet différents format de sortie. On peut obtenir le résultat sous forme brute (ASCII) ou sous forme d'une page HTML, le premier étant le format par défaut.

Si l'application est exécutée en mode parse (quel que soit le mode d'affichage utilisé), on peut aussi spécifier si l'on désire avoir des statistiques sur toutes les adresses rencontrées. C'est-à-dire le pourcentage d'adresses valides de la page, celles dont le serveur n'existe plus, celles qui ont été déplacées... Ces statistiques seront affichées selon le format de sortie spécifié, à la suite du résultat de chaque adresse de la page. Par défaut les adresses de la page sont affichées les unes sous les autres avec le résultat de la validation inscrit à coté de chacune d'elles. Toutefois on peut les afficher dans un tableau si l'on est en mode de sortie HTML. Notons que l'utilisation conjointe de cette option avec celle d'affichage des statistiques permet aussi d'afficher celles-ci dans sous forme de tableau.

On peut aussi obtenir le fichier HTML de la page. Cette fonction n'a pas grand intérêt en soit, elle est en fait utilisée en interne par le programme lors d'un appel en mode parse. Nous l'avons quand même laissée ici.

Il est à noter que le mode d'affichage peut à son tour dépendre du mode d'exécution de l'application. En effet, celle-ci peut soit être utilisée à partir du shell, soit directement appelée d'une page HTML, avec l'aide d'un script CGI. Cette dernière méthode ne peut évidemment afficher ses résultats qu'en HTML.


Détails d'implémentation

PARSING d'une page html

Le parsing permet de récupérer les urls et adresses mails d'une page html grâce à la reconnaissance des 2 tags suivants :

  • A HREF = " ... "
  • FRAME SRC = " ... "
Ce parsing est bien évidemment conforme à la syntaxe HTML puisqu'il :
  • est case insensitive A HREF a HreF ...
  • neglige les espaces pouvant apparaitre a l'interieur d'un élément
    A    HREF   =     " M  a     i  L t O : ... "
  • identifie une url ou adresse mail qu'elle soit entre guillemets ou non
    A HREF = " url "
    ou
    A HREF = url

Avant de passer l'url à la fonction de validation, plusieurs taches sont réalisées :
  • effacement des sections pouvant apparaitre à l'intérieur d'un url :

    toto.html#section1 est transformé en toto.html

  • transformation des adresses relatives en adresses absolues :

    si l'url page2.html apparait dans la page testée http://www.essi.fr/toto/, page2.html est transformé en http://www.essi.fr/toto/page2.html

    de la même manière, si /tutu/moi.html apparait dans la page, il sera transformé en http://www.essi.fr/tutu/moi.html

  • les urls "raccourcis" sont transformés :

    http:/~jfl/ apparaissant dans la page http://www.essi.fr/ade/gens.html est transformé en http://www.essi.fr/~jlf/


Quelques remarques :
  • le parser ne prend pas en compte les tags IMG SRC...
  • le parser prend en compte des urls pouvant etre en commentaires

Une fois un url recupéré celui ci va être transmis à une routine permettant de lancer la fonction de validation dans un thread. Notre Validateur est donc Multi-Threaded.



fonction de VALIDATION d'un URL ou d'une ADRESSE MAIL

A partir d'une adresse url, une requête est lancée sur le serveur associé sur le port 80 par défaut ; mais sur un port différent si celui ci est mentionné dans l'adresse (www.essi.fr:8080 par exemple).

A partir d'une adresse mail, une requête est lancée sur le port 25 du serveur associé.


Quelques remarques :
  • un code d'erreur particulier est renvoyé pour les protocoles non reconnus : ftp, gopher, wais, news, telnet
  • une adresse mail est testée sur le serveur "finissant" l'adresse (tutu dans le cas toto@tutu.fr) Est-ce toujours le bon serveur de mail ?

Utilisation

Cette application peut soit être utilisée à partir du shell, soit directement dans une page HTML

A partir du shell

L'utilisation en mode de validation d'une seule adresse est basique (mode par défaut). La sortie par défaut est le format ASCII (Option -ascii).

$valid http://www.essi.fr
http://www.essi.fr              200 OK

Limitons le nombre d'essais à 3 (Option -n).
$valid http://www.esssi.fr -n3 
http://www.esssi.fr     Unknown Host

Le timeout est maintenant de 4 secondes.
$valid http://www.essi.fr -t4 (Option -t).
http://www.essi.fr              200 OK

Une adresse email.
$valid fbouvier@essi.fr 
fbouvier@essi.fr                250 

On peut spécifier une sortie sous forme de page HTML. (Option -html).
$valid fbouvie@essi.fr -html
<HTML><BODY BGCOLOR=#FFFFFF><BR><A HREF ="mailto:fbouvie@essi.fr">fbouvie@essi.fr</A>550 fbouvie... User unknown</BODY></HTML>

Remarque : toutes ces options peuvent être utilisées conjointement.

Le tag -print permet d'imprimer la page correspondante, si elle existe, sinon affiche l'erreur.

Le tag -parse permet de passer en mode parse. Les précédentes options -t , -n , -html , -ascii , -print sont encore utilisables. Le nouveau tag -stat permet de disposer de statistiques sur la page parsée.

$valid http://www.essi.fr -parse -stat 
http://www.essi.fr/PO/Fr/sommaire.html          200 OK
http://www.essi.fr/PO/message.html              200 OK
http://www.essi.fr/PO/Fr/sommaire.html          200 OK
http://www.essi.fr/PO/Uk/sommaire.html          200 OK
http://www.unice.fr             200 OK
http://www.unice.fr             200 OK
Statistiques
------------
etat            %
----            -
URL OK          100

Pour terminer, le tag -tab affiche les résultats html sous forme d'un tableau. Cette option est inactive lorsque l'on est en mode normal (non parse) et/ou lorsque l'affichage est ascii. De plus, l'affichage des statistiques est aussi fait sous forme de tableau si ces deux options sont sélectionnées.

L'utilisation par un script CGI va par exemple lancer la commande shell suivante :

$valid http://www.essi.fr/~buffa/ -parse -stat -tab -n2 -t3 -html

Exemple de resultat en mode parse