get rid of multipart in /msd/write

This commit is contained in:
Maxim Devaev 2021-07-28 14:58:10 +03:00
parent 801b290ac6
commit 9aa3998924
3 changed files with 5 additions and 39 deletions

View File

@ -48,9 +48,6 @@ from ..http import make_json_response
from ..http import make_json_exception
from ..http import start_streaming
from ..http import stream_json
from ..http import get_multipart_reader
from ..http import get_multipart_reader_str
from ..http import get_multipart_reader_field
# ======
@ -86,15 +83,13 @@ class MsdApi:
@exposed_http("POST", "/msd/write")
async def __write_handler(self, request: Request) -> Response:
reader = await get_multipart_reader(request)
name = valid_msd_image_name(await get_multipart_reader_str(reader, "image"))
size = valid_int_f0(await get_multipart_reader_str(reader, "size"))
data_field = await get_multipart_reader_field(reader, "data")
name = valid_msd_image_name(request.query.get("image"))
size = valid_int_f0(request.content_length)
written = 0
async with self.__msd.write_image(name, size) as chunk_size:
while True:
chunk = await data_field.read_chunk(chunk_size)
chunk = await request.content.read(chunk_size)
if not chunk:
break
written = await self.__msd.write_image_chunk(chunk)

View File

@ -41,8 +41,6 @@ except ImportError:
from ...logging import get_logger
from ...validators import ValidatorError
# =====
class HttpError(Exception):
@ -180,28 +178,6 @@ async def stream_json(response: aiohttp.web.StreamResponse, result: Dict) -> Non
await response.write(json.dumps(result).encode("utf-8") + b"\r\n")
# =====
async def get_multipart_reader(request: aiohttp.web.Request) -> aiohttp.MultipartReader:
try:
return (await request.multipart())
except Exception:
raise ValidatorError("Expected multipart")
async def get_multipart_reader_str(reader: aiohttp.MultipartReader, name: str) -> str:
field = await get_multipart_reader_field(reader, name)
return (await field.read()).decode("utf-8")
async def get_multipart_reader_field(reader: aiohttp.MultipartReader, name: str) -> aiohttp.BodyPartReader:
field = await reader.next()
if not isinstance(field, aiohttp.BodyPartReader):
raise ValidatorError(f"Expected body part as {name!r} field")
if not field or field.name != name:
raise ValidatorError(f"Missing {name!r} field")
return field
# =====
_REQUEST_AUTH_INFO = "_kvmd_auth_info"

View File

@ -99,16 +99,11 @@ export function Msd() {
};
var __clickUploadNewImageButton = function() {
let form_data = new FormData();
form_data.append("image", __image_file.name);
form_data.append("size", __image_file.size);
form_data.append("data", __image_file);
__upload_http = new XMLHttpRequest();
__upload_http.open("POST", "/api/msd/write", true);
__upload_http.open("POST", `/api/msd/write?image=${encodeURIComponent(__image_file.name)}`, true);
__upload_http.upload.timeout = 15000;
__upload_http.onreadystatechange = __uploadStateChange;
__upload_http.send(form_data);
__upload_http.send(__image_file);
};
var __uploadStateChange = function() {