rusty_oss/actions/
create_bucket.rs1use 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#[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 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}