[rust] 将合法http字符串切片转换为hyper::Request结构的方法
/// use to covert **valid** http str to `hyper::Request`
///
/// example
/// ```rust
/// let listener = TcpListener::bind("localhost:8080").unwrap();
/// for stream in listener.incoming() {
/// let mut stream = stream.unwrap();
/// let mut buffer = String::new();
/// stream.read_to_string(&mut buffer).unwrap();
/// let req = covert_str_to_request(buffer.as_str());
/// println!("{req:#?}");
/// }
/// ```
fn covert_str_to_request(s: &str) -> hyper::Request<Option<&str>> {
let mut lines = s.lines();
let line = lines.next().expect("");
let mut line_attrs = line.split(' ');
let mut builder = hyper::Request::builder();
if let Some(attr) = line_attrs.next() {
builder = builder.method(hyper::Method::from_str(attr).expect("expect in setting method"));
}
if let Some(attr) = line_attrs.next() {
builder = builder.uri(attr);
}
if let Some(attr) = line_attrs.next() {
builder = builder.version(match attr {
"HTTP/0.9" => hyper::Version::HTTP_09,
"HTTP/1.0" => hyper::Version::HTTP_10,
"HTTP/2.0" => hyper::Version::HTTP_2,
"HTTP/3.0" => hyper::Version::HTTP_3,
_ => hyper::Version::default()
});
}
while let Some(line) = lines.next() {
if line.is_empty() {
break;
}
let pair = line.split_once(':').expect("");
builder = builder.header(pair.0, pair.1);
}
if let Some(body_str) = lines.next() {
builder.body(Some(body_str)).expect("")
} else {
builder.body(None).expect("")
}
}