xref: /xiu/protocol/rtmp/src/utils/mod.rs (revision ded9d193)
1 pub mod errors;
2 pub mod print;
3 
4 use errors::RtmpUrlParseError;
5 use errors::RtmpUrlParseErrorValue;
6 
7 #[derive(Debug, Clone, Default)]
8 pub struct RtmpUrlParser {
9     pub raw_url: String,
10     // raw_domain_name = format!("{}:{}",domain_name,port)
11     pub raw_domain_name: String,
12     pub domain_name: String,
13     pub port: String,
14     pub app_name: String,
15     // raw_stream_name = format!("{}?{}",stream_name,url_parameters)
16     pub raw_stream_name: String,
17     pub stream_name: String,
18     pub parameters: String,
19 }
20 
21 impl RtmpUrlParser {
new(url: String) -> Self22     pub fn new(url: String) -> Self {
23         Self {
24             raw_url: url,
25             ..Default::default()
26         }
27     }
28 
set_raw_stream_name(&mut self, raw_stream_name: String) -> &mut Self29     pub fn set_raw_stream_name(&mut self, raw_stream_name: String) -> &mut Self {
30         self.raw_stream_name = raw_stream_name;
31         self
32     }
33 
34     /*
35      example;rtmp://domain.name.cn:1935/app_name/stream_name?auth_key=test_Key
36      raw_domain_name: domain.name.cn:1935
37      domain_name: domain.name.cn
38      app_name: app_name
39      raw_stream_name: stream_name?auth_key=test_Key
40      stream_name: stream_name
41      url_parameters: auth_key=test_Key
42     */
parse_url(&mut self) -> Result<(), RtmpUrlParseError>43     pub fn parse_url(&mut self) -> Result<(), RtmpUrlParseError> {
44         if let Some(idx) = self.raw_url.find("rtmp://") {
45             let remove_header_left = &self.raw_url[idx + 7..];
46             let url_parts: Vec<&str> = remove_header_left.split('/').collect();
47             if url_parts.len() != 3 {
48                 return Err(RtmpUrlParseError {
49                     value: RtmpUrlParseErrorValue::Notvalid,
50                 });
51             }
52 
53             self.raw_domain_name = url_parts[0].to_string();
54             self.app_name = url_parts[1].to_string();
55             self.raw_stream_name = url_parts[2].to_string();
56 
57             self.parse_raw_domain_name()?;
58             self.parse_raw_stream_name();
59         } else {
60             return Err(RtmpUrlParseError {
61                 value: RtmpUrlParseErrorValue::Notvalid,
62             });
63         }
64 
65         Ok(())
66     }
67 
parse_raw_domain_name(&mut self) -> Result<(), RtmpUrlParseError>68     pub fn parse_raw_domain_name(&mut self) -> Result<(), RtmpUrlParseError> {
69         let data: Vec<&str> = self.raw_domain_name.split(':').collect();
70         self.domain_name = data[0].to_string();
71         if data.len() > 1 {
72             self.port = data[1].to_string();
73         }
74         Ok(())
75     }
76     /*parse the raw stream name to get real stream name and the URL parameters*/
parse_raw_stream_name(&mut self) -> (String, String)77     pub fn parse_raw_stream_name(&mut self) -> (String, String) {
78         let data: Vec<&str> = self.raw_stream_name.split('?').collect();
79         self.stream_name = data[0].to_string();
80         if data.len() > 1 {
81             self.parameters = data[1].to_string();
82         }
83         (self.stream_name.clone(), self.parameters.clone())
84     }
85 
append_port(&mut self, port: String)86     pub fn append_port(&mut self, port: String) {
87         if !self.raw_domain_name.contains(':') {
88             self.raw_domain_name = format!("{}:{}", self.raw_domain_name, port);
89             self.port = port;
90         }
91     }
92 }
93 
94 #[cfg(test)]
95 mod tests {
96 
97     use super::RtmpUrlParser;
98     #[test]
test_rtmp_url_parser()99     fn test_rtmp_url_parser() {
100         let mut parser = RtmpUrlParser::new(String::from(
101             "rtmp://domain.name.cn:1935/app_name/stream_name?auth_key=test_Key",
102         ));
103 
104         parser.parse_url().unwrap();
105 
106         println!(" raw_domain_name: {}", parser.raw_domain_name);
107         println!(" port: {}", parser.port);
108         println!(" domain_name: {}", parser.domain_name);
109         println!(" app_name: {}", parser.app_name);
110         println!(" raw_stream_name: {}", parser.raw_stream_name);
111         println!(" stream_name: {}", parser.stream_name);
112         println!(" url_parameters: {}", parser.parameters);
113     }
114     #[test]
test_rtmp_url_parser2()115     fn test_rtmp_url_parser2() {
116         let mut parser =
117             RtmpUrlParser::new(String::from("rtmp://domain.name.cn/app_name/stream_name"));
118 
119         parser.parse_url().unwrap();
120 
121         println!(" raw_domain_name: {}", parser.raw_domain_name);
122         println!(" port: {}", parser.port);
123         println!(" domain_name: {}", parser.domain_name);
124         println!(" app_name: {}", parser.app_name);
125         println!(" raw_stream_name: {}", parser.raw_stream_name);
126         println!(" stream_name: {}", parser.stream_name);
127         println!(" url_parameters: {}", parser.parameters);
128     }
129 }
130