Лічильник переглядів, який перетворив наш каталог на 502

Доставка

Сторінка, де перелічені всі набори, що ми продаємо, відповідала кожному відвідувачу помилкою 502 Bad Gateway приблизно 41 годину після запуску. Сторінки окремих наборів працювали, головна сторінка працювала, оформлення замовлення працювало. Зламаною виявилася частина з кількох рядків коду, що рахувала перегляди сторінок.

Помилка

Сервер нашого магазину рахує відвідування сторінок наборів. Щоб визначити, до якого набору належить запит, він брав другу частину шляху:

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

Для /kits/studio/ це studio. Для самого каталогу, /kits/, шлях містить два слеші, тому захист пропустив його, але після видалення слешів залишається лише одна частина, і [1] викликав IndexError. Обробник — це стандартний http.server у Python: виняткова ситуація в do_GET закриває з'єднання без відповіді, і Cloudflare показував відвідувачу 502.

Виправлення — це одна невелика функція, яка повертає порожній рядок, коли частина відсутня. Лічильнику переглядів потрібна була лише назва набору; він ніколи не повинен був ламати сторінку, яку рахував.

Чому жодна з наших перевірок це не помітила

Що змінилося

Головний висновок

Побічна робота в обробнику запитів, наприклад підрахунок, логування чи відстеження, ніколи не повинна зривати запит, а перевірка сторінок, що охоплює лише ті, які ви щойно змінили, пропускає ті, що посилаються на них. Вартовий у Night Watch приймає будь-який список сторінок, кожна з яких має містити заданий текст, а не лише головні сторінки.

Оновлено: