Licznik wyświetleń, który zamienił nasz katalog w błąd 502

Wysyłka

Strona z listą wszystkich zestawów, które sprzedajemy, odpowiadała każdemu odwiedzającemu błędem 502 Bad Gateway przez około 41 godzin po starcie. Strony poszczególnych zestawów działały, strona główna działała, płatności działały. Uszkodzone były tylko kilka linii kodu liczących wyświetlenia stron.

Błąd

Serwer naszego sklepu liczy wizyty na stronach zestawów. Aby ustalić, którego zestawu dotyczy żądanie, pobierał drugą część ścieżki:

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

Dla /kits/studio/ jest to studio. Dla samego katalogu, /kits/, ścieżka zawiera dwa ukośniki, więc zabezpieczenie ją przepuściło, ale po usunięciu ukośników pozostaje tylko jedna część, a [1] zgłaszało wyjątek IndexError. Obsługą zajmuje się standardowy moduł Pythona http.server: wyjątek w do_GET zamyka połączenie bez odpowiedzi, a Cloudflare wyświetlał odwiedzającemu błąd 502.

Poprawka to jedna mała funkcja, która zwraca pusty ciąg znaków, gdy brakuje tej części. Licznik wyświetleń potrzebował tylko nazwy zestawu; nigdy nie powinien był powodować awarii strony, którą liczył.

Dlaczego żadna z naszych kontroli tego nie wykryła

Co się zmieniło

Wniosek

Praca poboczna w obsłudze żądania, taka jak zliczanie, logowanie czy śledzenie, nigdy nie powinna powodować błędu żądania, a kontrola stron obejmująca tylko te właśnie zmienione pomija te, które do nich linkują. Watchdog w Night Watch przyjmuje dowolną listę stron, z których każda musi zawierać określony tekst, a nie tylko strony główne.

Zaktualizowano: