rusty_oss/actions/
delete_object.rs

1use std::time::Duration;
2
3use time::OffsetDateTime;
4use url::Url;
5
6use super::OSSAction;
7use crate::actions::Method;
8use crate::signing::sign;
9use crate::{Bucket, Credentials, Map};
10
11/// Delete an object from OSS, using a `DELETE` request.
12///
13/// Find out more about `DeleteObject` from the [OSS API Reference][api]
14///
15/// [api]: https://help.aliyun.com/zh/oss/developer-reference/deleteobject
16#[derive(Debug, Clone)]
17pub struct DeleteObject<'a> {
18    bucket: &'a Bucket,
19    credentials: Option<&'a Credentials>,
20    object: &'a str,
21
22    query: Map<'a>,
23    headers: Map<'a>,
24}
25
26impl<'a> DeleteObject<'a> {
27    #[inline]
28    pub fn new(bucket: &'a Bucket, credentials: Option<&'a Credentials>, object: &'a str) -> Self {
29        Self {
30            bucket,
31            credentials,
32            object,
33
34            query: Map::new(),
35            headers: Map::new(),
36        }
37    }
38}
39
40impl<'a> OSSAction<'a> for DeleteObject<'a> {
41    const METHOD: Method = Method::Delete;
42
43    fn query_mut(&mut self) -> &mut Map<'a> {
44        &mut self.query
45    }
46
47    fn headers_mut(&mut self) -> &mut Map<'a> {
48        &mut self.headers
49    }
50
51    fn sign_with_time(&self, expires_in: Duration, time: &OffsetDateTime) -> Url {
52        let url = self.bucket.object_url(self.object).unwrap();
53
54        match self.credentials {
55            Some(credentials) => sign(
56                time,
57                Method::Delete,
58                url,
59                credentials.key(),
60                credentials.secret(),
61                credentials.token(),
62                self.bucket.region(),
63                expires_in.as_secs(),
64                self.query.iter(),
65                self.headers.iter(),
66            ),
67            None => url,
68        }
69    }
70}
71
72#[cfg(test)]
73mod tests {
74    use time::OffsetDateTime;
75
76    use pretty_assertions::assert_eq;
77
78    use super::*;
79    use crate::{Bucket, Credentials, UrlStyle};
80
81    #[test]
82    fn oss_example() {
83        // Fri, 24 May 2013 00:00:00 GMT
84        let date = OffsetDateTime::from_unix_timestamp(1369353600).unwrap();
85        let expires_in = Duration::from_secs(86400);
86
87        let endpoint = "https://oss-cn-hangzhou.aliyuncs.com".parse().unwrap();
88        let bucket = Bucket::new(
89            endpoint,
90            UrlStyle::VirtualHost,
91            "examplebucket",
92            "cn-hangzhou",
93        )
94        .unwrap();
95        let credentials = Credentials::new(
96            "access_key_id",
97            "access_key_secret",
98        );
99
100        let action = DeleteObject::new(&bucket, Some(&credentials), "test.txt");
101
102        let url = action.sign_with_time(expires_in, &date);
103        let expected = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/test.txt?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=cc1e5382897bc06c4502f0a8d578a078cc5705ea043ae2894d6d018e5dfa43dc";
104
105        assert_eq!(expected, url.as_str());
106    }
107
108    #[test]
109    fn anonymous_custom_query() {
110        let expires_in = Duration::from_secs(86400);
111
112        let endpoint = "https://oss-cn-hangzhou.aliyuncs.com".parse().unwrap();
113        let bucket = Bucket::new(
114            endpoint,
115            UrlStyle::VirtualHost,
116            "examplebucket",
117            "cn-hangzhou",
118        )
119        .unwrap();
120
121        let action = DeleteObject::new(&bucket, None, "test.txt");
122        let url = action.sign(expires_in);
123        let expected = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/test.txt";
124
125        assert_eq!(expected, url.as_str());
126    }
127}