aliyun_oss_rs/object/
get_object_acl.rs

1use crate::common::body_to_bytes;
2use crate::{
3    Error,
4    common::Acl,
5    error::normal_error,
6    request::{Oss, OssRequest},
7};
8use http::Method;
9use serde_derive::Deserialize;
10
11// Returned content
12/// Object ACL information
13#[derive(Debug, Deserialize)]
14struct AccessControlPolicy {
15    #[serde(rename = "AccessControlList")]
16    access_control_list: AccessControlList,
17}
18
19#[derive(Debug, Deserialize)]
20struct AccessControlList {
21    #[serde(rename = "Grant")]
22    grant: Acl,
23}
24
25/// Retrieve the object's ACL
26///
27/// See the [Alibaba Cloud documentation](https://help.aliyun.com/document_detail/31987.html) for details
28pub struct GetObjectAcl {
29    req: OssRequest,
30}
31impl GetObjectAcl {
32    pub(super) fn new(oss: Oss) -> Self {
33        let mut req = OssRequest::new(oss, Method::GET);
34        req.insert_query("acl", "");
35        GetObjectAcl { req }
36    }
37    /// Send the request
38    ///
39    pub async fn send(self) -> Result<Acl, Error> {
40        // Build the HTTP request
41        let response = self.req.send_to_oss()?.await?;
42        // Parse the response
43        let status_code = response.status();
44        match status_code {
45            code if code.is_success() => {
46                let response_bytes = body_to_bytes(response.into_body())
47                    .await
48                    .map_err(|_| Error::OssInvalidResponse(None))?;
49                let acl: AccessControlPolicy = serde_xml_rs::from_reader(&*response_bytes)
50                    .map_err(|_| Error::OssInvalidResponse(Some(response_bytes)))?;
51                Ok(acl.access_control_list.grant)
52            }
53            _ => Err(normal_error(response).await),
54        }
55    }
56}