Problem
Endpoints accept Content-Type: text/plain; Pydantic may silently parse.
Why
Loose content types enable param smuggling via alternate encodings.
Outcome
Middleware returns 415 for non-JSON/multipart. Multipart exempted.
Acceptance
Files
app/middleware/content_type.py (NEW)
app/main.py
Problem
Endpoints accept
Content-Type: text/plain; Pydantic may silently parse.Why
Loose content types enable param smuggling via alternate encodings.
Outcome
Middleware returns 415 for non-JSON/multipart. Multipart exempted.
Acceptance
Files
app/middleware/content_type.py(NEW)app/main.py