Tester avec curl teste autre chose
Une requête de compteur qui arrive sans identifiant de navigateur écrit dans deux des douze endroits qu'une visite comptée touche normalement. Elle répond 200. Elle renvoie une image de compteur valide. Nulle part il n'est dit que dix des douze ont été sautés.
À quoi sert le filtre, et ce qu'il vous coûte
Ici les compteurs séparent les robots des personnes, et la séparation se fait sur l'identifiant que le client donne de lui-même. La liste des marqueurs est courte et volontairement sans ambiguïté, et curl/ y figure. Un identifiant vide aussi, avec le raisonnement qu'une requête sans aucun identifiant n'est pas un navigateur.
Les deux sont justes. Le service n'a pas tort de traiter un curl nu comme un robot ; c'en est un. Le problème, c'est que la personne derrière le curl ne vérifie généralement pas si la détection des robots fonctionne. Elle vérifie si le comptage fonctionne — et elle a discrètement demandé le chemin des robots.
Ce qu'elle obtient : le total du jour monte de un, la colonne des robots monte de un, et c'est tout. Aucune ligne de visiteur unique, donc rien sur les visiteurs. Aucune entrée dans la liste des présents. Aucune page, aucun pays, aucun navigateur, aucun système, aucun appareil, aucune heure. Précisément les parties qu'on voulait vérifier sont celles qui n'ont pas tourné.
L'échec n'a pas de symptôme
C'est la partie sur laquelle il vaut la peine de s'attarder. Un test qui ne mesure rien se signale d'habitude : une erreur, un résultat vide, un zéro là où devrait être un nombre. Ici la réponse est 200. Le corps est une vraie image de compteur, 3 361 octets. Le nombre dans l'image a même augmenté, car le total du jour est l'une des deux choses qui se sont produites.
La sonde a donc l'air d'être passée. Tout ce qui en découle — « le chemin de comptage fonctionne », « la nouvelle colonne est écrite », « la modification n'a rien cassé » — est une conclusion tirée d'une exécution qui a sauté l'essentiel du code qu'elle devait éprouver.
C'est arrivé pendant la rédaction
La première version de la mesure derrière ce billet demandait /c/<numéro>. Ce n'est pas l'adresse d'une image de compteur ; la vraie porte le modèle et une extension, /c/<numéro>-<modèle>.png. La requête a renvoyé 404.
Le script a affiché trois fois : écrit dans 0 des 12 endroits. Ce qui est vrai, et ce qui ressemble exactement à un filtre à robots qui fonctionne si on plisse les yeux. Le 404 était dans le même tableau, une ligne au-dessus des zéros. Il est resté non lu une minute, parce que les zéros étaient la partie intéressante et qu'ils correspondaient à ce qui était attendu.
C'est la même erreur que celle dont parle ce billet, un étage plus haut : une mesure qui a produit une réponse plausible pour une raison que personne n'a vérifiée. Elle n'a été prise que parce que le script compte des lignes dans douze tables au lieu de faire confiance à la requête — une requête qui échoue et une requête filtrée se ressemblent vues de l'extérieur.
Quoi faire à la place
Envoyer un identifiant de navigateur. Une option, -A avec une vraie chaîne, et la même requête écrit dans dix des douze endroits au lieu de deux.
Et compter de l'autre côté. Le code de réponse dit que la requête est arrivée ; il ne dit pas ce qu'elle a fait. Partout où l'intérêt est l'effet de bord — un compteur, une file, une ligne de journal, une ligne quelque part — la sonde doit regarder l'effet. Compter avant et après dans chaque table concernée a coûté ici vingt lignes et a transformé deux fois un résultat ambigu en résultat net : une fois pour le filtre, une fois pour le 404.
Deux des douze endroits sont restés vides même avec un identifiant de navigateur : la colonne des robots, à juste titre, et la liste des référents, qui n'a pas enregistré le référent envoyé. Ce second point n'est pas expliqué ici, parce qu'il n'a pas encore été poursuivi. Il est rapporté parce que l'alternative serait de montrer un tableau de onze lignes en disant douze.