Aujourd'hui, nous allons nous intéresser de plus près aux différents outputs produits par la fonction CURL.
On cherche notemment à détecter les erreurs possibles au moment de l'aspiration d'une page web afin de pouvoir prendre en compte ce facteur dans une des boucles de notre programme de traitement des URLS.
Pour cela, nous avons d'abord testé depuis le terminal différents cas :
- Erreur de type "pas de connection possible !"
- Erreur de type "adresse URL non valide !"
A) Erreur de type "pas de connection possible !"
On tape la commande suivante dans le terminal pour aspirer le contenu de la page web du cours :
curl http://www.tal.univ-paris3.fr/cours/masterproj.htm -o page-aspiree.html;
(l'option -o permet d'indiquer le fichier dans lequel sera enregistré le contenu aspiré par CURL)
Si tous se passe bien, le terminal affiche des informations sur l'aspiration de la page :
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 99762 100 99762 0 0 1462k 0 --:--:-- --:--:-- --:--:-- 1709k
En revanche, si CURL rencontre un problème, il produit un message d'erreur. Par exemple, si on coupe notre connexion internet et qu'on reproduit l'expérience, on obtient le message suivant dans le terminal :
curl: (6) Could not resolve host: www.tal.univ-paris3.fr; nodename nor servname provided, or not known
Pour tester dans un script si CURL a fonctionné correctement, on peut donc enregistrer le message produit par CURL dans une variable qu'on appelera retourcurl:
curl http://www.tal.univ-paris3.fr/cours/masterproj.htm -o page-aspiree.html;
retourcurl=$?;
echo "Voici la réponse de CURL : $retourcurl";
A partir de ce script, on constate donc que si $retourcurl vaut 0 alors, on peut dire que CURL a bien fonctionné. Si $retourcurl vaut 6 (ou une autre valeur?) alors il y a eu un problème. A partir de cela, on peut écrire un petit programme en bash testant cette condition sur un exemple :
#Aspiration d'une page web du cours
curl http://www.tal.univ-paris3.fr/cours/masterproj.htm -o page-aspiree.html;
#Capture du message produit par CURl dans une variable
retourcurl=$?;
#Test sur la valeur de cette variable
if [ $retourcurl == 0 ]
then
echo "CURL a réussi à aspirer la page WEB.";
else
echo "CURL a échoué.";
fi
Avec ce script, on obtientera dans le terminal un message nous indiquant si CURL a bien fonctionné sur la page web.
B) Erreur de type "l'adresse URL n'est pas valide !"
Lorsqu'on saisi une adresse URL qui n'est pas valide, le navigateur produit automatiquement un message d'erreur. Avec la commande CURL que nous avons tapé dans le terminal, si l'adresse n'existe plus ou bien qu'elle est incorrecte, on aura donc toujours une page HTML en sortie (affichant l'erreur 404). Du coup, dans notre script précédent, la condition $retourcurl == 0 sera bien remplie alors qu'il y a un problème !
Voici le résultat de la page asspirée lorsqu'on insère une erreur dans l'adresse URL du cours :
Et voici le code HTML de cette page :
Grace à la fonction egrep de bash, on peut donc parcourir le contenu du code HTML de la page aspirée afin d'y chercher une occurence de "Error 404" (caractérisitique d'un message d'erreur de ce type).
egrep -io "Error 404" page.html
(la fonction -i permet de ne pas prendre en compte la case et la fonction -o permet de chercher une occurence)
On va alors enregistrer la valeur produite par la fonction egrep dans une variable pour ensuite voir les valeurs qu'elle peut prendre.
#!/bin/bash
curl http://www.tal.univ-paris3.fr/cours/masterproj.htm -o page-aspiree.html;
error404=$(egrep -io "Error 404" page-aspiree.html);
echo "Voici le retour de la fonction egrep : $error404";
Lorsque l'adresse URL est correcte et que CURL fonctionne correctement, la variable error404 ne contient aucune valeur. Lorsque l'erreur 404 se produit, alors $error404 vaut "Error 404".
Voici un test en bash permettant de vérifier si la page aspriée contient une erreur de type 404 :
#!/bin/bash
curl http://www.tal.univ-paris3.fr/cours/masterpro.htm -o page-aspiree.html;
error404=$(egrep -io "Error 404" page-aspiree.html);
if [[ $error404 == "Error 404" ]]
then
echo "La page aspirée contient une erreur de type 404.";
else
echo "La page aspirée est valide.";
fi
Préparation d'un script test sur la fonction CURL
Grâce à ces petites expériences, on peut maintenant proposer un script testant le bon déroulement de l'aspiration d'une page web.
On veut d'abord tester s'il n'y a pas d'erreur de type A puis si c'est le cas, vérifier s'il n'y pas de problème de type B. On a donc le schéma de condition suivant :
Si A ne pose pas problème:
alors on vérifie si B pose problème:
si oui, on affiche que A fonctionne mais que B pose problème
sinon, on affiche que tout fonctionne
sinon on affiche que A pose problème
Pour mettre en oeuvre cela, on va simplement imbriquer les deux scripts test qu'on vient de présenter.
Voici une capture d'écran de notre nouveau script test :
On pourra maintenant reprendre ce script dans une des boucles de notre programme traitant nos fichiers d'URLS. On pourra aussi améliorer les performances de ce script en prenant en compte d'autres types d'erreurs que l'erreur 404...