Fix Exporting portable projects with QEMU includes base images even when selecting no.

Fix https://github.com/GNS3/gns3-gui/issues/1409
This commit is contained in:
Julien Duponchelle 2016-07-28 14:59:44 +02:00
parent 7d90a73ed2
commit d6f63d3b7d
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
3 changed files with 39 additions and 13 deletions

View File

@ -368,7 +368,8 @@ class ProjectHandler:
response.content_length = None
response.start(request)
for data in project.export(include_images=bool(request.GET.get("include_images", "0"))):
include_images = bool(int(request.json.get("include_images", "0")))
for data in project.export(include_images=include_images):
response.write(data)
yield from response.drain()

View File

@ -17,11 +17,13 @@
import sys
import json
import jsonschema
import urllib
import asyncio
import aiohttp
import logging
import traceback
import jsonschema
log = logging.getLogger(__name__)
@ -33,10 +35,11 @@ from ..config import Config
@asyncio.coroutine
def parse_request(request, input_schema):
def parse_request(request, input_schema, raw):
"""Parse body of request and raise HTTP errors in case of problems"""
content_length = request.content_length
if content_length is not None and content_length > 0:
if content_length is not None and content_length > 0 and not raw:
body = yield from request.read()
try:
request.json = json.loads(body.decode('utf-8'))
@ -45,6 +48,13 @@ def parse_request(request, input_schema):
raise aiohttp.web.HTTPBadRequest(text="Invalid JSON {}".format(e))
else:
request.json = {}
# Parse the query string
if len(request.query_string) > 0:
for (k, v) in urllib.parse.parse_qs(request.query_string).items():
request.json[k] = v[0]
if input_schema:
try:
jsonschema.validate(request.json, input_schema)
except jsonschema.ValidationError as e:
@ -52,6 +62,7 @@ def parse_request(request, input_schema):
raise aiohttp.web.HTTPBadRequest(text="Invalid JSON: {} in schema: {}".format(
e.message,
json.dumps(e.schema)))
return request
@ -161,12 +172,13 @@ class Route(object):
if api_version is None or raw is True:
response = Response(request=request, route=route, output_schema=output_schema)
request = yield from parse_request(request, None, raw)
yield from func(request, response)
return response
# API call
try:
request = yield from parse_request(request, input_schema)
request = yield from parse_request(request, input_schema, raw)
record_file = server_config.get("record")
if record_file:
try:

View File

@ -25,7 +25,7 @@ import asyncio
import aiohttp
import zipfile
from unittest.mock import patch
from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch
from gns3server.handlers.api.project_handler import ProjectHandler
@ -306,6 +306,19 @@ def test_export(server, tmpdir, loop, project):
assert content == b"hello"
def test_export_include_image(server, tmpdir, loop, project):
project.export = MagicMock()
response = server.get("/projects/{project_id}/export".format(project_id=project.id), raw=True)
project.export.assert_called_with(include_images=False)
response = server.get("/projects/{project_id}/export?include_images=0".format(project_id=project.id), raw=True)
project.export.assert_called_with(include_images=False)
response = server.get("/projects/{project_id}/export?include_images=1".format(project_id=project.id), raw=True)
project.export.assert_called_with(include_images=True)
def test_import(server, tmpdir, loop, project):
with zipfile.ZipFile(str(tmpdir / "test.zip"), 'w') as myzip: