xt_oss/oss/entities/
referer.rs1use 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}