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

1"""Request body-size limit middleware (F-AVAIL-1). 

2 

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""" 

7 

8from __future__ import annotations 

9 

10from typing import Any 

11 

12from starlette.middleware.base import BaseHTTPMiddleware 

13from starlette.requests import Request 

14from starlette.responses import JSONResponse 

15 

16from .settings import settings 

17 

18 

19class BodySizeLimitMiddleware(BaseHTTPMiddleware): 

20 """Return 413 when ``Content-Length`` exceeds ``max_request_body_bytes``.""" 

21 

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)