pikvm/pikvm#321: server-side uploading counters

This commit is contained in:
Devaev Maxim
2021-06-08 03:12:24 +03:00
parent cf08c04e55
commit b5ab5699c4
8 changed files with 115 additions and 95 deletions

View File

@@ -28,10 +28,12 @@ from ....logging import get_logger
from ....plugins.msd import BaseMsd
from ....validators.basic import valid_bool
from ....validators.basic import valid_int_f0
from ....validators.kvm import valid_msd_image_name
from ..http import exposed_http
from ..http import make_json_response
from ..http import get_field_value
from ..http import get_multipart_field
@@ -71,12 +73,12 @@ class MsdApi:
name = ""
written = 0
try:
name_field = await get_multipart_field(reader, "image")
name = valid_msd_image_name((await name_field.read()).decode("utf-8"))
name = valid_msd_image_name(await get_field_value(reader, "image"))
size = valid_int_f0(await get_field_value(reader, "size"))
data_field = await get_multipart_field(reader, "data")
async with self.__msd.write_image(name):
async with self.__msd.write_image(name, size):
logger.info("Writing image %r to MSD ...", name)
while True:
chunk = await data_field.read_chunk(self.__msd.get_upload_chunk_size())

View File

@@ -171,6 +171,11 @@ def make_json_exception(err: Exception, status: Optional[int]=None) -> aiohttp.w
# =====
async def get_field_value(reader: aiohttp.MultipartReader, name: str) -> str:
field = await get_multipart_field(reader, name)
return (await field.read()).decode("utf-8")
async def get_multipart_field(reader: aiohttp.MultipartReader, name: str) -> aiohttp.BodyPartReader:
field = await reader.next()
if not isinstance(field, aiohttp.BodyPartReader):