Spaces:
Running
Running
| 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) | |
| # Adapted from https://github.com/steinnes/content-size-limit-asgi/blob/master/content_size_limit_asgi/middleware.py#L26 | |
| 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: | |
| # max_content_size is in bytes, convert to MB | |
| 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) | |