From b3d83b1b0b497185e08324a7c4e67d0f509f9784 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 28 Nov 2016 12:53:50 +0100 Subject: [PATCH] Catch error when no space left on disk during export Fix #801 --- .../api/controller/project_handler.py | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/gns3server/handlers/api/controller/project_handler.py b/gns3server/handlers/api/controller/project_handler.py index e8bb962d..f9f12ba7 100644 --- a/gns3server/handlers/api/controller/project_handler.py +++ b/gns3server/handlers/api/controller/project_handler.py @@ -286,22 +286,26 @@ class ProjectHandler: controller = Controller.instance() project = yield from controller.get_loaded_project(request.match_info["project_id"]) - with tempfile.TemporaryDirectory() as tmp_dir: - datas = yield from export_project(project, tmp_dir, include_images=bool(request.get("include_images", "0"))) - # We need to do that now because export could failed and raise an HTTP error - # that why response start need to be the later possible - response.content_type = 'application/gns3project' - response.headers['CONTENT-DISPOSITION'] = 'attachment; filename="{}.gns3project"'.format(project.name) - response.enable_chunked_encoding() - # Very important: do not send a content length otherwise QT closes the connection (curl can consume the feed) - response.content_length = None - response.start(request) + try: + with tempfile.TemporaryDirectory() as tmp_dir: + datas = yield from export_project(project, tmp_dir, include_images=bool(request.get("include_images", "0"))) + # We need to do that now because export could failed and raise an HTTP error + # that why response start need to be the later possible + response.content_type = 'application/gns3project' + response.headers['CONTENT-DISPOSITION'] = 'attachment; filename="{}.gns3project"'.format(project.name) + response.enable_chunked_encoding() + # Very important: do not send a content length otherwise QT closes the connection (curl can consume the feed) + response.content_length = None + response.start(request) - for data in datas: - response.write(data) - yield from response.drain() + for data in datas: + response.write(data) + yield from response.drain() - yield from response.write_eof() + yield from response.write_eof() + # Will be raise if you have no space left or permission issue on your temporary directory + except OSError as e: + raise aiohttp.web.HTTPNotFound(text="Can't export project: {}".format(str(e))) @Route.post( r"/projects/{project_id}/import",