diff --git a/py2http/default_configs.py b/py2http/default_configs.py index f95bd89..52369ee 100644 --- a/py2http/default_configs.py +++ b/py2http/default_configs.py @@ -255,6 +255,9 @@ def framework_defaults(framework, *, error_handler, output_mapper): "logger": None, "plugins": [], "enable_cors": False, + # Bottle only: max bytes of an in-memory request body (None keeps bottle's 100 KiB). + # A bigger request is answered "413 Request entity too large". + "max_request_size": None, "cors_allowed_origins": "*", "publish_openapi": False, "openapi_insecure": False, diff --git a/py2http/service.py b/py2http/service.py index 0024f9d..7ff198d 100644 --- a/py2http/service.py +++ b/py2http/service.py @@ -371,6 +371,11 @@ def mk_bottle_app(funcs, **configs): configs = dict(configs, framework=BOTTLE) routes, openapi_spec = mk_routes_and_openapi_specs(funcs, **configs) app = Bottle(catchall=False) + max_request_size = mk_config("max_request_size", None, configs, default_configs) + if max_request_size is not None: + from bottle import BaseRequest + + BaseRequest.MEMFILE_MAX = int(max_request_size) # bottle: process-wide enable_cors = mk_config("enable_cors", None, configs, default_configs) plugins = mk_config("plugins", None, configs, default_configs) if enable_cors: diff --git a/py2http/tests/test_max_request_size.py b/py2http/tests/test_max_request_size.py new file mode 100644 index 0000000..1979532 --- /dev/null +++ b/py2http/tests/test_max_request_size.py @@ -0,0 +1,27 @@ +"""``max_request_size`` raises bottle's in-memory body limit (i2mint/py2http#4).""" + +import pytest + +pytest.importorskip("bottle") +from bottle import BaseRequest + +from py2http import mk_app + + +def echo(x: str): + return x + + +def test_max_request_size_sets_bottle_limit(): + original = BaseRequest.MEMFILE_MAX + try: + mk_app([echo], framework="bottle", max_request_size=5_000_000) + assert BaseRequest.MEMFILE_MAX == 5_000_000 + finally: + BaseRequest.MEMFILE_MAX = original + + +def test_default_leaves_bottle_limit_alone(): + original = BaseRequest.MEMFILE_MAX + mk_app([echo], framework="bottle") + assert BaseRequest.MEMFILE_MAX == original