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