xt_oss/oss/entities/
referer.rs

1use serde::{Deserialize, Serialize};
2
3pub mod builder {
4    use super::{RefererBlacklist, RefererConfiguration, RefererList};
5
6    #[derive(Debug, Clone)]
7    pub struct RefererConfigurationBuilder<'a> {
8        allow_empty_referer: bool,
9        allow_truncate_query_string: bool,
10        truncate_path: bool,
11        referer_list: Vec<&'a str>,
12        referer_blacklist: Vec<&'a str>,
13    }
14
15    impl<'a> Default for RefererConfigurationBuilder<'a> {
16        fn default() -> Self {
17            Self {
18                allow_empty_referer: true,
19                allow_truncate_query_string: true,
20                truncate_path: true,
21                referer_list: Vec::new(),
22                referer_blacklist: Vec::new(),
23            }
24        }
25    }
26
27    impl<'a> RefererConfigurationBuilder<'a> {
28        pub fn new() -> Self {
29            Self::default()
30        }
31
32        pub fn with_allow_empty_referer(mut self, value: bool) -> Self {
33            self.allow_empty_referer = value;
34            self
35        }
36
37        pub fn with_allow_truncate_query_string(mut self, value: bool) -> Self {
38            self.allow_truncate_query_string = value;
39            self
40        }
41
42        pub fn with_truncate_path(mut self, value: bool) -> Self {
43            self.truncate_path = value;
44            self
45        }
46
47        pub fn pust_referer(mut self, value: &'a str) -> Self {
48            self.referer_list.push(value);
49            self
50        }
51
52        pub fn with_referer_list(mut self, value: Vec<&'a str>) -> Self {
53            self.referer_list = value;
54            self
55        }
56
57        pub fn with_referer_blacklist(mut self, value: Vec<&'a str>) -> Self {
58            self.referer_blacklist = value;
59            self
60        }
61
62        pub fn build(&self) -> RefererConfiguration {
63            RefererConfiguration {
64                allow_empty_referer: self.allow_empty_referer,
65                allow_truncate_query_string: self.allow_truncate_query_string,
66                truncate_path: self.truncate_path,
67                referer_list: if self.referer_list.is_empty() {
68                    None
69                } else {
70                    Some(RefererList {
71                        referer: self
72                            .referer_list
73                            .iter()
74                            .map(|referer| Some(referer.to_string()))
75                            .collect(),
76                    })
77                },
78                referer_blacklist: if self.referer_blacklist.is_empty() {
79                    None
80                } else {
81                    Some(RefererBlacklist {
82                        referer: self
83                            .referer_blacklist
84                            .iter()
85                            .map(|referer| Some(referer.to_string()))
86                            .collect(),
87                    })
88                },
89            }
90        }
91    }
92}
93
94#[derive(Debug, Serialize, Deserialize, Default, Clone)]
95pub struct RefererList {
96    #[serde(rename = "Referer", skip_serializing_if = "Option::is_none")]
97    referer: Option<Vec<String>>,
98}
99
100#[derive(Debug, Serialize, Deserialize, Default, Clone)]
101pub struct RefererBlacklist {
102    #[serde(rename = "Referer", skip_serializing_if = "Option::is_none")]
103    referer: Option<Vec<String>>,
104}
105
106#[derive(Debug, Serialize, Deserialize, Default, Clone)]
107pub struct RefererConfiguration {
108    #[serde(rename = "AllowEmptyReferer")]
109    pub allow_empty_referer: bool,
110    #[serde(rename = "AllowTruncateQueryString")]
111    pub allow_truncate_query_string: bool,
112    #[serde(rename = "TruncatePath")]
113    pub truncate_path: bool,
114    #[serde(rename = "RefererList")]
115    pub referer_list: Option<RefererList>,
116    #[serde(rename = "RefererBlacklist")]
117    pub referer_blacklist: Option<RefererBlacklist>,
118}
119
120#[cfg(test)]
121pub mod tests {
122    use super::*;
123    #[test]
124    fn referer_configuration() {
125        let content = r#"<?xml version="1.0" encoding="UTF-8"?>
126<RefererConfiguration>
127  <AllowEmptyReferer>false</AllowEmptyReferer>
128  <AllowTruncateQueryString>true</AllowTruncateQueryString>
129  <TruncatePath>true</TruncatePath>
130  <RefererList>
131    <Referer>http://www.aliyun.com</Referer>
132    <Referer>https://www.aliyun.com</Referer>
133    <Referer>http://www.*.com</Referer>
134    <Referer>https://www.?.aliyuncs.com</Referer>
135  </RefererList>
136  <RefererBlacklist>
137    <Referer>http://www.refuse.com</Referer>
138    <Referer>https://*.hack.com</Referer>
139    <Referer>http://ban.*.com</Referer>
140    <Referer>https://www.?.deny.com</Referer>
141  </RefererBlacklist>
142</RefererConfiguration>"#;
143
144        let object: RefererConfiguration = quick_xml::de::from_str(&content).unwrap();
145        let left = "http://www.aliyun.com";
146        let right = &object.referer_list.unwrap().referer.unwrap()[0];
147        assert_eq!(left, right);
148    }
149}