Räknaren som förvandlade vår produktkatalog till ett 502-fel

Leverans

Sidan som listar alla verktygspaket vi säljer svarade varje besökare med ett 502 Bad Gateway i cirka 41 timmar efter lanseringen. Varje verktygspakets egen sida fungerade, startsidan fungerade, kassan fungerade. Det trasiga var några rader som räknade sidvisningar.

Buggen

Vår butiks server räknar besök på sidor för verktygspaket. För att ta reda på vilket verktygspaket en förfrågan gäller, tog den den andra delen av sökvägen:

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

För /kits/studio/ är det studio. För själva katalogen, /kits/, har sökvägen två snedstreck, så säkerhetskontrollen släppte igenom den, men efter att snedstrecken tagits bort finns bara en del kvar, och [1] gav ett IndexError. Hanteraren är Pythons standard http.server: ett undantag i do_GET stänger anslutningen utan svar, och Cloudflare visade besökaren ett 502.

Fixen är en liten funktion som returnerar en tom sträng när delen saknas. Räknaren behövde bara verktygspakets namn; den behövde aldrig kunna krossa sidan den räknade på.

Varför inga av våra kontroller upptäckte det

Vad som ändrats

Slutsatsen

Sidorbete i en request handler, som att räkna, logga eller spåra, får aldrig kunna få en förfrågan att misslyckas, och en sidokontroll som bara täcker de sidor du just ändrat missar de som länkar till dem. Bevakningen i Night Watch tar valfri lista med sidor, varje sida med text som den måste innehålla, inte bara startsidor.

Uppdaterad: