# API Rate Limiting: lokale HTTP-Fixture

Python 3.10 oder neuer, nur Standardbibliothek. Speichern Sie `run.py` in einem eigenen Verzeichnis:

```sh
python3 run.py > results.json
```

Der Runner startet einen Server auf einem zufälligen Port auf `127.0.0.1`, erzeugt synthetische
Sitzungen und beendet ihn nach den Prüfungen. Er akzeptiert keine Zieladresse und kontaktiert
keinen externen Dienst. Vorhandene Proxy-Umgebungsvariablen werden für diese Loopback-Anfragen ignoriert.

19 Prüfungen: erfolgreiche Kontrollen und Ablehnungen für Authentifizierung/Exportrecht,
Body-Größe und Datensatzanzahl; drei Nutzerplätze, fünf Mandantenplätze; unveränderte Zuordnung
bei gefälschten Headers; unabhängiger zweiter Mandant; Retry-After mit kontrollierter Uhr;
kein Arbeitsstart bei Ablehnung; Fensterwechsel; zehn über eine Barriere gestartete parallele
Anfragen mit genau drei Erfolgen und sieben 429-Antworten. Die Uhr ist kein HTTP-Endpunkt.

## Grenzen

Ein Prozess, feste synthetische Identitäten, Zähler im Speicher, fester Fensterschnitt.
Keine produktive Authentifizierung, verteilten Zähler, TTL-Bereinigung, Persistenz, Lastprüfung,
Warteschlange, DDoS-Abwehr oder echte Kostenabrechnung. Am Fensterwechsel sind Bursts möglich.
Python `http.server` dient hier ausschließlich der lokalen Demonstration, nicht dem Produktivbetrieb.

Der gespeicherte Lauf `results-2026-09-28.json` enthält Python-Version, Zeitpunkt, Einzelprüfungen
und SHA-256 von `run.py`. Ein neuer Lauf aktualisiert diese veröffentlichte Datei nicht automatisch.
Quelltext und Anleitung sind unter der beiliegenden MIT-Lizenz nutzbar. Der Artikel und die
obhut-Marke sind nicht Teil dieser Freigabe.
