ali_oss_rs/blocking/
acl.rs1use crate::{
4 acl_common::{build_get_object_acl_request, build_put_object_acl_request, parse_object_acl_from_xml},
5 common::VersionIdOnlyOptions,
6 object_common::ObjectAcl,
7 Result,
8};
9
10use super::Client;
11
12pub type PutObjectAclOptions = VersionIdOnlyOptions;
13pub type GetObjectAclOptions = VersionIdOnlyOptions;
14
15pub trait ObjectAclOperations {
16 fn get_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, options: Option<GetObjectAclOptions>) -> Result<ObjectAcl>
20 where
21 S1: AsRef<str>,
22 S2: AsRef<str>;
23
24 fn put_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, acl: ObjectAcl, options: Option<GetObjectAclOptions>) -> Result<()>
28 where
29 S1: AsRef<str>,
30 S2: AsRef<str>;
31}
32
33impl ObjectAclOperations for Client {
34 fn get_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, options: Option<GetObjectAclOptions>) -> Result<ObjectAcl>
38 where
39 S1: AsRef<str>,
40 S2: AsRef<str>,
41 {
42 let request = build_get_object_acl_request(bucket_name.as_ref(), object_key.as_ref(), &options)?;
43 let (_, content) = self.do_request::<String>(request)?;
44 parse_object_acl_from_xml(&content)
45 }
46
47 fn put_object_acl<S1, S2>(&self, bucket_name: S1, object_key: S2, acl: ObjectAcl, options: Option<GetObjectAclOptions>) -> Result<()>
51 where
52 S1: AsRef<str>,
53 S2: AsRef<str>,
54 {
55 let request = build_put_object_acl_request(bucket_name.as_ref(), object_key.as_ref(), acl, &options)?;
56 let _ = self.do_request::<()>(request)?;
57 Ok(())
58 }
59}
60
61#[cfg(all(test, feature = "blocking"))]
62mod test_object_acl_blocking {
63 use std::sync::Once;
64
65 use reqwest::StatusCode;
66 use uuid::Uuid;
67
68 use super::Client;
69 use crate::{
70 blocking::{acl::ObjectAclOperations, object::ObjectOperations},
71 object_common::ObjectAcl,
72 };
73
74 static INIT: Once = Once::new();
75
76 fn setup() {
77 INIT.call_once(|| {
78 simple_logger::init_with_level(log::Level::Debug).unwrap();
79 dotenvy::dotenv().unwrap();
80 });
81 }
82
83 #[test]
84 fn test_object_acl_blocking() {
85 log::debug!("test a private object update to public");
86 setup();
87
88 let client = Client::from_env();
89
90 let bucket_name = "yuanyq";
91 let object_key = format!("rust-sdk-test/{}.jpg", Uuid::new_v4());
92 let file_path = "/home/yuanyq/Pictures/01-cover.jpg";
93
94 let response = client.put_object_from_file(bucket_name, &object_key, file_path, None);
95
96 assert!(response.is_ok());
97
98 let response = client.put_object_acl(bucket_name, &object_key, ObjectAcl::PublicRead, None);
99 assert!(response.is_ok());
100
101 let response = client.get_object_acl(bucket_name, &object_key, None);
102 assert!(response.is_ok());
103 let ret = response.unwrap();
104 assert_eq!(ObjectAcl::PublicRead, ret);
105
106 let url = format!("https://{}.oss-cn-beijing.aliyuncs.com/{}", bucket_name, object_key);
107 let status = reqwest::blocking::get(&url).unwrap().status();
108 assert_eq!(StatusCode::OK, status);
109
110 let response = client.put_object_acl(bucket_name, &object_key, ObjectAcl::Default, None);
111 assert!(response.is_ok());
112
113 let response = client.get_object_acl(bucket_name, &object_key, None);
114 assert!(response.is_ok());
115 let ret = response.unwrap();
116 assert_eq!(ObjectAcl::Default, ret);
117
118 let url = format!("https://{}.oss-cn-beijing.aliyuncs.com/{}", bucket_name, object_key);
119 let status = reqwest::blocking::get(&url).unwrap().status();
120 assert_eq!(StatusCode::FORBIDDEN, status);
121
122 client.delete_object(bucket_name, &object_key, None).unwrap();
123 }
124}