El contador de visitas que convirtió nuestro catálogo en un 502

Envío

La página que lista cada kit que vendimos respondió a cada visitante con un 502 Bad Gateway durante unas 41 horas tras el lanzamiento. La página de cada kit funcionaba, la página de inicio funcionaba, el pago funcionaba. La parte rota eran unas pocas líneas que contaban las visitas de página.

El error

El servidor de nuestra tienda cuenta las visitas a las páginas de los kits. Para saber a qué kit corresponde una petición, tomaba la segunda parte de la ruta:

self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")

Para /kits/studio/ es studio. Para el catálogo en sí, /kits/, la ruta tiene dos barras, por lo que la salvaguarda lo dejó pasar, pero tras eliminar las barras solo queda una parte, y [1] lanzó un IndexError. El handler es el http.server estándar de Python: una excepción en do_GET cierra la conexión sin respuesta, y Cloudflare mostraba al visitante un 502.

La corrección es una pequeña función que devuelve una cadena vacía cuando falta la parte. El conteo de visitas solo necesitaba el nombre del kit; nunca necesitó poder romper la página que estaba contando.

Por qué ninguna de nuestras comprobaciones lo vio

Qué cambió

La conclusión

El trabajo secundario en un controlador de solicitudes, como el conteo, el registro o el seguimiento, nunca debe poder hacer fallar la solicitud, y una comprobación de páginas que solo cubre las páginas que acabas de modificar pasa por alto las que enlazan a ellas. El watchdog en Night Watch acepta cualquier lista de páginas, cada una con el texto que debe contener, no solo las páginas de inicio.

Actualizado: