diff --git a/src/api2/admin/datastore/backup.rs b/src/api2/admin/datastore/backup.rs index 2bf71604..8c1a8d49 100644 --- a/src/api2/admin/datastore/backup.rs +++ b/src/api2/admin/datastore/backup.rs @@ -42,7 +42,7 @@ fn upgrade_to_backup_protocol( req_body: Body, param: Value, _info: &ApiAsyncMethod, - rpcenv: &mut RpcEnvironment, + rpcenv: Box, ) -> Result { static PROXMOX_BACKUP_PROTOCOL_ID: &str = "proxmox-backup-protocol-h2"; @@ -155,7 +155,7 @@ fn test2_get( _req_body: Body, _param: Value, _info: &ApiAsyncMethod, - _rpcenv: &mut RpcEnvironment, + _rpcenv: Box, ) -> Result { let fut = tokio::timer::Interval::new_interval(std::time::Duration::from_millis(300)) diff --git a/src/api2/admin/datastore/backup/environment.rs b/src/api2/admin/datastore/backup/environment.rs index d7f735d0..470c44ba 100644 --- a/src/api2/admin/datastore/backup/environment.rs +++ b/src/api2/admin/datastore/backup/environment.rs @@ -1,3 +1,4 @@ +use failure::*; use std::sync::Arc; use std::collections::HashMap; @@ -6,6 +7,8 @@ use serde_json::Value; use crate::api_schema::router::{RpcEnvironment, RpcEnvironmentType}; use crate::server::WorkerTask; use crate::backup::*; +use crate::server::formatter::*; +use hyper::{Body, Response}; /// `RpcEnvironmet` implementation for backup service #[derive(Clone)] @@ -13,6 +16,7 @@ pub struct BackupEnvironment { env_type: RpcEnvironmentType, result_attributes: HashMap, user: String, + pub formatter: &'static OutputFormatter, pub worker: Arc, pub datastore: Arc, } @@ -25,12 +29,20 @@ impl BackupEnvironment { user, worker, datastore, + formatter: &JSON_FORMATTER, } } pub fn log>(&self, msg: S) { self.worker.log(msg); } + + pub fn format_response(&self, result: Result) -> Response { + match result { + Ok(data) => (self.formatter.format_data)(data, self), + Err(err) => (self.formatter.format_error)(err), + } + } } impl RpcEnvironment for BackupEnvironment { @@ -61,3 +73,8 @@ impl AsRef for RpcEnvironment { self.as_any().downcast_ref::().unwrap() } } +impl AsRef for Box { + fn as_ref(&self) -> &BackupEnvironment { + self.as_any().downcast_ref::().unwrap() + } +} diff --git a/src/api2/admin/datastore/backup/service.rs b/src/api2/admin/datastore/backup/service.rs index 6ddcb3d4..d011415d 100644 --- a/src/api2/admin/datastore/backup/service.rs +++ b/src/api2/admin/datastore/backup/service.rs @@ -41,8 +41,6 @@ impl BackupService { Err(err) => return Box::new(future::err(http_err!(BAD_REQUEST, err.to_string()))), }; - let formatter = &JSON_FORMATTER; - self.worker.log(format!("H2 REQUEST {} {}", method, path)); self.worker.log(format!("H2 COMPO {:?}", components)); @@ -51,13 +49,15 @@ impl BackupService { match BACKUP_ROUTER.find_method(&components, method, &mut uri_param) { MethodDefinition::None => { let err = http_err!(NOT_FOUND, "Path not found.".to_string()); - return Box::new(future::ok((formatter.format_error)(err))); + return Box::new(future::ok((self.rpcenv.formatter.format_error)(err))); } MethodDefinition::Simple(api_method) => { - return crate::server::rest::handle_sync_api_request(self.rpcenv.clone(), api_method, formatter, parts, body, uri_param); + return crate::server::rest::handle_sync_api_request( + self.rpcenv.clone(), api_method, self.rpcenv.formatter, parts, body, uri_param); } MethodDefinition::Async(async_method) => { - return crate::server::rest::handle_async_api_request(self.rpcenv.clone(), async_method, formatter, parts, body, uri_param); + return crate::server::rest::handle_async_api_request( + self.rpcenv.clone(), async_method, self.rpcenv.formatter, parts, body, uri_param); } } } diff --git a/src/api2/admin/datastore/backup/upload_chunk.rs b/src/api2/admin/datastore/backup/upload_chunk.rs index 4cea4b14..a6dd5efe 100644 --- a/src/api2/admin/datastore/backup/upload_chunk.rs +++ b/src/api2/admin/datastore/backup/upload_chunk.rs @@ -71,7 +71,7 @@ fn upload_chunk( req_body: Body, param: Value, _info: &ApiAsyncMethod, - rpcenv: &mut RpcEnvironment, + rpcenv: Box, ) -> Result { let size = tools::required_integer_param(¶m, "size")?; @@ -85,7 +85,11 @@ fn upload_chunk( let resp = upload.select(abort_future) .and_then(|(result, _)| Ok(result)) .map_err(|(err, _)| err) - .then(|res| Ok(crate::server::formatter::json_response(res))); + //.then(|res| Ok(crate::server::formatter::json_response(res))); + .then(move |res| { + let env: &BackupEnvironment = rpcenv.as_ref(); + Ok(env.format_response(res)) + }); Ok(Box::new(resp)) diff --git a/src/api2/admin/datastore/pxar.rs b/src/api2/admin/datastore/pxar.rs index 051c55e5..d1162e47 100644 --- a/src/api2/admin/datastore/pxar.rs +++ b/src/api2/admin/datastore/pxar.rs @@ -51,7 +51,7 @@ fn upload_pxar( req_body: Body, param: Value, _info: &ApiAsyncMethod, - rpcenv: &mut RpcEnvironment, + rpcenv: Box, ) -> Result { let store = tools::required_string_param(¶m, "store")?; @@ -149,7 +149,7 @@ fn download_pxar( _req_body: Body, param: Value, _info: &ApiAsyncMethod, - _rpcenv: &mut RpcEnvironment, + _rpcenv: Box, ) -> Result { let store = tools::required_string_param(¶m, "store")?; diff --git a/src/api2/admin/datastore/upload.rs b/src/api2/admin/datastore/upload.rs index 22b89d16..d5b50a15 100644 --- a/src/api2/admin/datastore/upload.rs +++ b/src/api2/admin/datastore/upload.rs @@ -34,7 +34,7 @@ fn upgrade_upload( req_body: Body, param: Value, _info: &ApiAsyncMethod, - _rpcenv: &mut RpcEnvironment, + _rpcenv: Box, ) -> Result { let store = tools::required_string_param(¶m, "store")?.to_string(); let expected_protocol: &'static str = "proxmox-backup-protocol-1"; diff --git a/src/api_schema/router.rs b/src/api_schema/router.rs index c6b77953..8e645e40 100644 --- a/src/api_schema/router.rs +++ b/src/api_schema/router.rs @@ -75,7 +75,7 @@ macro_rules! http_err { } type ApiAsyncHandlerFn = Box< - dyn Fn(Parts, Body, Value, &ApiAsyncMethod, &mut dyn RpcEnvironment) -> Result + dyn Fn(Parts, Body, Value, &ApiAsyncMethod, Box) -> Result + Send + Sync + 'static >; @@ -152,7 +152,7 @@ impl ApiAsyncMethod { pub fn new(handler: F, parameters: ObjectSchema) -> Self where - F: Fn(Parts, Body, Value, &ApiAsyncMethod, &mut dyn RpcEnvironment) -> Result + F: Fn(Parts, Body, Value, &ApiAsyncMethod, Box) -> Result + Send + Sync + 'static, { Self { diff --git a/src/server/rest.rs b/src/server/rest.rs index 84611628..8ecfc02b 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -264,7 +264,7 @@ pub fn handle_sync_api_request( } pub fn handle_async_api_request( - mut rpcenv: Env, + rpcenv: Env, info: &'static ApiAsyncMethod, formatter: &'static OutputFormatter, parts: Parts, @@ -294,7 +294,7 @@ pub fn handle_async_api_request( } }; - match (info.handler)(parts, req_body, params, info, &mut rpcenv) { + match (info.handler)(parts, req_body, params, info, Box::new(rpcenv)) { Ok(future) => future, Err(err) => { let resp = (formatter.format_error)(Error::from(err));