use crate::bucket::{validate_expiry, Bucket, Request};
use crate::command::Command;
use crate::error::S3Error;
use crate::request::RequestImpl;
use http::header::HeaderMap;
use std::collections::HashMap;
impl Bucket {
/// Get a presigned url for getting object on a given path
///
/// # Example:
///
/// ```no_run
/// use std::collections::HashMap;
/// use s3::bucket::Bucket;
/// use s3::creds::Credentials;
///
/// let bucket_name = "rust-s3-test";
/// let region = "us-east-1".parse().unwrap();
/// let credentials = Credentials::default().unwrap();
/// let bucket = Bucket::new(bucket_name, region, credentials).unwrap();
///
/// // Add optional custom queries
/// let mut custom_queries = HashMap::new();
/// custom_queries.insert(
/// "response-content-disposition".into(),
/// "attachment; filename=\"test.png\"".into(),
/// );
///
/// let url = bucket.presign_get("/test.file", 86400, Some(custom_queries)).unwrap();
/// println!("Presigned url: {}", url);
/// ```
pub fn presign_get<S: AsRef<str>>(
&self,
path: S,
expiry_secs: u32,
custom_queries: Option<HashMap<String, String>>,
) -> Result<String, S3Error> {
validate_expiry(expiry_secs)?;
let request = RequestImpl::new(
self,
path.as_ref(),
Command::PresignGet {
expiry_secs,
custom_queries,
},
)?;
request.presigned()
}
/// Get a presigned url for posting an object to a given path
///
/// # Example:
///
/// ```no_run
/// use s3::bucket::Bucket;
/// use s3::creds::Credentials;
/// use http::HeaderMap;
/// use http::header::HeaderName;
///
/// let bucket_name = "rust-s3-test";
/// let region = "us-east-1".parse().unwrap();
/// let credentials = Credentials::default().unwrap();
/// let bucket = Bucket::new(bucket_name, region, credentials).unwrap();
///
/// let post_policy = "eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9";
///
/// let url = bucket.presign_post("/test.file", 86400, post_policy.to_string()).unwrap();
/// println!("Presigned url: {}", url);
/// ```
pub fn presign_post<S: AsRef<str>>(
&self,
path: S,
expiry_secs: u32,
// base64 encoded post policy document -> https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html
post_policy: String,
) -> Result<String, S3Error> {
validate_expiry(expiry_secs)?;
let request = RequestImpl::new(
self,
path.as_ref(),
Command::PresignPost {
expiry_secs,
post_policy,
},
)?;
request.presigned()
}
/// Get a presigned url for putting object to a given path
///
/// # Example:
///
/// ```no_run
/// use s3::bucket::Bucket;
/// use s3::creds::Credentials;
/// use http::HeaderMap;
/// use http::header::HeaderName;
///
/// let bucket_name = "rust-s3-test";
/// let region = "us-east-1".parse().unwrap();
/// let credentials = Credentials::default().unwrap();
/// let bucket = Bucket::new(bucket_name, region, credentials).unwrap();
///
/// // Add optional custom headers
/// let mut custom_headers = HeaderMap::new();
/// custom_headers.insert(
/// HeaderName::from_static("custom_header"),
/// "custom_value".parse().unwrap(),
/// );
///
/// let url = bucket.presign_put("/test.file", 86400, Some(custom_headers)).unwrap();
/// println!("Presigned url: {}", url);
/// ```
pub fn presign_put<S: AsRef<str>>(
&self,
path: S,
expiry_secs: u32,
custom_headers: Option<HeaderMap>,
) -> Result<String, S3Error> {
validate_expiry(expiry_secs)?;
let request = RequestImpl::new(
self,
path.as_ref(),
Command::PresignPut {
expiry_secs,
custom_headers,
},
)?;
request.presigned()
}
/// Get a presigned url for deleting object on a given path
///
/// # Example:
///
/// ```no_run
/// use s3::bucket::Bucket;
/// use s3::creds::Credentials;
///
/// let bucket_name = "rust-s3-test";
/// let region = "us-east-1".parse().unwrap();
/// let credentials = Credentials::default().unwrap();
/// let bucket = Bucket::new(bucket_name, region, credentials).unwrap();
///
/// let url = bucket.presign_delete("/test.file", 86400).unwrap();
/// println!("Presigned url: {}", url);
/// ```
pub fn presign_delete<S: AsRef<str>>(
&self,
path: S,
expiry_secs: u32,
) -> Result<String, S3Error> {
validate_expiry(expiry_secs)?;
let request =
RequestImpl::new(self, path.as_ref(), Command::PresignDelete { expiry_secs })?;
request.presigned()
}
}