titan_http/request/
parser_from_str.rs

1use std::str::FromStr as _;
2
3use super::Request;
4use http::{Error, HeaderMap, HeaderValue, Method, Uri};
5
6pub struct HttpRequestExt(pub Request);
7
8impl From<String> for HttpRequestExt {
9  fn from(value: String) -> Self {
10    HttpRequestExt(from_string(value).unwrap())
11  }
12}
13
14fn format_headers(
15  iter: impl Iterator<Item = String>,
16) -> HeaderMap<HeaderValue> {
17  let formated = iter.filter_map(|line| {
18    let mut parts: Vec<&str> = line.split(": ").collect();
19    let key = parts.remove(0);
20
21    match key.parse() {
22      Ok(key) => Some((key, parts[0].to_string().parse().unwrap())),
23      Err(_err) => None,
24    }
25  });
26
27  HeaderMap::from_iter(formated)
28}
29
30fn from_string(str_request: String) -> Result<Request, Error> {
31  let mut http_req: Vec<String> =
32    str_request.split('\n').map(|v| v.to_string()).collect();
33
34  let http_meta = http_req.swap_remove(0);
35  let parts: Vec<&str> = http_meta.split_whitespace().collect();
36
37  let method = Method::from_str(parts[0]).unwrap();
38  let uri = Uri::from_str(parts[1]).unwrap();
39
40  let headers = format_headers(http_req.into_iter());
41
42  let mut req_builder = http::Request::builder().uri(uri).method(method);
43
44  *req_builder.headers_mut().unwrap() = headers;
45
46  req_builder.body([].into())
47}