Coverage for node / src / stigmem_node / body_limit.py: 92%
19 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-06-18 05:34 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-06-18 05:34 +0000
1"""Request body-size limit middleware (F-AVAIL-1).
3Rejects requests whose declared ``Content-Length`` exceeds the configured cap
4before the body is read or parsed, bounding memory use from a single request.
5``settings.max_request_body_bytes == 0`` disables the check.
6"""
8from __future__ import annotations
10from typing import Any
12from starlette.middleware.base import BaseHTTPMiddleware
13from starlette.requests import Request
14from starlette.responses import JSONResponse
16from .settings import settings
19class BodySizeLimitMiddleware(BaseHTTPMiddleware):
20 """Return 413 when ``Content-Length`` exceeds ``max_request_body_bytes``."""
22 async def dispatch(self, request: Request, call_next: Any) -> Any:
23 limit = settings.max_request_body_bytes
24 if limit > 0:
25 raw = request.headers.get("content-length")
26 if raw is not None:
27 try:
28 declared = int(raw)
29 except ValueError:
30 declared = -1
31 if declared > limit:
32 return JSONResponse(
33 status_code=413,
34 content={
35 "detail": f"request body exceeds {limit} bytes",
36 "max_request_body_bytes": limit,
37 },
38 )
39 return await call_next(request)