瀏覽代碼

add `max_payload_size` param to aiohttp and fastapi backends

wangweimin 2 年之前
父節點
當前提交
d91815356e
共有 2 個文件被更改,包括 17 次插入4 次删除
  1. 10 3
      pywebio/platform/aiohttp.py
  2. 7 1
      pywebio/platform/fastapi.py

+ 10 - 3
pywebio/platform/aiohttp.py

@@ -9,6 +9,7 @@ from urllib.parse import urlparse
 
 from aiohttp import web
 
+from . import page
 from .adaptor import ws as ws_adaptor
 from .page import make_applications, render_page
 from .remote_access import start_remote_access_service
@@ -16,7 +17,7 @@ from .tornado import open_webbrowser_on_server_started
 from .utils import cdn_validation, print_listen_address
 from ..session import register_session_implement_for_target, Session
 from ..session.base import get_session_info_from_headers
-from ..utils import get_free_port, STATIC_PATH
+from ..utils import get_free_port, STATIC_PATH, parse_file_size
 
 logger = logging.getLogger(__name__)
 
@@ -125,7 +126,7 @@ def _webio_handler(applications, cdn, websocket_settings, reconnect_timeout=0, c
 
 
 def webio_handler(applications, cdn=True, reconnect_timeout=0, allowed_origins=None, check_origin=None,
-                  websocket_settings=None):
+                  max_payload_size='200M', websocket_settings=None):
     """Get the `Request Handler <https://docs.aiohttp.org/en/stable/web_quickstart.html#aiohttp-web-handler>`_ coroutine for running PyWebIO applications in aiohttp.
     The handler communicates with the browser by WebSocket protocol.
 
@@ -139,6 +140,9 @@ def webio_handler(applications, cdn=True, reconnect_timeout=0, allowed_origins=N
 
     websocket_settings = websocket_settings or {}
 
+    page.MAX_PAYLOAD_SIZE = max_payload_size = parse_file_size(max_payload_size)
+    websocket_settings.setdefault('max_msg_size', max_payload_size)
+
     cdn = cdn_validation(cdn, 'error')
 
     if check_origin is None:
@@ -170,10 +174,12 @@ def start_server(applications, port=0, host='', debug=False,
                  reconnect_timeout=0,
                  allowed_origins=None, check_origin=None,
                  auto_open_webbrowser=False,
+                 max_payload_size='200M',
                  websocket_settings=None,
                  **aiohttp_settings):
     """Start a aiohttp server to provide the PyWebIO application as a web service.
 
+
     :param dict websocket_settings: The  parameters passed to the constructor of ``aiohttp.web.WebSocketResponse``.
        For details, please refer: https://docs.aiohttp.org/en/stable/web_reference.html#websocketresponse
     :param aiohttp_settings: Additional keyword arguments passed to the constructor of ``aiohttp.web.Application``.
@@ -192,7 +198,8 @@ def start_server(applications, port=0, host='', debug=False,
     cdn = cdn_validation(cdn, 'warn')
 
     handler = webio_handler(applications, cdn=cdn, allowed_origins=allowed_origins, reconnect_timeout=reconnect_timeout,
-                            check_origin=check_origin, websocket_settings=websocket_settings)
+                            check_origin=check_origin, max_payload_size=max_payload_size,
+                            websocket_settings=websocket_settings)
 
     app = web.Application(**aiohttp_settings)
     app.router.add_routes([web.get('/', handler)])

+ 7 - 1
pywebio/platform/fastapi.py

@@ -12,13 +12,14 @@ from starlette.routing import Route, WebSocketRoute, Mount
 from starlette.websockets import WebSocket, WebSocketState
 from starlette.websockets import WebSocketDisconnect
 
+from . import page
 from .page import make_applications, render_page
 from .remote_access import start_remote_access_service
 from .tornado import open_webbrowser_on_server_started
 from .utils import cdn_validation, OriginChecker, print_listen_address
 from ..session import register_session_implement_for_target, Session
 from ..session.base import get_session_info_from_headers
-from ..utils import get_free_port, STATIC_PATH, strip_space
+from ..utils import get_free_port, STATIC_PATH, strip_space, parse_file_size
 
 logger = logging.getLogger(__name__)
 from .adaptor import ws as ws_adaptor
@@ -148,6 +149,7 @@ def start_server(applications, port=0, host='', cdn=True, reconnect_timeout=0,
                  static_dir=None, remote_access=False, debug=False,
                  allowed_origins=None, check_origin=None,
                  auto_open_webbrowser=False,
+                 max_payload_size='200M',
                  **uvicorn_settings):
     """Start a FastAPI/Starlette server using uvicorn to provide the PyWebIO application as a web service.
 
@@ -178,6 +180,10 @@ def start_server(applications, port=0, host='', cdn=True, reconnect_timeout=0,
     if remote_access:
         start_remote_access_service(local_port=port)
 
+    page.MAX_PAYLOAD_SIZE = max_payload_size = parse_file_size(max_payload_size)
+    uvicorn_settings = uvicorn_settings or {}
+    uvicorn_settings.setdefault('ws_max_size', max_payload_size)
+
     uvicorn.run(app, host=host, port=port, **uvicorn_settings)