diff --git a/vstc/src/db_command.rs b/vstc/src/db_command.rs index a7606eb..d2e27a9 100644 --- a/vstc/src/db_command.rs +++ b/vstc/src/db_command.rs @@ -1,8 +1,7 @@ use std::{io::Write, process::exit, rc::Rc}; use actix_web::{ - web::{self}, - App, HttpRequest, HttpResponse, HttpServer, Responder, + dev::Payload, web, App, FromRequest, HttpRequest, HttpResponse, HttpServer, Responder, }; use storage::{storage_head_ptr, SledBackend, Storage, StorageReader}; @@ -155,18 +154,33 @@ fn db_call(path: &String, args: &[String]) { .unwrap(); } +async fn get_body(req: &HttpRequest) -> Result { + let payload = web::Payload::from_request(req, &mut Payload::None).await?; + + let body = payload + .to_bytes_limited(1_024 * 1_024) + .await + .map_err(|_| actix_web::error::PayloadError::Overflow)??; + + if body.is_empty() { + Ok(Val::Undefined) + } else { + match serde_json::from_slice::(&body) { + Ok(json_value) => Ok(Val::from_json(&json_value)), + Err(err) => Err(actix_web::error::ErrorBadRequest(err)), + } + } +} + async fn handle_request(req: HttpRequest, data: web::Data) -> impl Responder { let path = req.path(); let method = req.method(); let mut storage = Storage::new(SledBackend::open(data.as_ref()).unwrap()); - // let body = Val::from_json( - // &web::Json::::from_request(&req, &mut Payload::None) - // .await - // .unwrap() - // .into_inner(), - // ); - let body = Val::Undefined; + let body = match get_body(&req).await { + Ok(body) => body, + Err(e) => return e.into(), + }; let mut instance: Val = storage .get_head(storage_head_ptr(b"state")) @@ -176,6 +190,7 @@ async fn handle_request(req: HttpRequest, data: web::Data) -> impl Respo let fn_ = inline_valuescript( r#" export default function(req) { + console.log('req', req.path, req.method, req.body); if ("handleRequest" in this) { return this.handleRequest(req); }