Testar com curl testa a coisa errada
Um pedido de contador que chega sem identificador de navegador escreve em dois dos doze sítios que uma visita contada normalmente toca. Responde 200. Devolve uma imagem de contador válida. Em lado nenhum diz que dez dos doze foram saltados.
Para que serve o filtro e o que custa
Aqui os contadores separam robôs de pessoas, e a separação faz-se pelo identificador que o cliente dá de si próprio. A lista de marcas é curta e propositadamente inequívoca, e curl/ está nela. Um identificador vazio também, com o raciocínio de que um pedido sem identificador nenhum não é um navegador.
As duas coisas estão certas. O serviço não erra ao tratar um curl nu como robô; é o que ele é. O problema é que quem conduz o curl normalmente não está a verificar se a detecção de robôs funciona. Está a verificar se a contagem funciona — e pediu em silêncio o caminho dos robôs.
O que recebe: o total do dia sobe um, a coluna dos bots sobe um, e é tudo. Nenhuma linha de visitante único, portanto nada sobre visitantes. Nenhuma entrada na lista de quem está online. Nenhuma página, nenhum país, nenhum navegador, nenhum sistema, nenhum aparelho, nenhuma hora. Precisamente as partes que se queriam verificar são as que não correram.
A falha não tem sintoma
É a parte em que vale a pena demorar. Um teste que não mede nada costuma anunciar-se: um erro, um resultado vazio, um zero onde devia estar um número. Aqui a resposta é 200. O corpo é uma imagem de contador a sério, 3.361 bytes. O número na imagem até subiu, porque o total do dia é uma das duas coisas que aconteceram.
A sonda parece portanto ter passado. Tudo o que daí decorre — «o caminho de contagem funciona», «a coluna nova está a ser escrita», «a alteração não partiu nada» — é uma conclusão tirada de uma execução que saltou a maior parte do código que devia exercitar.
Aconteceu enquanto se escrevia isto
A primeira versão da medição por detrás deste artigo pedia /c/<número>. Esse não é o endereço de uma imagem de contador; o verdadeiro leva o modelo e uma extensão, /c/<número>-<modelo>.png. O pedido devolveu 404.
O script escreveu três vezes: escreve em 0 de 12 sítios. O que é verdade, e que é também exactamente o aspecto de um filtro de bots a funcionar, se se semicerrarem os olhos. O 404 estava na mesma tabela, uma linha acima dos zeros. Ficou por ler durante um minuto porque os zeros eram a parte interessante e batiam certo com o que se esperava.
É o mesmo erro de que trata este artigo, um andar acima: uma medição que deu uma resposta plausível por um motivo que ninguém verificou. Só foi apanhado porque o script conta linhas em doze tabelas em vez de acreditar no pedido — um pedido que falha e um pedido filtrado, vistos de fora, são iguais.
O que fazer em vez disso
Enviar um identificador de navegador. Uma opção, -A com um identificador verdadeiro, e o mesmo pedido escreve em dez dos doze sítios em vez de dois.
E contar do outro lado. O código de resposta diz que o pedido chegou; não diz o que fez. Sempre que o que interessa é o efeito secundário — um contador, uma fila, uma linha de registo, uma linha algures — a sonda tem de olhar para o efeito. Contar antes e depois em cada tabela envolvida custou aqui vinte linhas e transformou duas vezes um resultado ambíguo num resultado claro: uma para o filtro, outra para o 404.
Dois dos doze sítios ficaram vazios mesmo com identificador de navegador: a coluna dos bots, com razão, e a lista de referências, que não registou a referência enviada. Este segundo não é explicado aqui porque ainda não foi perseguido. É relatado porque a alternativa seria mostrar uma tabela de onze linhas e dizer doze.