Provare con curl prova la cosa sbagliata
Una richiesta di contatore che arriva senza identificativo di browser scrive in due dei dodici posti che una visita contata tocca di solito. Risponde 200. Restituisce un'immagine di contatore valida. Da nessuna parte c'è scritto che dieci dei dodici sono stati saltati.
A che cosa serve il filtro, e che cosa costa
Qui i contatori separano i robot dalle persone, e la separazione avviene sull'identificativo che il client dichiara di sé. L'elenco dei contrassegni è breve e volutamente inequivocabile, e curl/ ci sta dentro. Anche un identificativo vuoto, con il ragionamento che una richiesta senza alcun identificativo non è un browser.
Entrambe le cose sono giuste. Il servizio non sbaglia a trattare un curl nudo come un robot; è quello che è. Il problema è che chi guida il curl di solito non sta verificando se funziona il riconoscimento dei robot. Sta verificando se funziona il conteggio — e ha chiesto in silenzio il percorso dei robot.
Quello che ottiene: il totale del giorno sale di uno, la colonna dei bot sale di uno, e basta. Nessuna riga di visitatore unico, quindi niente sui visitatori. Nessuna voce nell'elenco dei presenti. Nessuna pagina, nessun paese, nessun browser, nessun sistema, nessun dispositivo, nessuna ora. Proprio le parti che si volevano controllare sono quelle che non hanno girato.
Il fallimento non ha sintomi
È la parte su cui vale la pena fermarsi. Una prova che non misura niente di solito si annuncia: un errore, un risultato vuoto, uno zero dove dovrebbe esserci un numero. Qui la risposta è 200. Il corpo è una vera immagine di contatore, 3.361 byte. Il numero nell'immagine è persino salito, perché il totale del giorno è una delle due cose che sono successe.
La sonda sembra quindi passata. Tutto ciò che ne segue — «il percorso di conteggio funziona», «la nuova colonna viene scritta», «la modifica non ha rotto niente» — è una conclusione tratta da un'esecuzione che ha saltato gran parte del codice che doveva mettere alla prova.
È successo mentre lo si scriveva
La prima versione della misura dietro questo articolo chiedeva /c/<numero>. Non è l'indirizzo di un'immagine di contatore; quello vero porta il modello e un'estensione, /c/<numero>-<modello>.png. La richiesta ha risposto 404.
Lo script ha stampato tre volte: scrive in 0 posti su 12. Il che è vero, e che è anche esattamente l'aspetto di un filtro antirobot funzionante, se si socchiudono gli occhi. Il 404 stava nella stessa tabella, una riga sopra gli zeri. È rimasto non letto per un minuto, perché gli zeri erano la parte interessante e coincidevano con l'attesa.
È lo stesso errore di cui parla questo articolo, un piano più su: una misura che ha dato una risposta plausibile per un motivo che nessuno ha verificato. È stato colto solo perché lo script conta righe in dodici tabelle invece di fidarsi della richiesta — una richiesta che fallisce e una che viene filtrata, da fuori, si somigliano.
Che cosa fare invece
Mandare un identificativo di browser. Un'opzione, -A con una stringa vera, e la stessa richiesta scrive in dieci dei dodici posti invece che in due.
E contare dall'altra parte. Il codice di risposta dice che la richiesta è arrivata; non dice che cosa ha fatto. Ovunque il punto sia l'effetto collaterale — un contatore, una coda, una riga di registro, una riga da qualche parte — la sonda deve guardare l'effetto. Contare prima e dopo su ogni tabella coinvolta è costato qui venti righe e ha trasformato due volte un risultato ambiguo in uno netto: una per il filtro, una per il 404.
Due dei dodici posti sono rimasti vuoti anche con l'identificativo di browser: la colonna dei bot, giustamente, e l'elenco dei referrer, che non ha registrato il referrer inviato. Il secondo non viene spiegato qui perché non è ancora stato inseguito. È riportato perché l'alternativa sarebbe mostrare una tabella di undici righe e dire dodici.