|
|
from fastapi import HTTPException |
|
|
from loguru import logger |
|
|
|
|
|
from langflow.services.deps import get_settings_service |
|
|
|
|
|
|
|
|
class MaxFileSizeException(HTTPException): |
|
|
def __init__(self, detail: str = "File size is larger than the maximum file size {}MB"): |
|
|
super().__init__(status_code=413, detail=detail) |
|
|
|
|
|
|
|
|
|
|
|
class ContentSizeLimitMiddleware: |
|
|
"""Content size limiting middleware for ASGI applications. |
|
|
|
|
|
Args: |
|
|
app (ASGI application): ASGI application |
|
|
max_content_size (optional): the maximum content size allowed in bytes, None for no limit |
|
|
exception_cls (optional): the class of exception to raise (ContentSizeExceeded is the default) |
|
|
""" |
|
|
|
|
|
def __init__( |
|
|
self, |
|
|
app, |
|
|
): |
|
|
self.app = app |
|
|
self.logger = logger |
|
|
|
|
|
def receive_wrapper(self, receive): |
|
|
received = 0 |
|
|
|
|
|
async def inner(): |
|
|
max_file_size_upload = get_settings_service().settings.max_file_size_upload |
|
|
nonlocal received |
|
|
message = await receive() |
|
|
if message["type"] != "http.request" or max_file_size_upload is None: |
|
|
return message |
|
|
body_len = len(message.get("body", b"")) |
|
|
received += body_len |
|
|
if received > max_file_size_upload * 1024 * 1024: |
|
|
|
|
|
received_in_mb = round(received / (1024 * 1024), 3) |
|
|
msg = ( |
|
|
f"Content size limit exceeded. Maximum allowed is {max_file_size_upload}MB" |
|
|
f" and got {received_in_mb}MB." |
|
|
) |
|
|
raise MaxFileSizeException(msg) |
|
|
return message |
|
|
|
|
|
return inner |
|
|
|
|
|
async def __call__(self, scope, receive, send): |
|
|
if scope["type"] != "http": |
|
|
await self.app(scope, receive, send) |
|
|
return |
|
|
|
|
|
wrapper = self.receive_wrapper(receive) |
|
|
await self.app(scope, wrapper, send) |
|
|
|