Der Aufrufer, der unseren Katalog in einen 502 verwandelte

Versand

Die Seite, die alle Kits auflistet, die wir verkaufen, antwortete nach dem Launch etwa 41 Stunden lang jedem Besucher mit einem 502 Bad Gateway. Die einzelnen Kit-Seiten funktionierten, die Startseite funktionierte, der Checkout funktionierte. Das kaputte Teil waren ein paar Zeilen, die die Seitenaufrufe zählten.

Der Fehler

Der Server unseres Shops zählt Besuche auf Kit-Seiten. Um herauszufinden, für welches Kit eine Anfrage bestimmt ist, wurde der zweite Teil des Pfads verwendet:

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

Für /kits/studio/ ist das studio. Für den Katalog selbst, /kits/, hat der Pfad zwei Schrägstriche, also ließ ihn die Sicherheitsregel durch, aber nach dem Entfernen der Schrägstriche gibt es nur noch einen Teil, und [1] löste einen IndexError aus. Der Handler ist Pythons Standard-http.server: Eine Ausnahme in do_GET schließt die Verbindung ohne Antwort, und Cloudflare zeigte dem Besucher einen 502 an.

Die Lösung ist eine kleine Funktion, die einen leeren String zurückgibt, wenn der Teil fehlt. Die Zählung der Seitenaufrufe brauchte nur den Namen des Kits; sie musste nie die Seite zum Absturz bringen, die sie zählte.

Warum keine unserer Prüfungen es sah

Was sich geändert hat

Das Fazit

Nebenaufgaben in einem Request-Handler wie Zählen, Protokollieren oder Tracking dürfen die Anfrage niemals fehlschlagen lassen, und eine Seitenprüfung, die nur die gerade geänderten Seiten abdeckt, übersieht die Seiten, die auf sie verlinken. Der Watch in Night Watch akzeptiert eine beliebige Liste von Seiten, jede mit dem Text, den sie enthalten muss, nicht nur Startseite.

Aktualisiert: