server/rest.rs: correctly pass query/url parameters
This commit is contained in:
parent
2085142ed4
commit
cf16af2ab3
|
@ -9,6 +9,7 @@ use crate::api::router::*;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use futures::*;
|
use futures::*;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
pub struct UploadCaTar {
|
pub struct UploadCaTar {
|
||||||
stream: hyper::Body,
|
stream: hyper::Body,
|
||||||
|
@ -42,13 +43,17 @@ impl Future for UploadCaTar {
|
||||||
fn upload_catar(req_body: hyper::Body, param: Value, _info: &ApiUploadMethod) -> BoxFut {
|
fn upload_catar(req_body: hyper::Body, param: Value, _info: &ApiUploadMethod) -> BoxFut {
|
||||||
|
|
||||||
let store = param["name"].as_str().unwrap();
|
let store = param["name"].as_str().unwrap();
|
||||||
|
let archive_name = param["archive_name"].as_str().unwrap();
|
||||||
|
|
||||||
println!("Upload .catar to {}", store);
|
println!("Upload {}.catar to {} ({}.aidx)", archive_name, store, archive_name);
|
||||||
|
|
||||||
let chunk_size = 4*1024*1024;
|
let chunk_size = 4*1024*1024;
|
||||||
let datastore = DataStore::lookup_datastore(store).unwrap().clone();
|
let datastore = DataStore::lookup_datastore(store).unwrap().clone();
|
||||||
|
|
||||||
let index = datastore.create_archive_writer("upload.aidx", chunk_size).unwrap();
|
let mut full_archive_name = PathBuf::from(archive_name);
|
||||||
|
full_archive_name.set_extension("aidx");
|
||||||
|
|
||||||
|
let index = datastore.create_archive_writer(&full_archive_name, chunk_size).unwrap();
|
||||||
|
|
||||||
let upload = UploadCaTar { stream: req_body, index, count: 0};
|
let upload = UploadCaTar { stream: req_body, index, count: 0};
|
||||||
|
|
||||||
|
@ -70,5 +75,6 @@ pub fn api_method_upload_catar() -> ApiUploadMethod {
|
||||||
upload_catar,
|
upload_catar,
|
||||||
ObjectSchema::new("Upload .catar backup file.")
|
ObjectSchema::new("Upload .catar backup file.")
|
||||||
.required("name", StringSchema::new("Datastore name."))
|
.required("name", StringSchema::new("Datastore name."))
|
||||||
|
.required("archive_name", StringSchema::new("Backup archive name."))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,8 +180,8 @@ fn handle_sync_api_request(
|
||||||
|
|
||||||
fn handle_upload_api_request(
|
fn handle_upload_api_request(
|
||||||
info: &'static ApiUploadMethod,
|
info: &'static ApiUploadMethod,
|
||||||
_formatter: &'static OutputFormatter,
|
formatter: &'static OutputFormatter,
|
||||||
_parts: Parts,
|
parts: Parts,
|
||||||
req_body: Body,
|
req_body: Body,
|
||||||
uri_param: HashMap<String, String>,
|
uri_param: HashMap<String, String>,
|
||||||
) -> BoxFut
|
) -> BoxFut
|
||||||
|
@ -189,6 +189,13 @@ fn handle_upload_api_request(
|
||||||
// fixme: convert parameters to Json
|
// fixme: convert parameters to Json
|
||||||
let mut param_list: Vec<(String, String)> = vec![];
|
let mut param_list: Vec<(String, String)> = vec![];
|
||||||
|
|
||||||
|
if let Some(query_str) = parts.uri.query() {
|
||||||
|
for (k, v) in form_urlencoded::parse(query_str.as_bytes()).into_owned() {
|
||||||
|
if k == "_dc" { continue; } // skip extjs "disable cache" parameter
|
||||||
|
param_list.push((k, v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (k, v) in uri_param {
|
for (k, v) in uri_param {
|
||||||
param_list.push((k.clone(), v.clone()));
|
param_list.push((k.clone(), v.clone()));
|
||||||
}
|
}
|
||||||
|
@ -196,7 +203,8 @@ fn handle_upload_api_request(
|
||||||
let params = match parse_parameter_strings(¶m_list, &info.parameters, true) {
|
let params = match parse_parameter_strings(¶m_list, &info.parameters, true) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
return Box::new(future::err(err.into()));
|
let resp = (formatter.format_result)(Err(Error::from(err)));
|
||||||
|
return Box::new(future::ok(resp));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue