1use reqwest::header::HeaderMap;
2
3#[derive(Debug,Clone,Default)]
4pub struct HeaderInfo{
5 pub method:String,
6 pub url:String,
7 pub header:HeaderMap
8}
9impl HeaderInfo{
10 fn new(method:String,url:String,header:HeaderMap)->Self{
11 Self { method, url,header }
12 }
13}
14pub fn parse_to_reqwest_header(header:&str) -> Result<HeaderInfo, Box<dyn std::error::Error>> {
34 use reqwest::header::HeaderValue;
35 use reqwest::header::HeaderName;
36 macro_rules! split_to_vec {
37 ($a:expr,$b:expr) => {
38 $a.to_string()
39 .split($b)
40 .filter(|s| !s.is_empty())
41 .map(|s| s.to_string().trim().to_owned())
42 .collect::<Vec<String>>()
43 };
44 }
45 let methods = split_to_vec!(header, "\n")
46 .first()
47 .expect("get method error")
48 .to_string()
49 .to_owned();
50 let method_vec = split_to_vec!(methods, " ");
51 let method = method_vec.clone().into_iter().nth(0).unwrap();
52 let header_vec = split_to_vec!(header, "\n")
53 .into_iter()
54 .skip(1)
55 .filter(|s| !s.is_empty())
56 .map(|s| split_to_vec!(s.to_string().trim().to_owned(), ": "))
57 .collect::<Vec<Vec<String>>>();
58
59 let mut header = HeaderMap::new();
60 for h in header_vec.clone().into_iter() {
61 let k = h.clone().into_iter().nth(0).unwrap();
62 let v = h.clone().into_iter().nth(1).unwrap();
63 header.insert(HeaderName::from_bytes(k.as_bytes()).unwrap(), HeaderValue::from_bytes(v.as_bytes()).unwrap());
64 }
65 let host = header_vec.clone().into_iter().filter(|s|s.get(0).unwrap().to_string()=="Host".to_string()).map(|s|s.get(1).unwrap().to_string()).into_iter().nth(0).unwrap().to_string();
66 let forword_path = method_vec.get(1).unwrap().to_string();
67 let url = format!("https://{}{}",host,forword_path);
68 Ok(HeaderInfo::new(method, url, header))
69}