diff --git a/gns3server/api/routes/controller/projects.py b/gns3server/api/routes/controller/projects.py index caa2d3879..cea7c91f3 100644 --- a/gns3server/api/routes/controller/projects.py +++ b/gns3server/api/routes/controller/projects.py @@ -380,7 +380,13 @@ async def export_project( except (ValueError, OSError, RuntimeError) as e: raise ConnectionError(f"Cannot export project: {e}") - headers = {"CONTENT-DISPOSITION": f'attachment; filename="{project.name}.gns3project"'} + fallback = project.name.encode("ascii", "ignore").decode() or "project" + encoded = urllib.parse.quote(project.name, safe="") + headers = { + "Content-Disposition": ( + f'attachment; filename="{fallback}.gns3project"; filename*=UTF-8\'\'{encoded}.gns3project' + ) + } return StreamingResponse(streamer(), media_type="application/gns3project", headers=headers) diff --git a/gns3server/db/tasks.py b/gns3server/db/tasks.py index 6e147dcee..bfb7dac48 100644 --- a/gns3server/db/tasks.py +++ b/gns3server/db/tasks.py @@ -78,7 +78,7 @@ async def connect_to_db(app: FastAPI) -> None: db_path = os.path.join(Config.instance().config_dir, "gns3_controller.db") db_url = os.environ.get("GNS3_DATABASE_URI", f"sqlite+aiosqlite:///{db_path}") - engine = create_async_engine(db_url, connect_args={"check_same_thread": False, "timeout": 20}, future=True) + engine = create_async_engine(db_url, connect_args={"check_same_thread": False, "timeout": 20}, future=True, pool_size=512, max_overflow=1024) alembic_cfg = config.Config() alembic_cfg.set_main_option("script_location", "gns3server:db_migrations") #alembic_cfg.set_main_option('sqlalchemy.url', db_url)