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