api3/admin/datastore/upload_catar.rs: verify content type ("application/x-proxmox-backup-catar")
This commit is contained in:
parent
06aeb76a5c
commit
83bdac1e3b
@ -7,12 +7,13 @@ use std::sync::Arc;
|
|||||||
|
|
||||||
use hyper::{Body, Response};
|
use hyper::{Body, Response};
|
||||||
use hyper::rt::Future;
|
use hyper::rt::Future;
|
||||||
|
use hyper::http::request::Parts;
|
||||||
|
|
||||||
pub type BoxFut = Box<Future<Item = Response<Body>, Error = failure::Error> + Send>;
|
pub type BoxFut = Box<Future<Item = Response<Body>, Error = failure::Error> + Send>;
|
||||||
|
|
||||||
type ApiHandlerFn = fn(Value, &ApiMethod) -> Result<Value, Error>;
|
type ApiHandlerFn = fn(Value, &ApiMethod) -> Result<Value, Error>;
|
||||||
|
|
||||||
type ApiUploadHandlerFn = fn(hyper::Body, Value, &ApiUploadMethod) -> Result<BoxFut, Error>;
|
type ApiUploadHandlerFn = fn(Parts, Body, Value, &ApiUploadMethod) -> Result<BoxFut, Error>;
|
||||||
|
|
||||||
pub struct ApiMethod {
|
pub struct ApiMethod {
|
||||||
pub parameters: ObjectSchema,
|
pub parameters: ObjectSchema,
|
||||||
|
@ -12,8 +12,11 @@ use std::io::Write;
|
|||||||
use futures::*;
|
use futures::*;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use hyper::Body;
|
||||||
|
use hyper::http::request::Parts;
|
||||||
|
|
||||||
pub struct UploadCaTar {
|
pub struct UploadCaTar {
|
||||||
stream: hyper::Body,
|
stream: Body,
|
||||||
index: ArchiveIndexWriter,
|
index: ArchiveIndexWriter,
|
||||||
count: usize,
|
count: usize,
|
||||||
}
|
}
|
||||||
@ -40,13 +43,20 @@ impl Future for UploadCaTar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn upload_catar(req_body: hyper::Body, param: Value, _info: &ApiUploadMethod) -> Result<BoxFut, Error> {
|
fn upload_catar(parts: Parts, req_body: Body, param: Value, _info: &ApiUploadMethod) -> Result<BoxFut, Error> {
|
||||||
|
|
||||||
let store = tools::required_string_param(¶m, "name")?;
|
let store = tools::required_string_param(¶m, "name")?;
|
||||||
let archive_name = tools::required_string_param(¶m, "archive_name")?;
|
let archive_name = tools::required_string_param(¶m, "archive_name")?;
|
||||||
|
|
||||||
println!("Upload {}.catar to {} ({}.aidx)", archive_name, store, archive_name);
|
println!("Upload {}.catar to {} ({}.aidx)", archive_name, store, archive_name);
|
||||||
|
|
||||||
|
let content_type = parts.headers.get(http::header::CONTENT_TYPE)
|
||||||
|
.ok_or(format_err!("missing content-type header"))?;
|
||||||
|
|
||||||
|
if content_type != "application/x-proxmox-backup-catar" {
|
||||||
|
bail!("got wrong content-type for catar archive upload");
|
||||||
|
}
|
||||||
|
|
||||||
let chunk_size = 4*1024*1024;
|
let chunk_size = 4*1024*1024;
|
||||||
|
|
||||||
let datastore = DataStore::lookup_datastore(store)?;
|
let datastore = DataStore::lookup_datastore(store)?;
|
||||||
|
@ -25,7 +25,7 @@ fn backup_directory(body: Body, store: &str, archive_name: &str) -> Result<(), E
|
|||||||
|
|
||||||
let path = format!("api3/json/admin/datastore/{}/upload_catar?archive_name={}", store, archive_name);
|
let path = format!("api3/json/admin/datastore/{}/upload_catar?archive_name={}", store, archive_name);
|
||||||
|
|
||||||
client.upload(body, &path)?;
|
client.upload("application/x-proxmox-backup-catar", body, &path)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ impl HttpClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn upload(&self, body: Body, path: &str) -> Result<(), Error> {
|
pub fn upload(&self, content_type: &str, body: Body, path: &str) -> Result<(), Error> {
|
||||||
|
|
||||||
let client = Client::new();
|
let client = Client::new();
|
||||||
|
|
||||||
@ -30,6 +30,7 @@ impl HttpClient {
|
|||||||
.method("POST")
|
.method("POST")
|
||||||
.uri(url)
|
.uri(url)
|
||||||
.header("User-Agent", "proxmox-backup-client/1.0")
|
.header("User-Agent", "proxmox-backup-client/1.0")
|
||||||
|
.header("Content-Type", content_type)
|
||||||
.body(body)?;
|
.body(body)?;
|
||||||
|
|
||||||
let future = client
|
let future = client
|
||||||
|
@ -208,7 +208,7 @@ fn handle_upload_api_request(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
match (info.handler)(req_body, params, info) {
|
match (info.handler)(parts, req_body, params, info) {
|
||||||
Ok(future) => future,
|
Ok(future) => future,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let resp = (formatter.format_result)(Err(Error::from(err)));
|
let resp = (formatter.format_result)(Err(Error::from(err)));
|
||||||
|
Loading…
Reference in New Issue
Block a user