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