Skip to content

ADR-167: HealthBypassMiddleware ignoriert request.method (POST→200) — Divergenz zu @require_GET + risk-hub Shim (405) #312

@achimdehnert

Description

@achimdehnert

Problem

Die HealthBypassMiddleware (ADR-167) in packages/platform-context prüft in process_request nicht request.method:

def process_request(self, request):
    if request.path in self.HEALTH_PATHS:
        return HttpResponse("ok", content_type="text/plain")
    return None

Damit liefert jede Methode (auch POST/PUT/DELETE) auf /livez/ und /healthz/ ein 200. Das @require_GET auf den eigentlichen Health-Views wird nie erreicht.

Divergenz (in risk-hub aufgefallen)

risk-hub hat einen lokalen Fallback-Shim (src/common/middleware.py), der nur GET/HEAD kurzschließt — POST fällt durch auf @require_GET405. Dadurch entsteht ein Drei-Wege-Split für POST /healthz/:

Env aktive Middleware POST /healthz/
prod (Docker, platform-context aus git) Paket 200
CI (uv.lock, älterer Pin ohne Klasse) Shim 405
lokal dev (iil-platform-context 0.7.0) Paket 200

Folge: Tests, die POST→405 annehmen, werden in CI grün, behaupten aber etwas, das in prod (200) nicht gilt. (risk-hub PR #138 ist genau hierüber gestolpert; dort jetzt mit status_code in (200, 405) entschärft.)

Zu klärende Vertragsfrage (ADR-167)

Sollen Health-Endpoints non-GET ablehnen (405) oder immer 200 antworten?

  • Variante A — immer 200: @require_GET auf den Views ist hinter der Paket-Middleware totes Codeteil und sollte entfernt/dokumentiert werden; der Shim sollte ebenfalls jede Methode kurzschließen (Angleichung).
  • Variante B — non-GET = 405: Paket-Middleware muss request.method in ("GET","HEAD") prüfen (wie der Shim); sonst weicht prod vom dokumentierten Verhalten ab.

In beiden Fällen: Paket-Middleware und risk-hub-Shim angleichen, damit CI- und prod-Verhalten identisch sind.

Betroffen

  • packages/platform-context (HealthBypassMiddleware)
  • mind. risk-hub (Shim + Health-Views); per Drift-Notiz potenziell auch cad-hub / writing-hub (ADR-167-Konsumenten)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions