reqwest_header/
lib.rs

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}
14/// ## parse info to reqwest header
15///```rust
16/// let req = r##"
17/// GET / HTTP/1.1
18/// Host: crates.io
19/// Upgrade-Insecure-Requests: 1
20/// 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
21/// 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
22/// Referer: https://crates.io/
23/// Accept-Encoding: gzip, deflate
24/// Accept-Language: en-US,en;q=0.9
25/// Connection: close
26/// "##;
27/// let info = parse_to_reqwest_header(req).unwrap();
28/// let method = info.method;
29/// let url = info.url;
30/// let header = info.header;
31///
32/// ```
33pub 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}