reqwest-header 0.1.0

Header info parser for reqwest crate
Documentation
use reqwest::header::HeaderMap;

#[derive(Debug,Clone,Default)]
pub struct HeaderInfo{
    pub method:String,
    pub url:String,
    pub header:HeaderMap
}
impl  HeaderInfo{
    fn new(method:String,url:String,header:HeaderMap)->Self{
        Self { method, url,header }
    }
}
/// ## parse info to reqwest header
///```rust
/// let req = r##"
/// GET / HTTP/1.1
/// Host: crates.io
/// Upgrade-Insecure-Requests: 1
/// User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.119 Safari/537.36
/// Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
/// Referer: https://crates.io/
/// Accept-Encoding: gzip, deflate
/// Accept-Language: en-US,en;q=0.9
/// Connection: close
/// "##;
/// let info = parse_to_reqwest_header(req).unwrap();
/// let method = info.method;
/// let url = info.url;
/// let header = info.header;
///
/// ```
pub fn parse_to_reqwest_header(header:&str) -> Result<HeaderInfo, Box<dyn std::error::Error>> {
    use reqwest::header::HeaderValue;
    use reqwest::header::HeaderName;
    macro_rules! split_to_vec {
        ($a:expr,$b:expr) => {
            $a.to_string()
                .split($b)
                .filter(|s| !s.is_empty())
                .map(|s| s.to_string().trim().to_owned())
                .collect::<Vec<String>>()
        };
    }
        let methods = split_to_vec!(header, "\n")
        .first()
        .expect("get method error")
        .to_string()
        .to_owned();
    let method_vec = split_to_vec!(methods, " ");
    let method = method_vec.clone().into_iter().nth(0).unwrap();
    let header_vec = split_to_vec!(header, "\n")
        .into_iter()
        .skip(1)
        .filter(|s| !s.is_empty())
        .map(|s| split_to_vec!(s.to_string().trim().to_owned(), ": "))
        .collect::<Vec<Vec<String>>>();

    let mut header = HeaderMap::new();
    for h in header_vec.clone().into_iter() {
        let k = h.clone().into_iter().nth(0).unwrap();
        let v = h.clone().into_iter().nth(1).unwrap();
        header.insert(HeaderName::from_bytes(k.as_bytes()).unwrap(), HeaderValue::from_bytes(v.as_bytes()).unwrap());
    }
    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();
    let forword_path = method_vec.get(1).unwrap().to_string();
    let url = format!("https://{}{}",host,forword_path);
    Ok(HeaderInfo::new(method, url, header))
}