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 }
}
}
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))
}