rusty_oss/actions/
create_bucket.rs

1use std::time::Duration;
2
3use time::OffsetDateTime;
4use url::Url;
5
6use crate::actions::Method;
7use crate::actions::OSSAction;
8use crate::signing::sign;
9use crate::{Bucket, Credentials, Map};
10
11/// Create a new bucket.
12///
13/// Find out more about `CreateBucket` from the [OSS API Reference][api]
14///
15/// [api]: https://help.aliyun.com/zh/oss/developer-reference/putbucket
16#[derive(Debug, Clone)]
17pub struct CreateBucket<'a> {
18    bucket: &'a Bucket,
19    credentials: &'a Credentials,
20
21    query: Map<'a>,
22    headers: Map<'a>,
23}
24
25impl<'a> CreateBucket<'a> {
26    pub fn new(bucket: &'a Bucket, credentials: &'a Credentials) -> Self {
27        Self {
28            bucket,
29            credentials,
30
31            query: Map::new(),
32            headers: Map::new(),
33        }
34    }
35}
36
37impl<'a> OSSAction<'a> for CreateBucket<'a> {
38    const METHOD: Method = Method::Put;
39
40    fn query_mut(&mut self) -> &mut Map<'a> {
41        &mut self.query
42    }
43
44    fn headers_mut(&mut self) -> &mut Map<'a> {
45        &mut self.headers
46    }
47
48    fn sign_with_time(&self, expires_in: Duration, time: &OffsetDateTime) -> Url {
49        let url = self.bucket.base_url().clone();
50
51        sign(
52            time,
53            Method::Put,
54            url,
55            self.credentials.key(),
56            self.credentials.secret(),
57            self.credentials.token(),
58            self.bucket.region(),
59            expires_in.as_secs(),
60            self.query.iter(),
61            self.headers.iter(),
62        )
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use time::OffsetDateTime;
69
70    use pretty_assertions::assert_eq;
71
72    use super::*;
73    use crate::{Bucket, Credentials, UrlStyle};
74
75    #[test]
76    fn oss_example() {
77        // Fri, 24 May 2013 00:00:00 GMT
78        let date = OffsetDateTime::from_unix_timestamp(1369353600).unwrap();
79        let expires_in = Duration::from_secs(86400);
80
81        let endpoint = "https://oss-cn-hangzhou.aliyuncs.com".parse().unwrap();
82        let bucket = Bucket::new(
83            endpoint,
84            UrlStyle::VirtualHost,
85            "examplebucket",
86            "cn-hangzhou",
87        )
88        .unwrap();
89        let credentials = Credentials::new(
90            "access_key_id",
91            "access_key_secret",
92        );
93
94        let action = CreateBucket::new(&bucket, &credentials);
95
96        let url = action.sign_with_time(expires_in, &date);
97        let expected = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/?x-oss-additional-headers=host&x-oss-credential=access_key_id%2F20130524%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20130524T000000Z&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-signature=ee098952c3f41605913db53c3d61888f400a9910702c05f8d91a775929eb2377";
98
99        assert_eq!(expected, url.as_str());
100    }
101}