[rust] 將合法http字符串切片轉(zhuǎn)換為hyper::Request結(jié)構(gòu)的方法
/// 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("")
? ?}
}