titan_http/request/
parser_from_str.rs1use 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}