diff --git a/src/main.rs b/src/main.rs index 789a2cc..a955484 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,17 +17,23 @@ fn main() { rt::run(rt::lazy(|| { // let c = get_local_default_server(); let c = minio::Client::get_play_client(); + let bucket = "yyy"; let region_req = c - .get_bucket_location("yyy") + .get_bucket_location(bucket) .map(|res| println!("{}", res.to_string())) .map_err(|err| println!("{:?}", err)); let del_req = c - .delete_bucket("yyy") + .delete_bucket(bucket) .map(|_| println!("Deleted!")) .map_err(|err| println!("del err: {:?}", err)); - del_req.join(region_req).map(|_| ()) + let buc_exists_req = c + .bucket_exists(bucket) + .map(move |e| println!("Bucket {} exists: {}", bucket, e)) + .map_err(|err| println!("exists err: {:?}", err)); + + del_req.join3(region_req, buc_exists_req).map(|_| ()) })); } diff --git a/src/minio.rs b/src/minio.rs index d967295..ab1fa75 100644 --- a/src/minio.rs +++ b/src/minio.rs @@ -146,7 +146,32 @@ impl Client { println!("signout: {:?}", sign_hdrs); let req_result = api::mk_request(&s3_req, &self, &sign_hdrs); let conn_client = self.conn_client.clone(); - run_req_future(req_result, conn_client) + future::result(req_result) + .map_err(|e| Err::HttpErr(e)) + .and_then(move |req| conn_client.make_req(req).map_err(|e| Err::HyperErr(e))) + .and_then(|resp| { + let st = resp.status(); + if st.is_success() { + Ok(resp) + } else { + Err(Err::RawSvcErr(st, resp)) + } + }) + .or_else(|err| { + future::err(err) + .or_else(|x| match x { + Err::RawSvcErr(st, resp) => Ok((st, resp)), + other_err => Err(other_err), + }) + .and_then(|(st, resp)| { + resp.into_body() + .concat2() + .map_err(|err| Err::HyperErr(err)) + .and_then(move |chunk| { + Err(Err::FailStatusCodeErr(st, chunk.into_bytes())) + }) + }) + }) } pub fn get_bucket_location(&self, b: &str) -> impl Future { @@ -184,36 +209,30 @@ impl Client { }; self.signed_req_future(s3_req).and_then(|_| Ok(())) } -} -fn run_req_future( - req_result: http::Result>, - c: ConnClient, -) -> impl Future, Error = Err> { - future::result(req_result) - .map_err(|e| Err::HttpErr(e)) - .and_then(move |req| c.make_req(req).map_err(|e| Err::HyperErr(e))) - .and_then(|resp| { - let st = resp.status(); - if st.is_success() { - Ok(resp) - } else { - Err(Err::RawSvcErr(st, resp)) + pub fn bucket_exists(&self, b: &str) -> impl Future { + let s3_req = S3Req { + method: Method::HEAD, + bucket: Some(b.to_string()), + object: None, + headers: HeaderMap::new(), + query: HashMap::new(), + body: Body::empty(), + ts: time::now_utc(), + }; + self.signed_req_future(s3_req).then(|res| match res { + Ok(_) => Ok(true), + Err(Err::FailStatusCodeErr(st, b)) => { + let code = st.as_u16(); + if code == 404 { + Ok(false) + } else { + Err(Err::FailStatusCodeErr(st, b)) + } } + Err(err) => Err(err), }) - .or_else(|err| { - future::err(err) - .or_else(|x| match x { - Err::RawSvcErr(st, resp) => Ok((st, resp)), - other_err => Err(other_err), - }) - .and_then(|(st, resp)| { - resp.into_body() - .concat2() - .map_err(|err| Err::HyperErr(err)) - .and_then(move |chunk| Err(Err::FailStatusCodeErr(st, chunk.into_bytes()))) - }) - }) + } } fn b2s(b: Bytes) -> Result {