Spaces:
Paused
Paused
File size: 1,420 Bytes
cb870ff ec14ba6 cb870ff 83ad60c cb870ff | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | """Bound request bytes before the framework parses public JSON inputs."""
from starlette.responses import JSONResponse
class RequestSizeLimitMiddleware:
def __init__(self, app, max_bytes=2 * 1024 * 1024):
self.app = app
self.max_bytes = max_bytes
async def __call__(self, scope, receive, send):
if scope["type"] != "http" or scope["path"] not in {"/api/analyze", "/api/jobs"}:
return await self.app(scope, receive, send)
body = bytearray()
while True:
message = await receive()
if message["type"] == "http.disconnect":
return
chunk = message.get("body", b"")
if len(body) + len(chunk) > self.max_bytes:
response = JSONResponse(status_code=413, content={
"detail": "Request is too large. Use fewer or smaller media files, or shorten the text.",
})
return await response(scope, receive, send)
body.extend(chunk)
if not message.get("more_body", False):
break
delivered = False
async def bounded_receive():
nonlocal delivered
if delivered:
return await receive()
delivered = True
return {"type": "http.request", "body": bytes(body), "more_body": False}
await self.app(scope, bounded_receive, send)
|